PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schon wieder ein 4x20 LCD-Problem



masterx
07.03.2011, 19:40
Ich hatte vor kurzem schonmal hier einen Beitrag über ein LCD EADIP 204 4NLED!(rn_LCD_adapter)
das ganze an einem ATMEGA 32/16Mhz !(Habe ihn aber nicht wiedergefunden)

Ich habe das Problem das die 3. Zeile nicht anzeigt, und vermute das da irgend etwas mit den Adressen nicht hinhaut.....


Hier der Code in C:


//----------------------------------------------------------------------
// Titel :TIMER & INTERRUPTS
//----------------------------------------------------------------------
// Funktion :
// Schaltung :
//----------------------------------------------------------------------
// Prozessor : ATmega32
// Takt : 16.0000 MHz
// Sprache : C
// Datum : 03.02.2011
// Version : 1.0
// Autor : Stephan
// Programmer : ...
// Port : USB via ISP to ATMEGA32
//----------------------------------------------------------------------
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <lcd.h>

//----------------------------------------------------------------------
//Achtung ISP-Programmer giebt Reset an RN-Board wenn kein USB mehr angeschlossen ist
//----------------------------------------------------------------------
//Belegung ATMEGA32

//PORT A --->
//Port B --->
//PORT C --->
//PORT D --->
//-----------------------------------------------------------------------

//-------------------------------------------------
//Funktionen...
//---------------------------------------------------
//----------------FUNKTIONEN-------------------------

void wait_ms(uint16_t ms)
{
for(uint16_t t=0; t<=ms; t++)
_delay_ms(1);
}

double u_Batt(void)
{
int i; // Variablen definition
double messwert = 0.0;
double ergebnis = 0.0;

DDRA |= 0x01; //0000 0000 -> PA0 , PA0 - PA7 Eingänge (0)
ADMUX=0x06; // ADC Ref auf Avcc, PA6 ADC-IN-PORT,
ADMUX |= (1<<REFS1);
ADCSRA=0x87; // ADC eingeschaltet, Teilerrate 128 ,Abtastrate 125 kHz

messwert=0.0; // setzt den Messwert auf 0
for(i=0;i<10;i++) // Schleife zur Ermittlung von 10 Meßwerten
{
ADCSRA |= (1<<ADSC); // single conversion mode ein
while(ADCSRA & (1<<ADSC)); // Warten auf Konvertierungsergebnis
messwert += ADCW; // Summierung der Messwerte in der Schleife
}


ergebnis = (messwert/10.0)*(5.0/1024.0)*5.596189212; // Aritmethisches Mittel der Messwerte * 1Digit * Teilerverhältnis

return ergebnis;

}

void ausgabeBT1_LCD(double ub)
{

char string1[20];
char string2[20];
char string3[20];
char string4[20];
char *st1;
char *st2;
char *st3;
char *st4;
st1= & string1;
st2= & string2;
st3= & string3;
st4= & string4;
//dtostrf(var1, 5, 1, st1); //Änderung im Makefile------>#SCANF_LIB = $(SCANF_LIB_FLOAT) das # musste weg
//dtostrf(var2, 5, 1, st2); //Sonst verarbeitet FKT keine Doubles und Flotes
dtostrf(ub , 5, 2, st3); //Nachteil etwas meh Speicherplatz
//itoa(n, st4 , 10);


lcd_init(LCD_DISP_ON);

lcd_puts( " INTERRUPTS " );

lcd_gotoxy( 0, 2 );
lcd_puts( " & " );

lcd_gotoxy( 0, 3 );
lcd_puts( "TIMER" );

lcd_gotoxy( 0, 4 );
lcd_puts( "U-Batt: " );

lcd_gotoxy( 7, 4 );
lcd_puts( st3 );

lcd_gotoxy( 12, 4 );
lcd_puts( "V" );




}


//---------------------------------------------------------------------------
//---------------------------------MAIN_FUNKTION---------------------------
//----------------------------------------------------------------------------
// INITIALISIERUNG
//----------------------------------------------------------------------------

int main(void)
{


//Pins bzw. Ports als Ein-/Ausgänge konfigurieren

DDRA |= 0x00; //0000 0000 -> PA1 - PA7 Eingänge (0)
DDRB |= 0x00; //0000 0000 -> 5-7 ISP
DDRC |= 0xff; //1111 1111 muß hier so sein sonst läuft das LCD nicht
DDRD |= 0x80; //1000 0000 -> 7 Speaker


//PORTC |= (1 << PC0); //Endwicklungs Einstellungen
//PORTC |= (1 << PC1);
//PORTC |= (1 << PC2);
//PORTC |= (1 << PC3);
//PORTC |= (1 << PC4); //Beleuchtung LCD an
//PORTC |= (1 << PC5);
//PORTC |= (1 << PC6);
//PORTC |= (1 << PC7);


//PORTC &= ~(1 << PC0);
//PORTC &= ~(1 << PC1);
//PORTC &= ~(1 << PC2);
//PORTC &= ~(1 << PC3);
PORTC &= ~(1 << PC4); //Beleuchtung LCD aus
//PORTC &= ~(1 << PC5);
PORTC &= ~(1 << PC6); //RW vom LCD muß auf LOW sein für Empfang
//PORTC &= ~(1 << PC7);

//PORTA = 0b00011111;
//PORTB = 0b00011110; //LEDs aus
//PORTC = 0b10101010;
//PORTD = 0b00001111; //LEDs aus




//------------------------------------------------------------------------

while(1)
{

double ub = u_Batt();

ausgabeBT1_LCD(ub);


wait_ms(1000);
}
//------------------------------------------------------------------------




return 0;

} Die benutzten Adressenin der lcd.h sind..

Line 1 : 0x00
Line 2 : 0x40
Line 3 :0x20
Line 4 :0x60

....das habe ich nach langem ausprobieren so hinbekommen, aber die 3. Zeile wird nicht übertragen.

Die Ausgabe ist:
INTERRUPTS
&
"In der 3. Zeile wird nichts angezeigt"!!!
U-Batt:14.15V


Habe keine Idee mehr woran es liegen könnte????


Grüße Stephan

masterx
08.03.2011, 18:32
So, nach 5Tagen und Nächten habe ich es geschafft!

Folgende Änderungen mußten gemacht werden:

//!!!!!!!!!!!!!!!!Änderung in der "lcd.c" Zeile 399----> else if (y==3) -->mußte aktiviert werden
// lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x);
//------------------------------------------------------------------------------------------------------

Adressen sind:
Line1:0x00
Line2:0x20
Line3:0x40
Line4:0x60


Ausserdem war mein Quelltext falsch, der Sprung in die 2. Zeile wird mit lcd_gotoxy(0,1); gemacht .....usw;Es läuft jetzt!!!

Wenn diese Info nützt viel Spaß damit!

Viele Grüße Stephan