masterx
07.03.2011, 20: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
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