TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Tormentor100 en 04 de Noviembre de 2010, 17:45:53
-
Hola amigos, estoy trabajando con un programa que mide el voltaje con ayuda de un potenciometro (y tambien muestra la hora) en una pantalla lcd.. quiero pasar la información del voltaje del primer micro al segundo por puerto serie, pero no encuentro el modo, espero alguien me pueda ayudar, saludos!
aqui esta el codigo que tengo
#if defined(__PCM__)
#include <16F874.h>
//#device adc=10 //Resolución del convertidor análogo de 10 bits
#device adc=8 //Resolución del convertidor análogo de 8 bits
#fuses XT,NOWDT,NOPROTECT,NOLVP
#endif
#byte PORTB= 0X06
#byte TRISB= 0X86
#byte PORTC= 0X07
#byte TRISC= 0X87
#byte PORTD= 0X08
#byte TRISD= 0X88
#use Delay(Clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)//Config. del puerto serie
int seg=0,min=0,hor=0,flag=0,minut,hora, CONTADOR;
unsigned int dato,entero,residuo,decimal;
long longdato,aux;
#include<lcd.c>
// *********************************
//*************** PUERTO SERIE *******************
#INT_RDA //Rutina de servicio de Interrupcion por RX
void serial_isr()
{
dato=getc(); //Se lee el dato recibido por el puerto serie
output_d(dato); /Se muestra por el puerto RB
}
//*************************************************
void conv_voltaje(void);
#INT_EXT
Void int_isr(void) {
ext_int_edge(H_TO_L);
if( flag==0 ){
flag=1;
DISABLE_INTERRUPTS(INT_TIMER1);
}
else{
flag=0;
ENABLE_INTERRUPTS(INT_TIMER1);
}
}
#INT_RB //Rutina de servicio de interrupción
Void intrB_isr(void) {
ext_int_edge(H_TO_L);
delay_ms(250);
if(input(pin_b4)==0){
min=min+1;
if(min==60)
min=0;
}
if(input(pin_b5)==0){
hor=hor+1;
if(hor==24)
hor=0;
}
printf(lcd_putc,"\freloj:%d:%d:%d",hor,min,seg);
}
#INT_TIMER1 //Rutina de servicio de interrupción
Void clock_isr(void) {
//Ajuste de 15535 a 15559 para aproximarlo al 1 seg
SET_TIMER1(15556);
CONTADOR=CONTADOR+1; //Utilice el StopWatch en el simulador para verificarlo
if(CONTADOR==10){
CONTADOR=0;
seg=seg+1;
printf(lcd_putc,"\freloj:%d:%d:%d",hor,min,seg);
if(seg==59){
seg=0; //<-- Ponga aquí el Breakpoint para checar
min=min+1;
if(min==59){
min=0;
hor=hor+1;
if(hor==23)
hor=0;
}
}
}
}
void main(void) {
set_tris_c(0xBF); //RC= 1011 1111, Tx=0(salida),Rx=1(entrada)
set_tris_a(0xFF);
set_tris_d(0x00);
set_tris_b(0xFF);
setup_adc_ports(ALL_Analog);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
lcd_init();
delay_ms(6);
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_2);
SET_TIMER1(15536); //65536-15536=50000 cuentas para el sobreflujo
//En teoria 2*50000*10=1,000,000 Microseg
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL |INT_EXT |INT_RB );
enable_interrupts(INT_RDA); //Habilitamos la interrupcion por RX
enable_interrupts(GLOBAL); //Habilitamos el bit Global
/* VDD and VSS references */
while(1){
delay_ms(250);
dato=read_adc();
conv_voltaje();
lcd_gotoxy(1,2);
printf(lcd_putc,"\aVolts=%d.%d",entero,decimal);
delay_ms(1000); //Retardo de 1 segundo
if (!input(PIN_C0)){ //Si el bit 0 del Puerto C es 0 se hace trasmisión
output_high(PIN_B0); //Prendemos el Led 0
delay_ms(1000); //Retardo de 1 segundo
output_low(PIN_B0); //Apagamos el Led 0
printf(" dato:%", dato);
}
}
}
void conv_voltaje(void)
{
aux=longdato=dato;
longdato=(longdato*5)/255;
entero=longdato;
aux=(aux*5)%255;
aux=aux*10;
aux=aux/255;
decimal=aux;
}
y esto es lo que me muestra el proteus... no copia el voltaje
(http://img255.imageshack.us/img255/4548/53875519.jpg)
-
Hola, antes que nada tienes que cruzar los cables, o sea, el TX del PIC1 al RX del PIC2 y RX del PIC1 al TX del PIC2. De lo contrario lo que haces es enviar un dato a la salida del otro PIC.
Después tienes que hacer una especie de protocolo para enviar y recibir los datos para que, cuando el segundo PIC reciba los datos, los presente en el display.
saludos.