Autor Tema: 18F4550 AYUDA!!  (Leído 6048 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
18F4550 AYUDA!!
« en: 16 de Octubre de 2018, 19:28:33 »
Buenas gente, vengo a este foro porque se me presento un problemita  :oops: con este PIC. Bueno hay les va:

Quiero hacer que el micro almacene los códigos para llaves "i-button". Pero no esta tan fácil, de hecho tengo un código para el 16F877 y funciona bien ( lo se porque muestro el código en una LCD para verificar ), pero en el momento que intento hacer para el 18F4550, me aparecen solos "FFFFFF" en todos los caracteres. Ojo estoy usando una memoria externa la (24512). pero esta vez quiero que el PIC reciba ese código por Wi-Fi (usando un modulo Wi-Fi que se comunica por el PIC con I2C), por favor ayuda!!!

Adjunto lo que llevo del código hasta ahora:
Código: C
  1. #include<18f4550.h>
  2. #fuses PLL1           //No PLL PreScaler
  3. #fuses CPUDIV1        //No System Clock Postscaler
  4. #fuses NOWDT        //No Watch Dog Timer
  5. #fuses HS           //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #fuses NOLVP        //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O  
  7. #fuses NOBROWNOUT   //No brownout reset
  8. #fuses NOPUT        //No Power Up Timer
  9. #fuses NOCPD        //No EE protection
  10. #fuses NOWRT        //Program memory not write protected
  11. #fuses NOPROTECT    //Code not protected from reading
  12. #fuses NODEBUG      //No Debug mode for ICD
  13. #fuses NOVREGEN       //USB voltage regulator disabled    
  14. #use delay (clock=20M)                                      
  15. #define LCD_ENABLE_PIN  PIN_D3                                    ////
  16. #define LCD_RS_PIN      PIN_D1      
  17. #define LCD_RW_PIN      PIN_D2                                    ////
  18. #define LCD_DATA4       PIN_D4                                    ////
  19. #define LCD_DATA5       PIN_D5                                    ////
  20. #define LCD_DATA6       PIN_D6                                    ////
  21. #define LCD_DATA7       PIN_D7                                    ////  
  22. /#define EEPROM_SDA  PIN_B0       //
  23. /#define EEPROM_SCL  PIN_B1            
  24. #include <24512.c>
  25. #include <lcd.c>                          
  26. #include <touch.c>        
  27. int8 Llave[8];              
  28. int8 valor;                  
  29. #INT_EXT                    
  30. void cambioB2(){                                                                                        
  31.    init_ext_eeprom();                                                  
  32.    valor=read_ext_eeprom(0);    
  33.    touch_write_byte(0x33);  
  34.    for(int i=0;i<8;i++){                                                      
  35.        Llave[i]=touch_read_byte();  
  36.             }
  37.    printf(lcd_putc,"\fFlia: %2x CRC: %2X\nid: ",Llave[0],Llave[7]);
  38.    for(i=1;i<7;i++){    
  39.    printf(lcd_putc,"%2X",Llave[7-i]);              
  40.          }                                
  41.    write_ext_eeprom(0,Llave[i]);        
  42. }                                                                      
  43. void main(){                                
  44.    enable_interrupts(GLOBAL);                                                                                  
  45.    enable_interrupts(INT_EXT);                                  
  46.    ext_int_edge(0,H_TO_L);                    
  47.    cambioB2();                                                                                                                      
  48.    lcd_init();                            
  49.    printf(lcd_putc,"Inserte Llave");
  50.    while(true){                                                  
  51.       if(touch_present()==1){                                                                              
  52.          printf(lcd_putc,"\fLlave Insertada");                      
  53.          touch_write_byte(0x33);                
  54.       }  
  55.    }
  56. }
« Última modificación: 16 de Octubre de 2018, 19:33:57 por carpoolo »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:18F4550 AYUDA!!
« Respuesta #1 en: 16 de Octubre de 2018, 20:43:52 »
Que tal carpoolo,

Pues no veo por ningún lado en tu código la parte en donde grabas el ID del ibutton en la memoria externa.

Solo encontré esto dentro de la rutina de interrupción:

Código: [Seleccionar]
for(i=1;i<7;i++){   
   printf(lcd_putc,"%2X",Llave[7-i]);             
         }                               
   write_ext_eeprom(0,Llave[i]);

Analizando esa parte del código lo que estas haciendo con el for es mostrar en la LCD el ID leido del i-button. al terminar el for, la variable i tiene un valor = 8, por lo tanto Llave[8] tiene un valor desconocido (que bien pudiera ser 0xFF), entonces al ejecutar la instruccion de write_ext_eeprom(0,Llave); lo único que estas haciendo en grabando en la dirección 0 de la memoria externa 24512 un valor desconocido, nunca hay tal grabación de todos los ocho bytes del ID del i-button.

En su caso tendrías que hacer un for para el grabado del ID del ibutton, y usar una variable para la dirección.

elreypic.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #2 en: 16 de Octubre de 2018, 21:02:44 »
elreypic2  , si antes de proseguir quiero asegurarme que realmente se esta guardando el codigo de la llave en la memoria externa, por eso hago que se muestre en un LCD (solo para verificar). pero lo curioso es que en un 16F877 el mismo codigo (cambiando los fusibles) funciona perfectamente, sin ningun error. Pero lo que dices tiene sentido, si te entendí bien dices que en vez de colocar "
Código: C
  1. write_ext_eeprom(0,Llave[i]);
" cambie el "0" por una variable? pero que valor debería tomar la misma?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:18F4550 AYUDA!!
« Respuesta #3 en: 17 de Octubre de 2018, 00:06:03 »
Creo que no estas captando el punto o yo no te entiendo.
 Amos por pasos.
En la rutina de interrupción realizas la lectura de los 64 bits del Id del ibutton (8 bytes) correcto? Y asignas ese id leído en Llave[0] a Llave[7] correcto
Luego lo primero que muestras en la LCD la familia y el valor del CRC que son las variables Lave[0] y Llave[7] respectivamente. Aquí surge la primera pregunta, estos dos valores se muestran correctamente?

Luego después de mostrar la familia y el crc, muestras el resto del ID del ibutton, Llave[6] a Llave[1]. Aquí surge la siguiente la pregunta: Se muestra correctamente el ID en el LCD?

Lo que sigue es tu instrucción para escribir en la eeprom externa y ahí está un probl mas porque ahora la variable “i” tiene un valor de 8, entonces lo que estas intentando escribir es el valor que contiene Llave[8] en la dirección 0 de la memoria eeprom externa, pero Llave[8] no contiene ni gun byte del id del ibutton, el ID del ibutton está en Llave[0] a Llave[7], porque quieres grabar Llave[8]? No tiene sentido.
Lo que tienes que hacer es meter esa instrucción dentro del for y en lugar de 0, tienes que usar i como variable para la dirección, de este modo guardas los 8 bytes del ID dentro de las direcciones 0 a 7. Esto solo funciona para un solo ibutton
Esto es lo primero, ya después puedes seguir

Elreypic

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #4 en: 17 de Octubre de 2018, 18:46:36 »
Creo que no estas captando el punto o yo no te entiendo.
 Amos por pasos.
En la rutina de interrupción realizas la lectura de los 64 bits del Id del ibutton (8 bytes) correcto? Y asignas ese id leído en Llave[0] a Llave[7] correcto
Luego lo primero que muestras en la LCD la familia y el valor del CRC que son las variables Lave[0] y Llave[7] respectivamente. Aquí surge la primera pregunta, estos dos valores se muestran correctamente?

Luego después de mostrar la familia y el crc, muestras el resto del ID del ibutton, Llave[6] a Llave[1]. Aquí surge la siguiente la pregunta: Se muestra correctamente el ID en el LCD?
De hecho en el 16F877 si se muestran todos los caracteres normalmente, pero es en el 18F4550 donde no lo hace.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:18F4550 AYUDA!!
« Respuesta #5 en: 17 de Octubre de 2018, 20:58:26 »
Ahora sí ya entendí el problema. Este radica en la lectura del ibutton y no en su grabado en la memoria externa.
Te recomiendo entonces echarle un vistazo a la hoja de datos del Pic18F4550, porque el problema pudiera estar en la configuración de los puertos ya que no esté micro controlador no es un sustituto directo. Tiene sus diferencias.
Lo has simulado en proteus?

Puedo intentar simularlo, ya que no tengo el micro PIC18F4550

Elreypic

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:18F4550 AYUDA!!
« Respuesta #6 en: 18 de Octubre de 2018, 00:59:06 »
que tal carpoolo,

Después de algunas simulaciones en el proteus. El código que has colocado no funciona ni con el PIC16F877A, incluso arme el circuito en vivo y ni así trabajó.
Lo primero que me di cuenta es que estás generando un código reentrante con la interrupción. Por lo que estás forzando una interrupción externa que no es necesaria, ya que el ibutton funciona por polling. Así que lo que hice fue lo siguiente:

Código: [Seleccionar]
#include <18F4550.h>
#device ADC=10

#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOVREGEN                 //USB voltage regulator disabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=20000000)

#define LCD_ENABLE_PIN  PIN_D3                                    ////
#define LCD_RS_PIN      PIN_D1       
#define LCD_RW_PIN      PIN_D2                                    ////
#define LCD_DATA4       PIN_D4                                    ////
#define LCD_DATA5       PIN_D5                                    ////
#define LCD_DATA6       PIN_D6                                    ////
#define LCD_DATA7       PIN_D7                                    ////   

#include <LCD.C>
#include <TOUCH.C>

int8 Llave[8];               
int8 valor,i; 

void main()
{
   //enable_interrupts(INT_EXT);
   //enable_interrupts(GLOBAL);
   lcd_init();
   printf(lcd_putc,"Inserte Llave");

   while(TRUE)
   {
      if(touch_present()==1)
      {
         touch_write_byte(0x33); 
         for(i=0;i<8;i++)
         {
            Llave[i]=touch_read_byte(); 
         }
         printf(lcd_putc,"\fFlia: %2x CRC: %2X\nid: ",Llave[0],Llave[7]);
         for(i=1;i<7;i++)
         {
            printf(lcd_putc,"%2X",Llave[7-i]);             
         }
         delay_ms(1000); //Delay para alcanzar a visualizar el ID del ibutton
         printf(lcd_putc,"\fInserte Llave");
      }
     
   }

}

Como te puedes dar cuenta eliminé completamente la interrupción, y solo dejé el main. Espero que esto te sirva. Realicé la simulación proteus para el PIC18F4550 y funcionó perfectamene. No puedo hacerlo en vivo, ya que como te comenté no cuento con ningún PIC18F4550.

Saludos.

Elreypic.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #7 en: 19 de Octubre de 2018, 10:15:21 »
 :oops: elreypic2 , Disculpa pero probé tu código y no funciono, te dejo foto.

También pensé en lo que estas diciendo de la memoria del PIC.
Sin-t-tulo" border="0

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:18F4550 AYUDA!!
« Respuesta #8 en: 19 de Octubre de 2018, 11:50:10 »
Creo que definitivamente ahora tu problema es a la hora de hacer las conexiones.
Deberías invertir la posición de tu resistencia de pull-up y el ibutton, ya que eso haría que se quede el pin flotado y el micro lo puede interpretar como un 0.
La resistencia de pull-up en el pin RB0 (bus 1-wire) debe ser de 4.7k.Yo estoy 100% seguro que el código que te envié funciona perfectamente. Lo sé porque como te dije ensamblé el circuito con un PIC16F877A una vez que obtuve el funcionamiento correcto, simplemente hice las modificaciones necesarias al código y lo simulé en proteus sin problemas.
Definitivamente tu problema es eso, estas colocando en posición cambiada la resistencia de pull-up y el ibutton. Es decir, colocal la resistencia en el lugar del i-button y el ibutton en el lugar de la resistencia, de este modo aunque no este conectado un i-button, cuando el pin se vuelve de entrada hay un nivel "alto:" (un uno) en el pin. Entonces cuando presionas el switch siulas el contacto con el ibutton.

Saludos,

elreypic
El la noche que llegue a casa te pongo las fotos de las simulaciones con ambos micrcocontroladores.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:18F4550 AYUDA!!
« Respuesta #9 en: 19 de Octubre de 2018, 14:09:41 »
:oops: elreypic2 , Disculpa pero probé tu código y no funciono, te dejo foto.
.....

Revisá lo que hiciste.  Yo ejecuto el código del reypic2 tal como está y funciona perfecto.


En tu código inicial se pudre todo en:

Código: [Seleccionar]
#INT_EXT                     
void cambioB2(){                                                                                       
   init_ext_eeprom();                                                   
   valor=read_ext_eeprom(0);       <<<<<<<<<<<<<< acá   
   touch_write_byte(0x33); 
   for(int i=0;i<8;i++){             
   

Reseteando entre medio vuelve a la vida.
     
Código: [Seleccionar]
#INT_EXT                     
void cambioB2(){                                                                                       
   init_ext_eeprom();                                                   
   valor=read_ext_eeprom(0);     
   reset_pulse() ;           <<<<<<<<<<<<<  inserto un reset.   
   touch_write_byte(0x33); 
   for(int i=0;i<8;i++){             
   


De todas maneras no es práctica saludable meter tareas con retardos y llamadas a funciones dentro de la interrupción.
Y menos sin ni siquiera deshabilitarlas hasta salir.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #10 en: 22 de Octubre de 2018, 16:10:11 »
Gracias!!!   :mrgreen: Problema resuelto, necesitaba amas correcciones ( en proteus) y el uso de reset en PIC. Próximamente espero que puedan ayudarme con la siguiente etapa, que es adicionarle un modulo Wi-FI para recibir y guardar los códigos de las llaves  ((:-))

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #11 en: 06 de Febrero de 2019, 02:24:28 »
Buenas Buenas! regrese, para 2 cosas comentar un hecho bastante raro que me paso con este mismo PIC (18F4550) y una duda que puede sea algo tonta, bueno comenzando con el dato curioso: :-/

 :?"Es que hoy en día programe un 18F4550, como todos los fusibles tal cual estaba la programación de CCS C Compiler, pero lo raro es que el PIC no funcionaba, como prueba intente programar el clásico enciende LED y si funciono, pero con el primer programa no quería nada, hasta que recordé que en una oportunidad fue necesario agregarle el fusible "NODEBUG" para que el micro funcionara exactamente igual que en simulación, que loco no? :shock: 8)

 :oops:"Mi duda es la siguiente, en el programa digamos original que voy a adjuntar, necesito recibir un "OK" por via serial y quiero que el micro envie un string diferente cada vez que llegue un "OK", es decir, que cuando llega el 1er "OK" el micro mande "Hola" y cuando llegue el 2do "OK" mande "que tal?" por ejemplo. y hasta ahora creo que tengo problemas en borrar el string pasado, ya que cuando llega el primer OK el micro lanza los 2 mensajes de una vez.  :oops:  aprecio la ayuda y consejos!!

Código: C
  1. #include <18F4550.h>
  2. #FUSES NOWDT, NOBROWNOUT, NOLVP, MCLR, NODEBUG                   //Fusibles                                                                                          
  3. #use delay(crystal=20000000)              
  4. #use RS232(uart1,BAUD=9600,XMIT=pin_C6,RCV=pin_C7,PARITY=N,BITS =8)  
  5. #include <string.h>            
  6.   //Vairables//                                                                                                        
  7. char Llegada[3];
  8. struct comandos{
  9.       char* cmd1[26];
  10.       char* cmd2[23];              
  11. }cmds;
  12. char* dato[]={cmds.cmd1,cmds.cmd2};
  13. char comp="OK";
  14. int i=0;
  15.   //Interrupcion//                      
  16. #INT_RDA              
  17. void rxUART(void){
  18.     gets(Llegada);
  19.    if(!strcmp(*Llegada,*comp)){
  20.       cmds.cmd1="Hola";                
  21.       cmds.cmd2="Que tal";            
  22.          for(i=0;i<=2;i++){            
  23.             puts(dato[i]);                                            
  24.          }
  25.    }
  26. }                                
  27. void main (void){                      
  28.    enable_interrupts(GLOBAL);              
  29.    enable_interrupts(INT_RDA);
  30.    printf("Hola Mundo\r\n");                
  31.    while(true){                
  32.    //code        
  33.    }                    
  34. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:18F4550 AYUDA!!
« Respuesta #12 en: 06 de Febrero de 2019, 08:09:57 »
Tu problema esta aca:

Código: C
  1. #INT_RDA              
  2. void rxUART(void){
  3.     gets(Llegada);
  4.    if(!strcmp(*Llegada,*comp)){
  5.       cmds.cmd1="Hola";                
  6.       cmds.cmd2="Que tal";
  7.          for(i=0;i<=2;i++){            
  8.             puts(dato[i]);                                            
  9.          }

- gets es una funcion bloqueante, lo cual es un problema.
- No podes asignar string enteros como estas tratando de hacer.. Eso lo podes hacer en C++ debido al operator overloading.
- Enviar esos  2 mensajes completos mientras no dejas recibir es pedir problemas. Me refiero al puts, ya que es bloqueante y esta en la interrupcion

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:18F4550 AYUDA!!
« Respuesta #13 en: 07 de Febrero de 2019, 08:19:57 »
 :oops:  Es decir que no se puede hacer lo que quiero?  :(

No existe alguna funcion que me "limpie" el buffer que se envia por Rs232?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:18F4550 AYUDA!!
« Respuesta #14 en: 07 de Febrero de 2019, 14:02:20 »
Si se puede hacer lo que queres...

Pero tu problema es que no lo tenes que hacer ne la interrupcion. Las interrupciones deben ser rapidas, para dar lugar a otras interrupciones. Si vos te quedas esperando TODOS los caracteres enviados entonces no es rapido... La interrupcion deberia entrar, guardar el caracter en la posicion que corresponda y salir.


 

anything