Hola a todos. Soy nuevo en el foro, aunque hace bastante que los sigo, es la primera vez que escribo.
Soy ingeniero electrónico y no hace mucho empecé a programar PIC.
Les cuento que estoy realizando un proyecto con PIC, el cual debe contar meses.
Utilizo un reloj de 125KHZ interno, ya que debo tener bajo consumo en el integrado, lo voy a alimentar con pilas.
Cada vez que pase algún día debo grabar en la memoria interna del PIC, la cantidad de días y meses que transcurrió.
La idea mía es que para corroborar el funcionamiento de que los días contados son los correctos, envié estos datos por la interfaz serie del PIC.
Para esto me compre un conversor USB- TTL para conectar el PIC directamente a la PC, sin utilizar el MAX232.
El problema que tengo, es que me envía basura el PIC, una vez que defino el oscilador interno. Esto me dí cuenta porque por cada línea puse un printf para saber en que momento falla.
Observen el código y me van a entender.
Me parece que el problema es la velocidad de reloj interno, que no llega a transmitir.
¿Alguien pudo hacer funcionar con el reloj de 125khz el puerte serie?
Utilizo Hyperterminal, con la velocidad de 1200. Probé también con velocidad de 300 y no funcionó.
Captura de lo que recibo.
Gracias y saludos.
Soy ingeniero electrónico y no hace mucho empecé a programar PIC.
Les cuento que estoy realizando un proyecto con PIC, el cual debe contar meses.
Utilizo un reloj de 125KHZ interno, ya que debo tener bajo consumo en el integrado, lo voy a alimentar con pilas.
Cada vez que pase algún día debo grabar en la memoria interna del PIC, la cantidad de días y meses que transcurrió.
La idea mía es que para corroborar el funcionamiento de que los días contados son los correctos, envié estos datos por la interfaz serie del PIC.
Para esto me compre un conversor USB- TTL para conectar el PIC directamente a la PC, sin utilizar el MAX232.
El problema que tengo, es que me envía basura el PIC, una vez que defino el oscilador interno. Esto me dí cuenta porque por cada línea puse un printf para saber en que momento falla.
Observen el código y me van a entender.
PHP:
#include <16f886.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc,CLKOUT
#FUSES PUT // Power Up Timer
#FUSES MCLR //Master Clear pin used for I/O
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#use delay(internal=125khz) //OSC interno
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)// preguntar si esta bien la velocidad
#include <internal_eeprom.c>
#BYTE ADRESL = 0x9e
#BYTE ADRESH = 0x1e
#BYTE ADCON0 = 0X1F
#BYTE ADCON1 = 0X9F
int1 flanco_detectormemoria=0,grabo=0;
int8 Segundos=0,Minutos=0, Hora=0, Dias=0 , Mes=0,Mes_aux=0;
#int_timer1
void timer_1()
{
clear_interrupt(int_timer1); // Limpiar flag por desborde del TMR1
Segundos++;
output_high(PIN_B0);
set_timer1(58550); //Esto se hara cada 1 seg
//if(Segundos == 60){Segundos=0;Minutos++;}
}
void sonaralarma(){
int8 i=0;
output_high(PIN_A1);
while(i<10){
output_high(PIN_A2);
delay_ms(500);
output_low(PIN_A2);
i++;
}
}
void main()
{
printf("comienso11\n\r");
setup_oscillator(OSC_125KHZ); //OSC_31KHZ
printf("comienso22\n\r");
setup_oscillator(OSC_INTRC); //OSCCON = 00000011;
printf("comienso33\n\r");
set_tris_a(0b11111000); // ENTRADAS= RA7 RA6 RA5 RA4 RA3 SALIDAS= RA2 RA1 RA0
printf("comienso44\n\r");
set_tris_b(0b11110000); // ENTRADAS= RB7 RB6 RB5 RB4 SALIDAS= RB3 RB2 RB1 RB0
printf("comienso55\n\r");
setup_adc(ADC_CLOCK_INTERNAL);
printf("comienso66\n\r");
setup_adc_ports(sAN8);// VER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
printf("comienso77\n\r");
output_b(0b0); //Se inicializa en 0
printf("comienso88\n\r");
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
printf("comienso99\n\r");
enable_interrupts(int_timer1); //Habilita interrupcion del Timer 1
printf("comienso100\n\r");
enable_interrupts(global); // Habilita interrupcion Global
printf("comienso110011\n\r");
set_timer1(58550); // Carga el TMR1 con 57786
output_low(PIN_A2);
//-----------------Comienzo Programa--------------------
printf("hola mundooo11\n\r");
if (input(PIN_B4) == 0 && input(PIN_B5) ==0 && input(PIN_B6) ==0 && input(PIN_B7) ==0){ flanco_detectormemoria=0; setup_timer_1(T1_DISABLED);grabo=0; //Reinicio Memoria del contador.
}
else{ if(input(PIN_B4) == 0 && input(PIN_B5) ==0 && input(PIN_B6) ==0 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =1;} //1 Mes
if(input(PIN_B4) == 0 && input(PIN_B5) ==0 && input(PIN_B6) ==1 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =2;} //2 Meses
if(input(PIN_B4) == 0 && input(PIN_B5) ==0 && input(PIN_B6) ==1 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =3;} //3 Meses
if(input(PIN_B4) == 0 && input(PIN_B5) ==1 && input(PIN_B6) ==0 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =4;} //4 Meses
if(input(PIN_B4) == 0 && input(PIN_B5) ==1 && input(PIN_B6) ==0 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =5;} //5 Meses
if(input(PIN_B4) == 0 && input(PIN_B5) ==1 && input(PIN_B6) ==1 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =6;} //6 Meses
if(input(PIN_B4) == 0 && input(PIN_B5) ==1 && input(PIN_B6) ==1 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =7;} //7 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==0 && input(PIN_B6) ==0 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =8;} //8 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==0 && input(PIN_B6) ==0 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =9;} //9 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==0 && input(PIN_B6) ==1 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =10;} //10 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==0 && input(PIN_B6) ==1 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =11;} //11 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==1 && input(PIN_B6) ==0 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =12;} //12 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==1 && input(PIN_B6) ==0 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =13;} //13 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==1 && input(PIN_B6) ==1 && input(PIN_B7) ==0){flanco_detectormemoria=1;Mes_aux =14;} //14 Meses
if(input(PIN_B4) == 1 && input(PIN_B5) ==1 && input(PIN_B6) ==1 && input(PIN_B7) ==1){flanco_detectormemoria=1;Mes_aux =15;} //15 Meses
}
printf("hola mundooo22\n\r");
grabo=read_int1_eeprom(0x0,00);// acomodomar para leer 1 bit
if (grabo ==0){
Mes=read_eeprom(0x02);
Dias=read_eeprom(0x03);
}
//if (Mes_aux < Mes){ sonaralarma();
//}
printf("hola mundooo33\n\r");
while(flanco_detectormemoria==1) // Comienza solo si se selecciono un mes
{
output_high(PIN_A0);
output_low(PIN_B0);
output_low(PIN_A1);
if (Segundos == 60){Minutos++;Segundos=0;sonaralarma();}
if (Minutos == 60){Hora++;Minutos=0;}
if(Hora == 24){Dias++;Hora=0;grabo=1;write_int1_eeprom(0x0,00,grabo);write_eeprom(0x02,Mes);write_eeprom(0x03,Dias);}// write_eeprom(0x50, Dias); Cuando pase un dia debo grabar. cuando se corte y vuelva a conectar debo ver estado de swicht
if(Dias ==30){Mes++;Dias=0;}
if(Mes == Mes_aux){ sonaralarma();
}
}
}
¿Alguien pudo hacer funcionar con el reloj de 125khz el puerte serie?
Utilizo Hyperterminal, con la velocidad de 1200. Probé también con velocidad de 300 y no funcionó.
Captura de lo que recibo.
Gracias y saludos.
Adjuntos
Última edición por un moderador: