TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: jfh900 en 16 de Agosto de 2011, 14:41:29

Título: LCD+CodeVisionAVR+ATmega328P
Publicado por: jfh900 en 16 de Agosto de 2011, 14:41:29
He conectado un ATmega328P en una placa Duemilanove a un LCD. Lo he programado mediante CodeVision utilizando la librería LCD y no hay manera de que funcione. Lo he simulado en Proteus y tampoco funciona, ya que las líneas de control y datos del LCD no fluctúan con los datos. ¿Alguien ha sido capaz de hacerlo funcionar? o es que ¿está librería funciona mal?. Adjunto un fichero comprimido con el .c y la simulación en Proteus.

Código: C
  1. /*****************************************************
  2. This program was produced by the
  3. CodeWizardAVR V2.05.0 Professional
  4. Automatic Program Generator
  5. © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
  6. http://www.hpinfotech.com
  7.  
  8. Project :
  9. Version :
  10. Date    : 16/08/2011
  11. Author  : NeVaDa
  12. Company :
  13. Comments:
  14.  
  15.  
  16. Chip type               : ATmega328P
  17. Program type            : Application
  18. AVR Core Clock frequency: 16,000000 MHz
  19. Memory model            : Small
  20. External RAM size       : 0
  21. Data Stack size         : 512
  22. *****************************************************/
  23.  
  24. #include <mega328p.h>
  25. #include <delay.h>
  26.  
  27. #asm
  28.    //.equ __lcd_port=0x1b ;PORTA    //de-comment to select PORT choice
  29.    //.equ __lcd_port=0x18 ;PORTB
  30.    //.equ __lcd_port=0x15 ;PORTC
  31.    .equ __lcd_port=0x12 ;PORTD
  32. #endasm
  33.  
  34. // Alphanumeric LCD Module functions
  35. #include <lcd.h>
  36.  
  37. // Declare your global variables here
  38.  
  39. void main(void)
  40. {
  41. // Declare your local variables here
  42.  
  43. // Crystal Oscillator division factor: 1
  44. #pragma optsize-
  45. CLKPR=0x80;
  46. CLKPR=0x00;
  47. #ifdef _OPTIMIZE_SIZE_
  48. #pragma optsize+
  49. #endif
  50.  
  51. // Input/Output Ports initialization
  52. // Port B initialization
  53. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
  54. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
  55. PORTB=0x00;
  56. DDRB=0xFF;
  57.  
  58. // Port C initialization
  59. // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
  60. // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
  61. PORTC=0x00;
  62. DDRC=0x00;
  63.  
  64. // Port D initialization
  65. // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
  66. // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
  67. PORTD=0xFF;
  68. DDRD=0xFF;
  69.  
  70. // Timer/Counter 0 initialization
  71. // Clock source: System Clock
  72. // Clock value: Timer 0 Stopped
  73. // Mode: Normal top=0xFF
  74. // OC0A output: Disconnected
  75. // OC0B output: Disconnected
  76. TCCR0A=0x00;
  77. TCCR0B=0x00;
  78. TCNT0=0x00;
  79. OCR0A=0x00;
  80. OCR0B=0x00;
  81.  
  82. // Timer/Counter 1 initialization
  83. // Clock source: System Clock
  84. // Clock value: Timer1 Stopped
  85. // Mode: Normal top=0xFFFF
  86. // OC1A output: Discon.
  87. // OC1B output: Discon.
  88. // Noise Canceler: Off
  89. // Input Capture on Falling Edge
  90. // Timer1 Overflow Interrupt: Off
  91. // Input Capture Interrupt: Off
  92. // Compare A Match Interrupt: Off
  93. // Compare B Match Interrupt: Off
  94. TCCR1A=0x00;
  95. TCCR1B=0x00;
  96. TCNT1H=0x00;
  97. TCNT1L=0x00;
  98. ICR1H=0x00;
  99. ICR1L=0x00;
  100. OCR1AH=0x00;
  101. OCR1AL=0x00;
  102. OCR1BH=0x00;
  103. OCR1BL=0x00;
  104.  
  105. // Timer/Counter 2 initialization
  106. // Clock source: System Clock
  107. // Clock value: Timer2 Stopped
  108. // Mode: Normal top=0xFF
  109. // OC2A output: Disconnected
  110. // OC2B output: Disconnected
  111. ASSR=0x00;
  112. TCCR2A=0x00;
  113. TCCR2B=0x00;
  114. TCNT2=0x00;
  115. OCR2A=0x00;
  116. OCR2B=0x00;
  117.  
  118. // External Interrupt(s) initialization
  119. // INT0: Off
  120. // INT1: Off
  121. // Interrupt on any change on pins PCINT0-7: Off
  122. // Interrupt on any change on pins PCINT8-14: Off
  123. // Interrupt on any change on pins PCINT16-23: Off
  124. EICRA=0x00;
  125. EIMSK=0x00;
  126. PCICR=0x00;
  127.  
  128. // Timer/Counter 0 Interrupt(s) initialization
  129. TIMSK0=0x00;
  130.  
  131. // Timer/Counter 1 Interrupt(s) initialization
  132. TIMSK1=0x00;
  133.  
  134. // Timer/Counter 2 Interrupt(s) initialization
  135. TIMSK2=0x00;
  136.  
  137. // USART initialization
  138. // USART disabled
  139. UCSR0B=0x00;
  140.  
  141. // Analog Comparator initialization
  142. // Analog Comparator: Off
  143. // Analog Comparator Input Capture by Timer/Counter 1: Off
  144. ACSR=0x80;
  145. ADCSRB=0x00;
  146. DIDR1=0x00;
  147.  
  148. // ADC initialization
  149. // ADC disabled
  150. ADCSRA=0x00;
  151.  
  152. // SPI initialization
  153. // SPI disabled
  154. SPCR=0x00;
  155.  
  156. // TWI initialization
  157. // TWI disabled
  158. TWCR=0x00;
  159.  
  160. // Alphanumeric LCD initialization
  161. // Connections specified in the
  162. // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
  163. // RS - PORTD Bit 0
  164. // RD - PORTD Bit 1
  165. // EN - PORTD Bit 2
  166. // D4 - PORTD Bit 4
  167. // D5 - PORTD Bit 5
  168. // D6 - PORTD Bit 6
  169. // D7 - PORTD Bit 7
  170. // Characters/line: 16
  171.  
  172. lcd_init(16);
  173. lcd_putsf("Valor del convertido");
  174.  
  175. while (1)
  176.       {
  177.       // Place your code here
  178.       PORTB.5 = 1;
  179.       delay_ms(100);
  180.       PORTB.5 = 0;
  181.       delay_ms(100);      
  182.       lcd_init(24);
  183.       lcd_gotoxy(0,0);
  184.       lcd_puts("Testing 1,2,3");
  185.       }
  186. }

Gracias anticipadas a todos y un saludo.
Título: Re: LCD+CodeVisionAVR+ATmega328P
Publicado por: cristian_elect en 16 de Agosto de 2011, 19:41:07
La direccion de de memoria es 0x0b para portd en codevisionavr.
Título: Re: LCD+CodeVisionAVR+ATmega328P
Publicado por: jfh900 en 16 de Agosto de 2011, 21:48:22
La direccion de de memoria es 0x0b para portd en codevisionavr.

Efectivamente ese es el valor correcto para que funcione el LCD.

En todas las páginas que he buscado ejemplos venía la dirección 0x12 ya que son ejemplos para el Atmega8 y en el caso del Atmega328P es el que tu me dijiste 0x0b. Se puede comprobar este valor en el fichero mega328P.h que contiene sfrb PORTD=0xb;.

Muchas gracias por tu ayuda cristian_elect

Siguiendo con la ayuda. ¿Se podría conectar al puerto C el LCD utilizando esta librería del CodeVisionAVR?. La razón es que necesito utilizar el puerto serie del micro y los pines tx y rx están en D0 y D1 que están utilizados por el LCD.

Un saludo

Título: Re: LCD+CodeVisionAVR+ATmega328P
Publicado por: cristian_elect en 16 de Agosto de 2011, 23:22:13
Aqui tengo un libreria de lcd es pequeña pero usa solo  6 pines especial par puerto C.
Título: Re: LCD+CodeVisionAVR+ATmega328P
Publicado por: jfh900 en 17 de Agosto de 2011, 09:11:57
Aqui tengo un libreria de lcd es pequeña pero usa solo  6 pines especial par puerto C.

Efectivamente funciona correctamente. De nuevo muchas gracias cristian_elect por tu ayuda que ha sido inestimable. Seguro que te tendré que preguntar alguna cosilla más, ya que estoy verde con el tema de los Atmel.

Un saludo