TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pachomil en 27 de Octubre de 2010, 17:09:38
-
hola a todos
estoy haciendo un programa para un pic 18f2550, el problema es que lo simulo en proteus y me funciona muy bien pero al pasarlo al pic no me hace nada, pense que era el pic entonces lo programe con assambler y si me funciono, les paso el codigo aver quien me puede ayudar, ahh estoy usando un quemador pic kit2.
#include <18F2550.h> //pic a utilizar
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
//#use spi(DI=PIN_B0, DO=PIN_B3, CLK=PIN_B1, ENABLE=PIN_B4, SAMPLE_RISE, MSB_FIRST, BITS=32)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N,BITS=8,) //ERRORS,stream=RF,disable_ints)//Mediante HW
//#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7)
#use fast_io(B)
/////////////////////////////////constantes
#define leer "AT+CMGR="
#define program "AT+IPR=9600"
#define program_1 "AT+IFC=0,0"
#define texto "AT+CMGF=1"
#define borrar "AT+CMGD="
//#define output_low = apaga
//#define output_high= prende
/////////////////////////////////vaiables utiles
int num_uno=1;
int num_dos=2;
int num_tres=3;
int num_cuatro=4;
int num_cinco=5;
int num_seis=6;
int x=0;
/////////////////////////////////variables de clave
char clave_1=0x31;
char clave_2=0x32;
char clave_3=0x33;
char clave_4=0x34;
char clave_grabada=0x30;
/////////////////////////////////variables del mensaje de texto
char CH[115];
/////////////////////////////////variables de posicion en memoria eeprom
char cero=0;
char uno=1;
char dos=2;
char tres=3;
char cuatro=4;
char cinco=5;
char seis=6;
char siete=7;
char ocho=8;
char nueve=9;
/////////////////////////////////variables del contador de rb0
char conta_1=0;
char conta_2=0;
char conta_3=0;
char conta_4=0;
char conta_5=0;
#int_rda //interrupcion de usart
void serial_isr() {
gets(ch);
puts (ch);
}
void grabar_clave(){
clave_grabada=1;
write_eeprom(cinco,clave_1); //guardo clave de configuracion
write_eeprom(seis,clave_2);
write_eeprom(siete,clave_3);
write_eeprom(ocho,clave_4);
write_eeprom(nueve,clave_grabada);
}
void leer_clave(){
clave_1=read_EEPROM(cinco);
clave_2=read_EEPROM(seis);
clave_3=read_EEPROM(siete);
clave_4=read_EEPROM(ocho);
//return
}
#int_ext //interrupcion de rb0
void ext_isr()
{
//#use rs232(baud=9600, xmit=PIN_C2)
conta_1=read_EEPROM(cero); //leo la memoria de los contadores
conta_5=read_EEPROM(uno);
conta_2=read_EEPROM(dos);
conta_3=read_EEPROM(tres);
conta_4=read_EEPROM(cuatro);
conta_1++; //incremento los contadores
if( conta_1== 10) conta_1=0, conta_2++;
if (conta_2==10)conta_2=0, conta_3++;
if (conta_3==10) conta_3=0, conta_4++;
if (conta_4==10) conta_4=0, conta_5++;
if (conta_5==10) conta_5=0;
write_eeprom(cero,conta_1); //guardo contadores en la memoria
write_eeprom(uno,conta_1);
write_eeprom(dos,conta_1);
write_eeprom(tres,conta_1);
write_eeprom(cuatro,conta_1);
write_eeprom(cuatro,conta_5);
puts(conta_5);
printf("%x ",conta_5), //mando los contadores al visor
printf("%x ",conta_4),
printf("%x ",conta_3),
printf("%x ",conta_2),
printf("%x ",conta_1);
}
////////////////////////PROGRAMA PRINCIPAL///////////////////////////////////////////////////////////////////////
void main () {
//#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N,BITS=8,ERRORS,stream=RF,disable_ints)//Mediante HW
set_tris_b(0x01);
set_tris_a(0xff);
//enable_interrupts(int_rda);
output_low(pin_B7);
port_b_pullups(true);
//enable_interrupts(int_ext);
//ext_int_edge(h_to_l);
//enable_interrupts(GLOBAL);;
output_low(PIN_A5);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(500);
printf(program);
delay_ms(500);
printf("\r\n"program_1);
delay_ms(500);
printf("\r\n"texto);
delay_ms(500);
printf("\r\n"borrar), printf("%u",num_uno);
output_low(PIN_C5);
delay_ms(1000);
output_high(PIN_C5);
delay_ms(1000);
clave_grabada=read_EEPROM(nueve);
if (clave_grabada!=0x31)grabar_clave();
/*write_eeprom(cinco,clave_1); //graba la clave en memoria eeprom del pic
write_eeprom(seis,clave_2);
write_eeprom(siete,clave_3);
write_eeprom(ocho,clave_4);
*/
do{
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
if(CH[10]==0x4D) leer_clave(), printf(leer), printf("%u",num_uno), ch[10]=0x00,x=1 ; // lee mensaje
}
WHILE (x!=1);
/*
for (;;)
{
if(ch[0]==clave_1) if(ch[1]==clave_2) if(ch[2]==clave_3) if(ch[3]==clave_4) if(ch[4]==clave_4) if(ch[5]==clave_4)
clave_1=ch[6], clave_2=ch[7], clave_3=ch[8], clave_4=ch[9], grabar_clave(),
printf(clave_1),
printf(clave_2),
printf(clave_3),
printf(clave_4);
}
*/
}
gracias por la ayuda que me puedan dar
-
Hola pachomil, no he revisado tu programa a fondo, pero como veo que no estás usando el USB del PIC, mejor utiliza estos fuses y este encabezado en el main() de tu programa y asi te puedes evitar algunos problemas:
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz FOR PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode FOR ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOIESO //Internal External SWITCH Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLPT1OSC //Timer1 configured FOR higher power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV1 //No System Clock Postscaler
#FUSES NOUSBDIV //USB clock source comes from primary oscillator
#FUSES NOVREGEN //USB voltage regulator disabled
#use delay(clock=20000000)
//#use spi(DI=PIN_B0, DO=PIN_B3, CLK=PIN_B1, ENABLE=PIN_B4, SAMPLE_RISE, MSB_FIRST, BITS=32)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N,BITS=8,) //ERRORS,stream=RF,disable_ints)//Mediante HW
//#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7)
#use fast_io(B)
/////////////////////////////////constantes
#define leer "AT+CMGR="
#define program "AT+IPR=9600"
#define program_1 "AT+IFC=0,0"
#define texto "AT+CMGF=1"
#define borrar "AT+CMGD="
//#define output_low = apaga
//#define output_high= prende
/////////////////////////////////vaiables utiles
int num_uno=1;
int num_dos=2;
int num_tres=3;
int num_cuatro=4;
int num_cinco=5;
int num_seis=6;
int x=0;
/////////////////////////////////variables de clave
char clave_1=0x31;
char clave_2=0x32;
char clave_3=0x33;
char clave_4=0x34;
char clave_grabada=0x30;
/////////////////////////////////variables del mensaje de texto
char CH[115];
/////////////////////////////////variables de posicion en memoria eeprom
char cero=0;
char uno=1;
char dos=2;
char tres=3;
char cuatro=4;
char cinco=5;
char seis=6;
char siete=7;
char ocho=8;
char nueve=9;
/////////////////////////////////variables del contador de rb0
char conta_1=0;
char conta_2=0;
char conta_3=0;
char conta_4=0;
char conta_5=0;
#INT_rda //interrupcion de usart
void serial_isr()
{
gets(ch);
puts (ch);
}
void grabar_clave()
{
clave_grabada=1;
write_eeprom(cinco,clave_1); //guardo clave de configuracion
write_eeprom(seis,clave_2);
write_eeprom(siete,clave_3);
write_eeprom(ocho,clave_4);
write_eeprom(nueve,clave_grabada);
}
void leer_clave()
{
clave_1=read_EEPROM(cinco);
clave_2=read_EEPROM(seis);
clave_3=read_EEPROM(siete);
clave_4=read_EEPROM(ocho);
//RETURN
}
#INT_ext //interrupcion de rb0
void ext_isr()
{
//#use rs232(baud=9600, xmit=PIN_C2)
conta_1=read_EEPROM(cero); //leo la memoria de los contadores
conta_5=read_EEPROM(uno);
conta_2=read_EEPROM(dos);
conta_3=read_EEPROM(tres);
conta_4=read_EEPROM(cuatro);
conta_1++; //incremento los contadores
IF( conta_1== 10) conta_1=0, conta_2++;
IF (conta_2 == 10) conta_2 = 0, conta_3++;
IF (conta_3 == 10) conta_3 = 0, conta_4++;
IF (conta_4 == 10) conta_4 = 0, conta_5++;
IF (conta_5 == 10) conta_5 = 0;
write_eeprom(cero,conta_1); //guardo contadores en la memoria
write_eeprom(uno,conta_1);
write_eeprom(dos,conta_1);
write_eeprom(tres,conta_1);
write_eeprom(cuatro,conta_1);
write_eeprom(cuatro,conta_5);
puts(conta_5);
printf("%x ",conta_5), //mando los contadores al visor
printf("%x ",conta_4),
printf("%x ",conta_3),
printf("%x ",conta_2),
printf("%x ",conta_1);
}
////////////////////////PROGRAMA PRINCIPAL///////////////////////////////////////////////////////////////////////
void main ()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//#USE RS232 (BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7, PARITY = N, BITS = 8, ERRORS, stream = RF, disable_ints) //Mediante HW
set_tris_b (0x01) ;
set_tris_a (0xff) ;
output_low (pin_B7) ;
port_b_pullups (true) ;
output_low (PIN_A5) ;
output_low (PIN_B5) ;
output_low (PIN_B6) ;
output_low (PIN_B7) ;
delay_ms (500) ;
printf (program) ;
delay_ms (500) ;
printf ("\r\n"program_1) ;
delay_ms (500) ;
printf ("\r\n"texto) ;
delay_ms (500) ;
printf ("\r\n"borrar), printf (" %u", num_uno);
output_low (PIN_C5) ;
delay_ms (1000) ;
output_high (PIN_C5) ;
delay_ms (1000) ;
clave_grabada = read_EEPROM (nueve) ;
IF (clave_grabada != 0x31) grabar_clave ();
/* write_eeprom (cinco, clave_1); //graba la clave en memoria eeprom del pic
write_eeprom (seis, clave_2) ;
write_eeprom (siete, clave_3) ;
write_eeprom (ocho, clave_4) ;
*/
DO
{
//#use rs232 (baud = 9600, xmit = PIN_C6, rcv = PIN_C7)
IF (CH[10] == 0x4D) leer_clave (), printf (leer), printf (" %u", num_uno), ch[10] = 0x00, x = 1; // lee mensaje
}
WHILE (x != 1);
/*
FOR (;
{
IF (ch[0] == clave_1) if (ch[1] == clave_2) if (ch[2] == clave_3) if (ch[3] == clave_4) if (ch[4] == clave_4) if (ch[5] == clave_4)
clave_1 = ch[6], clave_2 = ch[7], clave_3 = ch[8], clave_4 = ch[9], grabar_clave (),
printf (clave_1),
printf (clave_2) ,
printf (clave_3) ,
printf (clave_4) ;
}
*/
}
Saludos!
-
gracias bmb
lo voy a probar y le cuento como me fue muchas gracias por la ayuda
-
BMB GRACIAS
si ya me funciono en el pic y pues el programa ya me toca ir depurandolo para lograr lo que estoy haciendo gracias
por la ayuda