Autor Tema: Tutorial C18  (Leído 57541 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Tutorial C18
« Respuesta #75 en: 17 de Septiembre de 2010, 13:36:13 »
Gracias Suky ya lo empiezo a ver mas claro  :mrgreen:
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Tutorial C18
« Respuesta #76 en: 26 de Septiembre de 2010, 15:10:47 »
Hola suky, excelente el manual de C18, muchas gracias.

Ahora mismo necesito declarar un char de 256 bytes para un buffer de entrada de datos seriales (char buffer[256];), en el tema "2.8. SECCIONES" del manual explicas claramente como hacerlo pero no entiendo la advertencia final que haces después del ejemplo en la página 26, cito:

"ATENCIÓN: Se debe tener precaución al trabajar de esta manera, ya que, una variable multi byte no puede pertenecer a dos bancos consecutivos".

La verdad no entiendo la advertencia, de que otra manera maneja el compilador las variables de más de 256 bytes si no es uniendo dos bancos consecutivos de RAM?

gracias por la ayuda.

saludos.
Pereira - Colombia

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #77 en: 26 de Septiembre de 2010, 16:11:56 »
El problema surge cuando modificamos los bancos creados en el linker, y unimos dos o más. Si no tenemos cuidado y una variable int, short o long queda por ejemplo:

Código: C
  1. long 0x15367580;

Y en la memoria de ram queda:

Código: [Seleccionar]
0x80  -->  0x00FF
0x75  -->  0x0100
0x36  -->  0x0101
0x15  -->  0x0102

Ocupa dos bancos consecutivos. Al trabajarlo en el código, seguro habrá problemas  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Tutorial C18
« Respuesta #78 en: 27 de Septiembre de 2010, 21:59:27 »
me queda claro, gracias por la respuesta.  Aunque al declarar la nueva zona de memoria como PROTECT imagino que el problema se elimina.

saludos,
Pereira - Colombia

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #79 en: 27 de Septiembre de 2010, 22:04:23 »
Con protect solo el usuario podrá asignar el espacio de memoria, pero si crea una estructura y pasa lo mismo, ocurrirá el problema.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #80 en: 29 de Septiembre de 2010, 19:17:57 »

Hola! recién he decidido manejar el C18. Usaba - y uso- como no CCS. Pero quiero aprender a usar este compilador. La verdad es que para hacer cualquier cosa es el dole de complicado ( mas que nada por buscar la información) y menos mal de este manual que he visto por aqui !

Pues como no, quiero implementar el C18 en el Proteus. Ya lo tengo implementado en el CCS,  y ahora le toca al C18. He visto la herramienta de debugger en MpLab, pero no me hace caso ( también cabe la posibilidad que haga algo mal en el programa... pero es raro ya que he cojido trozos de ejemplo del manual de presente hilo).
Como no me hace caso el debugger, pues quiero usar mi Proteus separado, e integrarlo como otra gente de otro hilo en esta foro, hizo con el CCS. Pero me faltan datos de todo... ¿ Cómo se integra ?
Gracias!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #81 en: 29 de Septiembre de 2010, 19:32:02 »
En proteus desarrollas el esquema, lo guardas en la carpeta del proyecto, y en MPLAB en debugger seleccionas Proteus VSM. Luego allí queda cargar el esquema que ya has desarrollado y listo.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #82 en: 29 de Septiembre de 2010, 22:16:50 »
pues sigue sin irme... lo que pretendo es lo mas simple del mundo, encender 4 leds del puerto A, en el que tambien pongo un pulsador:

Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. /////////////////////////////////////FUSES/////////////////////////////////
  4. #pragma config FOSC = HS
  5. #pragma config CPUDIV = OSC1_PLL2
  6. #pragma config VREGEN = OFF
  7.  
  8.  
  9. void main(void){
  10.  
  11. PORTA=0xF80;
  12. TRISA=0b00001000;          // RA4 es input
  13.  
  14.  
  15.   while(1){  
  16.        
  17.  
  18.    
  19.  
  20.    if (PORTAbits.RA4==1)
  21.         {
  22.                 PORTAbits.RA0=1;
  23.                 PORTAbits.RA1=1;
  24.                 PORTAbits.RA2=1;
  25.                 PORTAbits.RA3=1;
  26.        
  27.  
  28.      }
  29.  
  30.  }
  31. }
Los #fuses ( #pragma config en C18) he puesto esos, ya que no quiero usar nada del USB ( por cierto mi pic es el 18f4550). Al simular con proteus ( al menos asi lo veia cuando lo hacia con CCS) no hace mucho caso de eso, ya que directamente es uno el que ha de poner la F de oscilación del pic en el Proteus ( en opciones del pic). Asi que , aun mas... no entiendo que no se encienda ni un led...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #83 en: 29 de Septiembre de 2010, 23:47:20 »
Hay que configurar el módulo analógico para dejar los pines como digitales, creo que es lo que está faltando.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #84 en: 30 de Septiembre de 2010, 19:52:27 »
Si ;)
Además me he vuelto loco por poner LATA=0 y debajo LAT=1 ( bueno... era el isis quien se volvía loco realmenet). Lo que me ha aparecido una duda:

Qué diferencia hay entre LATA=0 y PORTA=0 ?
He leído en el data que PORTA "se usa" para averiguar el estado del puerto, y LATA para modificarlo. La verdad, no he entendido muy bien que eso fuera así, y como se ve, he modificado el programa para hacer tanto con LATA=0  y después PORTA=0. Obtengo el mismo resultado, y no entiendo muy bien por qué.
Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. /////////////////////////////////////FUSES///////////////////////////////// #pragma config  -> las opciones se ven en el help del C18, y luego en el ìc apropiado
  4. #pragma config FOSC = HS
  5. #pragma config CPUDIV = OSC1_PLL2
  6. #pragma config VREGEN = OFF
  7.  
  8.  
  9. void main(void){
  10. //////// Direccionamiento de registros pic
  11. //PORTA=0xF80
  12. PORTA=0x00;
  13. //LATA=0;
  14. PORTD=0xF83;
  15. ADCON1=0x0F;
  16. TRISA=0b00010000;          // RA4 es input
  17. TRISB=0;
  18. TRISD=0b00010000;
  19. ADCON1=0xFF;
  20.  
  21. PORTAbits.RA0=0;
  22. PORTAbits.RA1=0;
  23. PORTAbits.RA2=0;
  24. PORTAbits.RA3=0;
  25.  
  26. PORTDbits.RD0=0;
  27. PORTDbits.RD1=0;
  28. PORTDbits.RD2=0;
  29. PORTDbits.RD3=0;
  30.  
  31.   while(1){  
  32.      
  33.    if (PORTDbits.RD4==0)
  34.         {
  35.        //LATAbits.LATA1=1;
  36.                 PORTDbits.RD0=1;
  37.                 PORTDbits.RD1=1;
  38.                 PORTDbits.RD2=1;
  39.                 PORTDbits.RD3=1;
  40.      }
  41.    else{
  42.         PORTDbits.RD0=0;
  43.                 PORTDbits.RD1=0;
  44.                 PORTDbits.RD2=0;
  45.                 PORTDbits.RD3=0;
  46.     }
  47.  
  48. if (PORTAbits.RA4==0)
  49.         {
  50.                         PORTAbits.RA0=1;
  51.                 PORTAbits.RA1=1;
  52.                 PORTAbits.RA2=1;
  53.                 PORTAbits.RA3=1;
  54.      }
  55.    else{        
  56.                 PORTAbits.RA0=0;
  57.                 PORTAbits.RA1=0;
  58.                 PORTAbits.RA2=0;
  59.                 PORTAbits.RA3=0;
  60.     }
  61.  }
  62. }

otra cosa. Tal como uso CCS, hago tal como " #byte PORTA=0xF80 para direccionar la variable con la dirección ( valga la redundancia) real del pic. Aqui lo de PORTA=0xF80 seria dar un valor de inicio al registro bastante raro ( seguramente por eso también se enecendian y apagaban los leds a lo loco). He ido a ver qué dirección hay en el archivo de cabecera.. y no veo ninguna dirección! Si que está la estructura montada de cada puerto, pero no veo direcciones. Cómo direcciona pues C18 ?
« Última modificación: 30 de Septiembre de 2010, 20:09:12 por PICYO »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #85 en: 30 de Septiembre de 2010, 22:51:27 »
Como bien dice el datasheet, para leer el estado del puerto se debe usar PORTx y para escribir LATx. Puede que para modificar el puerto sea casi igual usar uno u otro, pero no para la lectura, el valor correcto será el que se encuentre en PORTx.
Por lo que tengo entendido, al escribir usando PORTx, para saber el actual valor del puerto hay que esperar un ciclo, y esto no pasa usando LATx.

mmm.. Las direcciones se encuentran en C:\MCC18\src\traditional\proc, pero ¿porqué definir algo que ya está definido? ¿Y si además se puede acceder a todos sus bit?


Saludos!
« Última modificación: 30 de Septiembre de 2010, 22:53:35 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #86 en: 01 de Octubre de 2010, 11:51:54 »
Ok ! No creí que fuera en esa carpeta!

Aprendí a gestionar los puertos  a través de la memoria RAM. Defino los registros PORTx y TRISx  y PORTx como #byte y se almacenan esas variables en la RAM, en la dirección real del PIC.

Veo que en C18 no hace falta hacerlo asi, como dices, ya está definido. En cuanto a LATx, quizás en mas interesante un cambio inmediato, y usar pues LATA en vez de PORTA.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #87 en: 01 de Octubre de 2010, 14:28:58 »
brrr! Tengo un problema al simular en el Proteus cuando cargo el LCD. Los leds funcionan perfecto al pulsar el switch, pero cuando configuro el LCD, se bloquea el simulador, lo he compriobadop al pulsar sobre el switch y no obtener respuesta.
No he querido cambiar el puerto ( de momento), asi que uso el puerto B. Me he bajado el PDF de Microchip C18 Libraries, y desde ahí he tratado de hacerlo solo, viendo que te dan las funciones del XLCD y sus prototipos. Bueno, no cabe decir que ha ido mal... así que he usado el otro PDF, el manual SUky. Y directamente, he propuesto hacer lo mismo, pero el resultado ha sido bastante pobre. Se sigue bloqueando y no le encuentro lógica.
Código: C
  1. #include <p18f4550.h>
  2. #include <stdio.h>
  3. #include <delays.h>
  4. #include <xlcd.h>
  5.  
  6. /////////////////////////////////////FUSES///////////////////////////////// #pragma config  -> las opciones se ven en el help del C18, y luego en el ìc apropiado
  7. #pragma config FOSC = HS
  8. #pragma config CPUDIV = OSC1_PLL2
  9. #pragma config VREGEN = OFF
  10. #pragma config WDT = OFF
  11. #pragma configWDT = ON
  12. #pragma PBADEN = OFF
  13.  
  14.  
  15. /////////// //////////////////////// funciones ///////////////////////////
  16.  
  17. void DelayFor18TCY( void )
  18. {
  19. Delay10TCYx(2);
  20. }
  21.  
  22. void DelayPORXLCD (void)
  23. {
  24. Delay1KTCYx(15); // Delay of 15ms
  25. // Cycles = (TimeDelay * Fosc) / 4
  26. // Cycles = (15ms * 16MHz) / 4
  27. // Cycles = 60,000
  28. return;
  29. }
  30.  
  31. void DelayXLCD(void){
  32.         Delay1KTCYx(2);
  33. }
  34. void comandXLCD(unsigned char a){
  35.         BusyXLCD();
  36.         WriteCmdXLCD(a);
  37. }
  38.  
  39. void gotoxyXLCD(unsigned char x,unsigned char y)      //Ubica cursor en (x=Posicion en linea; y= Numero de Linea)
  40. {
  41.    unsigned char direccion;
  42.    
  43.    if (y != 1)
  44.       direccion=0x40;
  45.    else
  46.       direccion=0;
  47.  
  48.    direccion += x-1;
  49.    WriteCmdXLCD(0x80 | direccion);
  50. }
  51.  
  52.  
  53. void main(void){
  54.  
  55. PORTA=0x00;
  56. ADCON1=0x0F;
  57. TRISA=0b00010000;          // RA4 es input
  58.  
  59.  
  60. TRISB=0b11111111; // todos inputs para lcd
  61. ADCON1=0xFF;
  62.  
  63.    OpenXLCD(FOUR_BIT & LINES_5X7);      //Iniciamos el LCD
  64.     comandXLCD(0X06);               //Nos aseguramos incremento de direccion, display fijo
  65.     comandXLCD(0x0C);      //Encendemos LCD
  66.                    
  67.     //gotoxyXLCD(1,1);
  68.     putrsXLCD("Probando Lcd");
  69.    gotoxyXLCD(1,2);               //Pasamos a la linea 2
  70.    putrsXLCD("Linea 2");
  71.  
  72.   while(1){    
  73.    if (PORTAbits.RA4==0)
  74.         {
  75.        //LATAbits.LATA1=1;
  76.                 PORTAbits.RA0=1;
  77.                 PORTAbits.RA1=1;
  78.                 PORTAbits.RA2=1;
  79.                 PORTAbits.RA3=1;
  80.      }
  81.    else{
  82.         PORTAbits.RA0=0;
  83.                 PORTAbits.RA1=0;
  84.                 PORTAbits.RA2=0;
  85.                 PORTAbits.RA3=0;
  86.     }
  87.  }
  88. }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #88 en: 01 de Octubre de 2010, 14:35:26 »
Se queda esperando alguna respuesta del LCD?
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: Tutorial C18
« Respuesta #89 en: 01 de Octubre de 2010, 15:53:44 »
Pues..tiene pinta de algo asi, yo suponia que era tema de delays, que he puesto delays un poco a ojo... por eso he copiado directamente los del manual, a ver como se desarrollaba. he pensado que quizas podría ser la configuracion de los pins, dentro de la libreria XLC, pero he decidido usar tambien 4 pines, y no descomentar el de 8 bits ( en un principio queria usar los 8 bits)... no se que mas podria ser..
saludos!


 

anything