- Akku Tests und Balkonkraftwerk Speicher         
Seite 8 von 18 ErsteErste ... 678910 ... LetzteLetzte
Ergebnis 71 bis 80 von 173

Thema: Portbelegung auf ATMega für LCD1602

  1. #71
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Anzeige

    E-Bike
    Willkommen im Neuen Jahr!

    Ich wollte mir zum Jahresbeginn eine Freude machen und hab den Test mit dem T24 versucht.
    Leider kein guter Jahresbeginn

    Den Code mehrfach überprüft, auch den Testaufbau. ICH kann keinen Fehler entdecken.
    Möglicherweise ist mein LCD defekt. Hab es mittlerweile ein paar Jahre rum liegen. War zwar immer verpackt, aber ???
    Egal ob der µC in der Schaltung steckt oder nicht, das LCD bleibt finster. Nur wenn ich das Kontrastpoti fast auf GND drehe, ist die zweite Zeile voll mit 5x7 Blöcken.
    Die obere Zeile bleibt ganz finster. Kann das normal sein?

    Vielleicht hat jemand Zeit und Muße und schaut mal über meinen Code, ob ich da einen Fehler übersehen hab bzw. mir dessen gar nicht bewusst bin.
    Angehängte Dateien Angehängte Dateien
    Geändert von HeSt (01.01.2019 um 16:10 Uhr)

  2. #72
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich denke, wirst Du schon untersucht haben, aber trotzdem noch mal:
    Auch keine Kontaktschwierigkeiten mit irgendwelchen Anschlussadern am Display oder sonst wo? Stecker ab?

    MfG

  3. #73
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    die zweite Zeile voll mit 5x7 Blöcken.
    Die obere Zeile bleibt ganz finster. Kann das normal sein?
    Ich glaube nicht, das das Display defekt ist.
    Das ist üblicherweise so, wenn das Display nicht richtig initialisiert wurde.
    Schau mal Deine Init Routine und die Verbindungen zum Display durch!
    Im Simulator vom AVR Studio kannst Du den Code ja mal Schritt für Schritt durchklicken.

  4. #74
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    @ Moppi
    Ja, auch nachgemessen ...

    @wkrug,
    Im Sim scheint alles ok zu laufen. Zumindest läuft alles nach meinem Gedankengang ab.
    Ist er richtig?

  5. #75
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Das beschriebene Verhalten klingt völlig normal, glaube auch nicht dass das Display defekt ist.

    Die Displays benötigen aber einen gewisse Zeit bevor sie überhaupt ansprechnbar sind, da sie nach dem Anlegen der Versorgung einen internen Reset ausühren.
    Bevor Du also irgendwelche Zugriffe tätigst, muss vorher eine Wartezeit genereirt werden.
    Vielleicht liegt es daran.

    Siro

  6. #76
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Also irgendwie komm ich mit dem Timing nicht so ganz mit.
    Bei 1Mhz sind die Zeitschleifen zu lang (200ms bei 46msRoutine), bei 8 MHz sind es dann nur 28ms.
    Auf jeden Fall bei mir im Simulator.
    Der tiny24 hat auch keinen SPH?

  7. #77
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ein Tipp von mir, wie ich es auch immer gemacht habe und immer noch mache bis die Displays Leben zeigen:

    Baue zunächst eine "lange" Warteschleife die "mit Sicherheit" mindestens 100ms dauert.
    Dann benutze diese "überall". So kannst Du zunächst mal ein Timing Problem ausschliessen,
    wenn es dann noch nicht geht, liegt das Problem bei der Ansteuerung selbst.
    Bis das Display läuft, solltest Du generell die Lange Wartezeit benutzen.
    Auch bei den Signalen von Enable RS usw, LAAAAANGE Schleifen zum Testen, das tut ja keinem weh....
    Man verheddert sich sonst. Schnelligkeit Optimierung erst wenn das Display läuft.

    Es scheint ja noch nicht einwandfrei geklärt zu sein, wie lange deine Funktionen wirklich warten

    Dann fällt mir grade noch auf:
    Du initialsierst dein Display dauernd neu:
    ich würde die Initialisierung wohl eher so machen:

    Code:
       rcall    lcd_init   ; Initialisierung nur EINMAL
    DSP_MOD:
    
       ....
       rjmp    dsp_mod     ; Hauptschleife ohne neue Inititialisierung
    Das SPH Register in deinem Tiny24 existiert tatsächlich nicht, hat wkrug recht, das gibts erst beim Tiny84 mit 512 KByte RAM
    Die Initialisierung gleich beim Start für den Stack scheint okay und somit universell. Ich denke das kann bleiben.
    Es gibt jedoch Controller die bei derartigen Zugriffen (auf Registern die nicht existieren) mit einer Speicherschutzverletzung reagieren und das System anhalten,
    ich glaub aber nicht bei deinem.
    Mich wunderte zudem noch der "OUT" Befehl für den Stackpointer:
    Aber der Stackpointer liegt tatsächlich im IO Bereich, ungewöhnlich aber völlig korrekt.

    Siro
    Geändert von Siro (01.01.2019 um 20:29 Uhr)

  8. #78
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.
    test3.txt

    Wenn du das LCD richtig angeschlossen hast solltest du mal den Kontrast so einstellen das man die Dots 5x7 ein wenig sieht. Kommt hier mit Erhöhung des KOntrastet nur die erste Zeile zum vorscheinen ist die Init des LCD nicht komplett oder unterbrochen worden.

    Sag mal wie fit bist du eigentlich im ASM beim AVR ?

    1.
    In die Initialisierung gehören alle Inits interner sowei externe Peripherie. Ebenso sollten alle Ints, also die gesamte Vectortabelle aufegführt werden entweder.
    Code:
    .org $0000
         rjmp   INIT
    reti
    reti
    reti
    reti
    reti
    .
    .
    .
    .
    .
    Oder
    Code:
    .org $0000
          rjmp INIT
    .org $0001
          rjmp  ???
    .org $0002
           rjmp  ????
    .
    .
    .
    .
    Denn wenn der SEI aktiv ist und man vllt sich mal vertan hat und der zugehörige Int wird ausgelöst und diese Tabelle fehlt kann es sein das dein Controller mitten in der Startinit wieder loslegt....


    1.1

    Code:
    ldi        lcdd,0x28    ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font
        rcall    lcd_cmd4    ; Enthält bereits eine Zeitschleife
    es steht zwar dahinter aber wenn man doch mal fix was ändern möchte ist
    folgendes übersichtlicher
    Code:
    ;SET Function
    .equ F            =    2 ;1 = 5x10            0 = 5x7
    .equ N            =    3 ;1 = 2line(4line)    0 = 1line
    .equ DL            =    4 ;1 = 8bit int        0 = 4bit interface
    .equ HSF        =    5 ;immer 1 setzen Symbolisiert das Ende 
    
    ldi            temp1,(1<<HSF|0<<DL|1<<N|0<<F)        ;funktionset 
            rcall        lcd_command                            ;DatenLine1=8bit, N=1 2zeilig á 40 Zeichen d.h. 4zeilig á 20Zeichen
            ret
    Die LCD -Deklarationen sollten ebenfalls im Hauptprogramm ganz oben stehen

    1.2
    Zu den Registern sei gesagt die sollten nur einen allgm. Namen bekommen und haben nicht wirklich was mit den einzelnen Programmteilen, in textlicher Form, was zu tun. Ob es nun lcdd, tempx oder sonst wie benannt wird spielt keine Rolle da diese wirklich meist die absoluten temproären Daten sind und meist nur für die jeweilige Unterroutine wichtig sind.
    Daten die über mehrere Funktionen z.B. Sekunden/Minuten einer Uhr von Interesse sind werden im SRAM vorgehalten.
    Warum spreche ich das an ?
    Code:
    ;    ldi        XL,0x03        ;clr DSP, Curs > home (01)
    ;    rcall    lcd_cmd4    ; Erst wenn die komplette Init fertig ist Cursor Home schicken mit 0x01 
    ;woher also 0x03
    
    ;    rcall    lcd_dlys    ;dito
    
    ;    ldi        XL,0x06        ;also entry_mode DSP fest, Curs auto-inc
        ldi        lcdd,0x06    ; Und warum plötzlich in XL und nicht in lcdd ?    
        rcall    lcd_cmd4    ;
    
    ;    rcall    lcd_dlys    ;dito 
    
        pop        XL
        ret
    Hier hats dich ein wenig erwischt, Daten wurden in XL geschrieben obwohl du genau lcdd dafür vorgesehen hast somit wurde erst gar keine LCD-Daten ausgegeben.
    Der Befehl 0x01 ist LCD löschen und setzen auf Cursorpostition 0 in Zeile 1, würde ich erst immer nach der fertigen Initialisierung des LCD aufrufen.
    Das hier sollten die Hauptfehler gewesen sein, Wenn die Verkabelung stimmt ...

    Kleine Hausaufgaben
    1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
    2. Welche Register können nicht direkt mit Konstanten geladen werden ?

    2.
    Datenbanken so wie die dazugehörigen Textausgaben inklusive der Adressen, sollten in einer Include gepackt werden siehe hier
    https://www.roboternetz.de/community...Seriel-ATMega8 unter DbTxt_LCD.asm

    3.
    An Manchen Stellen hast du in der Unterroutine zum Schluss eine Zeitschleife und nachdem du diese Unterroutine verlassen hast folgt auf den Fuße wieder eine.
    Warum ? Entweder du entwickelst die Unterroutinen so das diese in und ansich voll funktionsfahig aus sich heraus sind. Zumindest solltest du dich nur auf einen Weg festlegen.


    puuhhhh jjaaaa das wars was mir erstmal aufgefallen war/ist...
    Geändert von avr_racer (02.01.2019 um 10:20 Uhr)

  9. #79
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Guten Morgen, Leute!

    Erst mal vielen Dank für eure Zeit, die ihr für mein Problem aufwendet!
    Und für die Tipps samt Lösungen!

    Da ich das erst richtig verarbeiten muss, erbitte ich mir etwas Zeit, bis ich wieder Rückmeldung gebe.

    Nur eines kurz @avr_racer:
    die Sache mit den Daten in XL ist mir heute früh auch aufgefallen, auf lcdd geändert. Half nix.

    Alles weiter werde ich beherzigen und umsetzen ...

  10. #80
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.679

    Idee

    .. Da ich das erst richtig verarbeiten muss, erbitte ich mir etwas Zeit, bis ich wieder Rückmeldung gebe ..
    Ich grins mich eins - mir gehts da wie Dir und dem LCD: wir brauchen alle mal ein paar waits wenns kompliziert wird *gg*.

    Spass beiseite. Ich habe zwar keine Assemblerlösung. Aber in Assembler werden ja ähnliche Routinen nötig wie in C - und da kann ich ein bisschen was zu den Waits beitragen. Im folgenden Code sind die "waits" - heissen dort
    ......_delay_us (parameter)
    rot hervorgehoben. Die Delays habe ich vor Jahren angepasst für 20 MHz Controllertakt (ist ja aber in µs angegeben) - und diese Routinen laufen bei mir so auf irgendwelchen, möglichst günstigen 2x16-LCDisplays. Vielleicht hilft Dir das ein bisschen weiter?

    Code:
    //      Erweiterte Fassung mit Routine für selbst definierte Zeichen
    //      Stand = Erweiterung von lcd-routines.h und lcd-routines.c
    //   vom 11. Apr. 2012
    // 28 Nov 2012 16:24  Leichte Korrekturen
    // 27 Juni 2015, 19:27  Datenausgabe PC0..PC3, Steuerport PD
     
    // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
    // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
    // Die Pinbelegung ist über defines in lcd-routines.h einstellbar
     
    #include <avr/io.h>
    //#include "lcd-routines.h"
    #include "lcd_162_xt_ALCo.h"
    #include <util/delay.h>
    #include <avr/eeprom.h>
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // sendet ein Datenbyte an das LCD
     
    void lcd_data(unsigned char temp1)
    {
       LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
       lcd_send(temp1);
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // sendet einen Befehl an das LCD
     
    void lcd_command(unsigned char temp1)
    {
       LCD_PORT &= ~(1<<LCD_RS);        // RS auf 0 setzen
       lcd_send(temp1);
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Eigentliche LCD-Zugriffs-Funktion; 4-Bit-Modus
    void lcd_send(unsigned char data) {
       // oberes Nibble setzen
      LCD_PORT = (LCD_PORT & 0xF0) | ((data >> 4) & 0x0F);
      _delay_us(15);
      lcd_enable();
       // unteres Nibble setzen
      LCD_PORT = (LCD_PORT & 0xF0) | (data & 0x0F);
      _delay_us (15);
      lcd_enable();
      _delay_us (60); 
      LCD_PORT &= 0xF0;
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // erzeugt den Enable-Puls
    void lcd_enable(void)
    {
                LCD_PORT |= (1<<LCD_EN1);
        _delay_us (20);                   // kurze Pause
       // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
       // http://www.mikrocontroller.net/topic/80900
       LCD_PORT &= ~(1<<LCD_EN1);
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Initialisierung:
    // Muss ganz am Anfang des Programms aufgerufen werden.
     
    void lcd_init(void)
    {
                LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1);   // Port auf Ausgang schalten
                // muss 3mal hintereinander gesendet werden zur Initialisierung
                _delay_us (40);
                LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x03;
                lcd_enable();
     
                _delay_us (15);
                lcd_enable();
     
                _delay_us (11);
                lcd_enable();
                _delay_us (11);
                LCD_PORT = (LCD_PORT & 0xF0 & ~(1<<LCD_RS)) | 0x02;
                _delay_us (11);
                lcd_enable();
                _delay_us (11);
     
                // 4Bit / 2 Zeilen / 5x7
                lcd_command(CMD_SetIFOptions | 0x08);
     
                // Display ein / Cursor aus / kein Blinken
                lcd_command(CMD_SetDisplayAndCursor | 0x04);
     
                // inkrement / kein Scrollen   
                lcd_command(CMD_SetEntryMode | 0x02);         
                lcd_clear();
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Sendet den Befehl zur Löschung des Displays
     
    void lcd_clear(void)
    {
       lcd_command(CLEAR_DISPLAY);
       _delay_us (15);
    }
     
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Schreibt einen String auf das LCD
     
    void lcd_string(char *data)
    {
        while(*data) {
            lcd_data(*data);
            data++;
        }
    }
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //String aus EEPROM laden und an LCD senden
      void lcd_eep_string(const unsigned char *data)
     {                                 //
      unsigned char c;
      while(1)                      //
      {                             //
        c = eeprom_read_byte(data); //
        if(c==0) return;            //
        lcd_data(c);                //
        data++;                     //
      }
     }              // Ende void lcd_eep_string(const
     
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // Schreibt ein Zeichen in den Character Generator RAM
    // Daten liegen direkt im RAM
      void lcd_generatechar(uint8_t code, const uint8_t *data)
     {                             //
      lcd_command(LCD_SET_CGADR|(code<<3)); // Startposition des Zeichens einstellen
      for (uint8_t i=0; i<8; i++)           // Bitmuster übertragen
      {                             //
        lcd_data(data[i]);          //
      }                             //
     }              // Ende void lcd_generatechar(uint8_t code,
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Ciao sagt der JoeamBerg

Seite 8 von 18 ErsteErste ... 678910 ... LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Atmega 644 & atmega8 parallel am ISP ... Reset beider atmega notwendig ..
    Von Ritchie im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 29.03.2013, 12:18
  2. CCPRO M128: Portbelegung
    Von Dirk im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 22.05.2009, 23:26
  3. Portbelegung bei diesem Display [erledigt]
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 19:12
  4. Portbelegung ATmega32
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 15.11.2006, 20:59
  5. Antworten: 4
    Letzter Beitrag: 12.11.2006, 17:40

Berechtigungen

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

12V Akku bauen