- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 173

Thema: Portbelegung auf ATMega für LCD1602

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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 ...

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694

    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Zitat Zitat von siro Beitrag anzeigen
    Baue zunächst eine "lange" Warteschleife die "mit Sicherheit" mindestens 100ms dauert.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:
    Beides erledigt, siehe unten
    Zitat Zitat von siro Beitrag anzeigen
    Das SPH Register in deinem Tiny24 existiert tatsächlich nicht, da hat wkrug recht ...
    Hab ich einfach vom M16 PGM rüber kopiert und nicht darauf geachtet - ist jetzt berichtigt
    Zitat Zitat von siro Beitrag anzeigen
    Mich wunderte zudem noch der "OUT" Befehl für den Stackpointer:
    Was meinst du damit? Kenne ich nicht anders und finde ich in anderen Programmen auch so.
    Zitat Zitat von wkrug Beitrag anzeigen
    Also irgendwie komm ich mit dem Timing nicht so ganz mit.
    Stimmt (schon). Ich hab den Wert erhäht, damit das delay sicher lang genug ist, hab aber den Text dazu nicht geändert.
    Zitat Zitat von avr_racer Beitrag anzeigen
    So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.test3.txt
    ldi lcdd, 0x01 ;*
    $01 löscht das Display, von cursor setzen auf Zeile1 Pos1 hab ich nichts gelesen!
    $03 setzt zusätzlich den cursor auf Z1P1.
    Und der Befehl ist der letzte der Init-Prozedur.
    Zitat Zitat von avr_racer Beitrag anzeigen
    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 Kontrasts nur die erste Zeile zum Vorschein ist die Init des LCD nicht komplett oder unterbrochen worden.
    Wie schon geschrieben:
    Es kommt in der ersten Zeile gar nichts zum Vorschein, dafür in der 2. Zeile sofort nach Anlegen der Spannung 16 Blöcke. Ob nun ein T24 in der Schaltung ist oder nicht. also auch ohne Init oder sonstiger Ansteuerung!
    Zitat Zitat von avr_racer Beitrag anzeigen
    Sag mal wie fit bist du eigentlich im ASM beim AVR ?
    Wie meinst du das, bzw. worum gehts dir?
    Wie auch schon geschrieben: ich hab einige verschiedene, kleinere Programme für den T13, den M8 und eine Heizungssteuerung für den M16 geschrieben (mit dem Texteditor), mit AVR umgewandelt und wenns nötig war mit debug getestet.

    Zitat Zitat von avr_racer Beitrag anzeigen
    1.
    In die Initialisierung gehören alle Inits interner sowie externe Peripherie.
    Im Testprogramm sind keine Ints definiert, weil nicht benötigt.
    Wenn, dann mach ich es mit .org.
    Das kommt dann beim M16.

    Zitat Zitat von avr_racer Beitrag anzeigen
    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....
    Im Testprogramm nicht zutreffend - weder Int definiert noch in Verwendung

    Zitat Zitat von avr_racer Beitrag anzeigen
    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
    ???? Tut mir leid, kann damit nichts anfangen
    Mich verwirrt sowas nur.

    Zitat Zitat von avr_racer Beitrag anzeigen
    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.
    Das mag für dich zutreffen, nicht für mich. Denn durch eine zugeordnete Benennung wird für mich ein Programm, speziell wenn es länger ist, besser lesbar. So weiß ich in den einzelnen Routinen (auch später, wenn eine Routine in eine Bibliothek gewandert ist) wozu das Register dient. Das ist in mir drin - kommt aus dem Großrechnerbereich (sieh unten) und von der Clipper-Programmierung.
    Manchmal werden direkt veränderbare Register zu wenig, dann muss ich klarerweise in den SRAM "ausweichen". Wird aber, soweit möglich, vermieden.
    Wenn wenig direkt veränderbare Register zur Verfügung stehen, dienen X,Y,Z bei mir als "Arbeitsregister", die ständiger Veränderung unterliegen. Sind einfacher zu schreiben als Rxx oder benannte. Zudem tu ich mir leichter, wenn ich 16 Bit benötige. Da XYZ vordefiniert und für mich eindeutig. Sie sind auch durch die Großschreibung leicht erkenntlich. Wenn genug Register zur Verfügung stehen, werden andere unterhalb XYZ bis R16 als Arbeitsregister verwendet. Und dann neben den namentlich (nahezu) fix zugeordneten immer mit "WRKx" (WoRKregister) definiert (bei euch meist als "tempx" o.ä.). Die Mnemonic, die ich meist bei den Namen verwende, kommt aus dem Großrechnerbereich (alles englisch). Ist eine ganz andere Welt, prägt aber. Daher auch mein meist gemischter Text D/E.
    Aus oben genannten, jahrzehntelang prägenden Tätigkeiten erklärt sich auch mein Programmierstil. Somit auch mein Problem mit "fremden" Bibliotheken.
    Man möge mir verzeihen!

    Zitat Zitat von avr_racer Beitrag anzeigen
    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.
    Siehe oben. Der Befehl befindet sich am Ende der Initialisierung (=also fertig).
    Zitat Zitat von avr_racer Beitrag anzeigen
    Kleine Hausaufgaben
    1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
    2. Welche Register können nicht direkt mit Konstanten geladen werden ?
    zu 1.: Siehe 1.2
    zu 2.: von R0-R15
    Gewisse Grundlagen sind mir bekannt.
    Sonst hätte ich meine vorherigen Projekt nicht lösen können.
    Zitat Zitat von avr_racer Beitrag anzeigen
    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
    Werd ich mir genau ansehen.
    Wird aber erst schlagend, wenn das Test-Programm die Testphase bestanden hat und dann mit Mega16 voll programmiert wird ...

    Zitat Zitat von avr_racer Beitrag anzeigen
    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.
    Hast recht.
    Wurden eliminiert.
    Antworten zu Text3 siehe Anhang


    Um das Problem mit den Wartezeiten (delays) zu eliminieren, hab ich auf "Mechanik" umgestellt. Statt Wartezeiten in Routinen zu definieren verwende ich nun die "wait_key"-Routine. Die Wartezeit wird somit per "Taste" abgefragt. Händisch ist man sicher nicht zu schnell
    Man sollte, da die Befehle nun per Tastendruck weitergeschaltet werden, auch jeden Schritt auf dem LCD verfolgen können.

    Und trotzdem funktioniert ... NICHTS!

    Nach Power on (ob LCD alleine oder an T24 angeschlossen):
    1. Zeile: dunkel/leer
    2. Zeile: voll mit Blöcken (aber nur, wenn Kontrast fast auf 0V), also keine "Anzeige".
    Das bleibt unverändert, auch wenn mit der Taste weiter geschaltet wird.
    Angehängte Dateien Angehängte Dateien
    Geändert von HeSt (02.01.2019 um 13:44 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Deine Zeitverzögerungen habe ich mal versucht anhand des Datenblatts nachzurechnen:

    Vorab:
    Die CPU arbeitet intern (startet) mit einem 8 MHz Clock, dieser wird standardmäßig durch 8 geteilt,
    somit bleibt ein Clock von 1 MHz bestehen.
    Durch die "single pipeline" Struktur benötigen die meisten der Befehle dann auch entsprechend nur 1 Mikrosekunde.

    Nehme ich jetzt mal deine Wartefunktion LCD_DLYL die 46ms dauern soll:

    Es wird der Wert Hex 0xDAE0 dezimal 56032 ins X register geladen und in der Schleife kontinuierlich runtergezählt.
    sbiw XH_XL,1 benötigt 2 Zyklen
    brne ldl1 benötigt 2 Zyklen ausser beim letzten Durchlauf, dann nur einen.

    Das sind also 56032 mal 4 Zyklen = 224128-1


    nun kommen noch die anderen Befehle dazu
    2 push XH
    2 push XL
    2 ldi
    2 ldi
    2 pop
    2 pop
    3 ret
    3 der Aufruf der Funktion mit rcall
    Also insgesamt 18 Zyklen

    Das sind dann 224127+18 = 224145 also 224,145 Millisekunden
    Bei 8 MHz wären es 28,0018125 Millisekunden

    Jetzt können wir rückwärts rechnen welchen Wert wir wirklich brauchen für 46 ms
    46000 - 18 = 45982

    geteilt durch 4 für die innere Schleife
    jedoch vorher noch einen abziehen
    45981 / 4 = 11495,25

    somit müste der Wert für das Laden des X Registers 11495 dezimal bzw. 0x2CE7 sein.

    -----
    Für die 2ms Sekunden wäre es dann
    20000-18-1=19981 / 4 = 4994,25 also 49995 bzw. Hexadezimal 0x1383

    ----
    Ich habe auf meinem Rechner nichts mit Atmel drauf,
    aber das kann sicher mal jemand überprüfen mit dem Simulator.

    Siro

    Dies löst zwar nicht dein Problem, aber das Timing der Wartefunktionen sollte damit stimmen, sofern ich nix falsch gemacht habe...


    Dein WAIT_KEY: hat aber ein Problem:
    Du fragst den Pin ab und dann wird die entsprechende Funktion danach ausgeführt.
    Das geht aber SOOOO schnell, das bei der nächsten WAIT_KEY die Taste noch garnicht losgelassen wurde
    und somit wartet er garnicht mehr und führt die nächste Funktion sofort aus.
    Thema Tastenentprellung.
    So kommt leider immer ein Problem zum nächsten. Aber der Ansatz ist doch schonmal gut.
    Bau mal einfach in die WaitKey eine lange Schleife rein bzw. rufe dort nur deine LCD_DLY funktion auf, unabhängig ob Taste gedrueckt ist.
    und versuche es erneut.

    Könnte es auch sein, dass der Watchdog zuschlägt ?
    Das WDE Bit im Register WDTCSR mus auf 0 gesetzt sein.
    Laut Datenblatt ist es undefiniert ??, hab ich aber auch noch nicht verstanden wie das geht.....
    Geändert von Siro (02.01.2019 um 14:28 Uhr)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Gut dein LCD zeigt nen Balken an, ohne Init, also ist erstmal die Versorgung i.O..
    Kontrast mal ganz auf Anschlag gedreht ?

    Ebenso ein Bild vom Aufbau oder Stromlaufplan, ich sag mal so ich sehe nichts... Und das LCD heißt auch wirklich 1602 ?
    Hast du deine Programmierhwardware mal abgezogen von dem ISP Sockel?
    RESET ist wie bescaltet ?

    Nur mal so:
    die Datenleitung sind zufälliger Weise nicht irgendwie vertauscht mit DB0-DB3 ?
    Oder
    DB04 = PA07
    Db05 = PA06
    DB06 = PA05
    DB07 = PA04

    Der RW-Pin liegt auf Masse und auch mit RS oder Enable nicht vertauscht ?
    Oder Masse/Plusschluss eines Pins ?

    Ebenso mal die Frage was ist von den Bits am Controller eingestellt ?


    Mit dem Wait_Key, wenn dein Taster nicht entprellt per Hardware oder nach der Tasterabfrage keine >150ms Wartezeit drin sind, LASS ES!

    Den weiteren Text hab ich vernommen aber das führt uns erstmal nicht weiter und sind viel Schönheitsdinge....

    Wie sieht denn dein aktueller Code aus ?

    Zitat Zitat von Siro Beitrag anzeigen
    Könnte es auch sein, dass der Watchdog zuschlägt ?
    Das WDE Bit im Register WDTCSR mus auf 0 gesetzt sein.
    Laut Datenblatt ist es undefiniert ??, hab ich aber auch noch nicht verstanden wie das geht.....
    Wenn der nicht aktiviert ist passiert auch erstmal nichts !
    Angehängte Dateien Angehängte Dateien
    Geändert von avr_racer (02.01.2019 um 15:47 Uhr)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    @ Siro,
    Für die Zeiten hab ich mir vor Jahren eine Excel-Tabelle erstellt mit der ich die Zeiten errechne.
    Bislang hat das noch immer (annähernd) gestimmt (diverse Laufzeiten nicht berücksichtigt) und alle Anwendungen funktionieren damit. Allerdings hab ich noch keine Schleifen mit Doppelregistern realisiert. Vielleicht gibt es da einen größeren Unterschied.

    Was die Tastensache betrifft, so sehe ich meine Routine als abgesichert.
    Denn:
    WAIT_KEY:
    in XL,key_pin ;solange eine Taste gedrückt ist, geht's
    cpi XL,0 ;nicht weiter. Somit kann kein versehentlicher
    brne wait_key ;"Durchlauf" passieren. Erst nach dem Loslassen
    ;gehts weiter und ...

    WK1:
    in XL,key_pin
    ;... steht dann hier an, bis wieder eine Taste
    cpi XL,0 ;gedrückt wurde.
    breq wk1
    ret


    Somit gehts nur Schritt für Schritt von Befehl zu Befehl.

    Zum Thema "watchdog":
    Ich hab noch nie ein watchdog-Bit bewusst gesetzt. Weder 0 noch 1. Und es gab noch nie Probleme deshalb.

    @ avr_racer,
    die Sache mit den ISP-Pins wäre mir neu!
    Bei allen meinen Projekten habe ich auch die ISP-Pins verwendet.
    Teils auch für ISP. Und ich hatte noch nie Probleme damit.
    Das einzige was Zores macht ist JTAG (M16). Das gibts beim T24 aber nicht.

    Zitat Zitat von avr_racer Beitrag anzeigen
    Gut dein LCD zeigt nen Balken an, ohne Init, also ist erstmal die Versorgung i.O..
    Kontrast mal ganz auf Anschlag gedreht ?
    Ja, 1. Zeile bleibt leer bzw. ohne Blöcke.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Ebenso ein Bild vom Aufbau oder Stromlaufplan, ich sag mal so ich sehe nichts... Und das LCD heißt auch wirklich 1602 ?
    Hast du deine Programmierhwardware mal abgezogen von dem ISP Sockel?
    RESET ist wie bescaltet ?
    Morgen mach ich ein Bild vom Aufbau zum besseren Verständnis.
    es ist eine kleine Steckplatine ohne ISP und "reset" ist nicht beschaltet.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Nur mal so:
    die Datenleitung sind zufälliger Weise nicht irgendwie vertauscht mit DB0-DB3 ?
    Oder
    DB04 = PA07
    Db05 = PA06
    DB06 = PA05
    DB07 = PA04
    Auch aus Angst was versehentlich vertausch zu haben - x-mal geprüft = ok.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Der RW-Pin liegt auf Masse und auch mit RS oder Enable nicht vertauscht ?
    Oder Masse/Plusschluss eines Pins ?
    Nichts vertauscht und RW ist offen.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Ebenso mal die Frage was ist von den Bits am Controller eingestellt ?
    Welche sollten das sein??
    Da wurde nichts eingestellt, keine Fuses geändert oder dergleichen.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Wie sieht denn dein aktueller Code aus ?
    Siehe Anhang letzter post.

    [edit]
    Werde morgen noch RW auf GND setzen.
    Ob's was bringt?
    [endedit]
    Geändert von HeSt (02.01.2019 um 19:29 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Digitale Eingänge sollten immer beschalten sein, teilweise müssen diese auch Beschalten sein (entweder mit Widerständen oder direkt). Wenn die Pins als Ein- und Ausgang verwendet wird muss ein Widerstand verwendet werden.

    Der Reset sollte auch beschalten sein (mindestens ein Pullup-Widerstand). Ohne Widerstand kann es funktionieren, muss aber nicht. Hast du auch eine Led o.Ä. angeschlossen die du zum Testen verwenden kannst? So könntest du feststellen ob Resets auftreten bzw ob das Programm überhaupt läuft.

    MfG Hannes

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Guten Morgen,

    jo nimm dir Zeit.

    Ein Hinweis zur Zeile 1 und 2 als Deklaration.
    $80 ist das SET-DD-RAM-ADRESS-Kommando den Cursor an die jeweilige Adresse springen zu lassen. $80 muss immer addiert werden zur Cursorposition in allen Zeilen!

    Ebenso sind die Zeiten nochmal zu beachten.
    Du hast das LCD an den ISP-PINs angeschloßen. Das kann manchmnal zu Problemen in der Kommunikation mit dem LCD führen da der ISP-Programmer unter Umständen die PINs nicht frei gibt.

    Wäre es möglich mal ein Screenschot vom Aufbau zu machen ?

Ä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, 11:18
  2. CCPRO M128: Portbelegung
    Von Dirk im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 22.05.2009, 22:26
  3. Portbelegung bei diesem Display [erledigt]
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 18:12
  4. Portbelegung ATmega32
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 15.11.2006, 19:59
  5. Antworten: 4
    Letzter Beitrag: 12.11.2006, 16:40

Berechtigungen

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

Solar Speicher und Akkus Tests