- LiFePO4 Speicher Test         
Ergebnis 1 bis 2 von 2

Thema: Schon wieder ein 4x20 LCD-Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26

    Schon wieder ein 4x20 LCD-Problem

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    //----------------------------------------------------------------------
    // 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
    Geändert von masterx (08.03.2011 um 12:51 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    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
    Geändert von masterx (09.03.2011 um 06:34 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus