- 12V Akku mit 280 Ah bauen         
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
    Ok, danke für die Erklärungen!
    Da ich alle Pins des LCD-Ports am µC für und somit auch die des LCDs auf GND lege, sollte es zu keinen der oben beschriebenen Problemen kommen.

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    So, ein Problem, das ich seit Tagen zu klären versuche ...
    Ich komm nicht dahinter
    Deshalb bitte ich um eure Hilfe.

    Das angehängte Progrämmchen ist ein Auszug aus meinem SunTracker Projekt.
    Es soll in einer Schleife die Spannungen am LCD anzeigen und aktuell halten.
    Angezeigt wird in der zweiten Zeile links der 8-Bit ADCH-Wert im ADLAR-Modus und
    rechts der umgerechnete Wert im 10-Bit Modus in Volt (Basis: 15V = 1024).
    Funktioniert super, ABER NUR DANN , wenn die in der Routine DSPVALS die zwischen den beiden ;???? Zeilen stehenden Befehle aktiv sind.

    Werden die Befehle für die Anzeige im 8-Bit Modus deaktiviert, funktioniert die 10-Bit Anzeige/Umrechnung nicht mehr.
    Beim ersten Durchlauf wird zwar die richtige Spannung angezeigt, aber nicht mehr aktualisiert. Die Schleife läuft zwar, aber warum vom ADC nichts mehr kommt oder woran es sonst liegt ????????????

    Poti auf ADC7 hängen oder welchen ihr auch immer testen wollt/könnt.

    Kann mir da jemand weiter helfen?
    Angehängte Dateien Angehängte Dateien
    Geändert von HeSt (02.02.2019 um 07:52 Uhr)

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

    1. Warum erst SAVR pushen und dann das SREG sichern in einer normalen Unterroutine ? Register SAVR dient der bloßen Sicherung was der Stack genauso machen könnte und man so wieder ein Register frei hätte falls benötigt.
    Sonst nur notwendig wenn man mit Interrupts arbeitet und z.B. Rechenoperatonen durchführt dann muss/sollte das SREG in der ISR gesichert werden wie folgt:
    Code:
    in      Register , SREG
    PUSH Register
    Prgrammcode
    POP   REGISTER
    2.
    Code:
     WADC:                ;Schleife bis Messung
        sbic    ADCSRA,ADSC    ;abgeschlossen = ADSC=0
        rjmp    wadc
        cbi    ADCSRA,ADEN    ;ADC ausschalten
        out    SREG,savr
        pop    savr
        ret
    Wenn du den ADC jedesmal nach der Wandlung deaktivierst:
    1. braucht der ADC jedesmal bei der ersten Wandlung 25 Zyklen alle weiteren ca 13 Zyklen
    2. das erste Ergebniss ist meist Müll
    3. Die Wandlungsgeschwindigkeit sollte zwischen 50kHz - 200kHz betragen, bei dir ist es 7812,5Hz
    4. Erst alles einstellen und dann ADEN auf 1 setzen ist ungünstig da Spannungsreferenz und Kannalum/einstellung nicht angenommen werden!!!!

    Also richtig
    Code:
    ADC_Init: 
    1. ADEN setzen
    2. Kanal auf GND setzen
    3. Referenz einstellen
    4. Testwandlung starten, auslesen, Ergebniss verwerfen
    ret
    
    WADC:
    1. Kanal GND auf Kanal X setzen
    2. Wandlung anstoßen
    3. Wandlungszeit warten
    4. Ergebnis auslesen
    (5. Kanal X auf Kanal GND setzen aber kein muss)
    ret
    Wenn man dann in den Sleep wechseln will wird vor dem Sleep der ADC deaktiviert und nach dem Sleep neu initalisiert.

    3. Wann wird denn ein Key gepresst ?
    Code:
    rjmp    bri        ;loop until any key pressed
    Lass die Routine komplett durchlaufen und mach die Keyabfrage ausserhalb dieser Routine (Wahrscheinlich auch beabsichtigt)
    Ebenso bau dir mal eine Zeitverzögerung ein sonst springen deine Werte auf dem LCD zu stark.

    4. Vorsichtig mit irgenwelchen Sprungadressen dieser Art mit dem jetzigen Wissensstand!
    Code:
    rjmp    pc-1
    Verbesserungsvorschlag:

    Code:
    Init:
    1. STACK
    2. Power
    3. PORTS
    4. ADC_INIT (ADEN = 1, REF = 5V, Chanel = 11111, Testwandlung
    5. LCD_ON
    
    Hauptprogramm:
    0. 150ms warten
    1. Pinabfrage(SBIS/SBIC ?) wenn Bedingung erfüllt Sprung zu 2. sonst 3.
    2. dspvals
    3. rjmp Hauptprogramm
    
    dspvals:
    dein Programm
    ret
    Ein weiterer Hinweis betrifft:
    Code:
    push    savr
    in    savr,SREG
    .
    .
    .
    .
    out    SREG,savr
    pop    savr
    Was keinerlei Nährwert hat und kann komplett in allen Routinen entfernt werden.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.09.2008
    Ort
    Linz A
    Beiträge
    126
    Hi,
    DANKE, dass du dir die Mühe gemacht hast, das Progrämmchen durchzusehen!
    Zitat Zitat von avr_racer Beitrag anzeigen
    1. Warum erst SAVR pushen und dann das SREG sichern in einer normalen Unterroutine ? Register SAVR dient der bloßen Sicherung was der Stack genauso machen könnte und man so wieder ein Register frei hätte falls benötigt.
    Das Register ersparst du dir nicht, man braucht es sowieso in den ISRs.
    Deinen Vorschlag zur Sicherung nehme ich an.
    Zitat Zitat von avr_racer Beitrag anzeigen
    Wenn du den ADC jedesmal nach der Wandlung deaktivierst:
    1. braucht der ADC jedesmal bei der ersten Wandlung 25 Zyklen alle weiteren ca 13 Zyklen
    2. das erste Ergebniss ist meist Müll
    3. Die Wandlungsgeschwindigkeit sollte zwischen 50kHz - 200kHz betragen, bei dir ist es 7812,5Hz
    4. Erst alles einstellen und dann ADEN auf 1 setzen ist ungünstig da Spannungsreferenz und Kannalum/einstellung nicht angenommen werden!!!!
    Gut. Verstanden.
    Allerdings hab ich nirgendwo im Datenblatt gelesen, dass die erste Messung Müll ist (beim Tiny13 wird z.B. dezidiert darauf hingewiesen). Zudem ist es zumindest bei dieser Routine egal, weil sowieso laufend gemessen und nur angezeigt wird.
    Zu 3. An der Wandlungsgeschwindigkeit kann es nicht liegen. Sie ändert sich nicht, ob nur eine Wandlung oder beide erfolgen (8Bit+10Bit). Bei beiden funktioniert es ja und die 8Bit alleine auch. Weiter runter drehen kann man nicht. /128 ist der größte Teiler!
    Was meinst du bei 4. mit "erst alles einstellen"?
    Wie soll ich den Kanal auf GND setzen, wenn da Dauerspannung anliegt?
    Zitat Zitat von avr_racer Beitrag anzeigen
    3. Wann wird denn ein Key gepresst ?
    In dieser Testroutine gar nicht. Wird im Gesamtprogramm abgefragt. Der Kommentar ist beim Kopieren mitgegangen ...

    Werd deine Vorschläge einbauen. Mal sehen, wie weit sie Wirkung zeigen.
    Komm allerdings erst in 10 Tagen dazu ...
    Geändert von HeSt (02.02.2019 um 15:51 Uhr)

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Zitat Zitat von HeSt Beitrag anzeigen
    Das Register ersparst du dir nicht, man braucht es sowieso in den ISRs.
    Doch meistens schon bzw du kannst es doppelt nutzen einmal ausserhalb der ISR und innerhalb der ISR. Frage hast du denn im Originalcode ISR in der Benutzung?

    Zitat Zitat von HeSt Beitrag anzeigen
    Allerdings hab ich nirgendwo im Datenblatt gelesen, dass die erste Messung Müll ist (beim Tiny13 wird z.B. dezidiert darauf hingewiesen). Zudem ist es zumindest bei dieser Routine egal, weil sowieso laufend gemessen und nur angezeigt wird.
    Ja eben nicht wenn du nach der Wandlung sofort den ADEN = 0 setzt danach passiert mit dem ADC gor nix mehr der ist AUS.

    Zitat Zitat von HeSt Beitrag anzeigen
    Zu 3. An der Wandlungsgeschwindigkeit kann es nicht liegen. Sie ändert sich nicht, ob nur eine Wandlung oder beide erfolgen (8Bit+10Bit). Bei beiden funktioniert es ja und die 8Bit alleine auch. Weiter runter drehen kann man nicht. /128 ist der größte Teiler!
    Naja du undersamplest eben deshalb soll ja diese Sample/Abtastfreweunz bei 50kHz bis 200kHz liegen damit der Hold-Kondensator nicht zu stark belastet wird. Und zum Ende der Wandlung das Ergebnis verfälschen kann.

    Zitat Zitat von HeSt Beitrag anzeigen
    Was meinst du bei 4. mit "erst alles einstellen"?
    Wie soll ich den Kanal auf GND setzen, wenn da Dauerspannung anliegt?
    Wenn du schläfst kannst du denn Daten aufnehmen also aktiv lernen ? (Der Mensch kanns schon nur die Digitaltechnik nicht wenn was ausgeschaltet wurde) oder anders kannst du was auf CD schreiben wenn der Motor abgeschaltet wird der die CD bewegt ?
    Im AVR ist nur EIN Wandler enthalten der durch umschalten der Eingänge auf die verschiedenen Pins zwischen verschiedenen Spannungen messen kann oder eben auf Kanal GND/Bandgabspannung wird der Eingang des Wandlers gelegt.
    Hoffe du nimmst es mir nicht übel wenn ich meine das auch hier wieder Grundlagen zum ADC im AVR fehlen...

    Zitat Zitat von HeSt Beitrag anzeigen
    In dieser Testroutine gar nicht. Wird im Gesamtprogramm abgefragt. Der Kommentar ist beim Kopieren mitgegangen ...

    Werd deine Vorschläge einbauen. Mal sehen, wie weit sie Wirkung zeigen.
    Komm allerdings erst in 10 Tagen dazu ...
    Noch ein Hinweis dein Text ist im Moment ein mix aus Spagehtticode und halbsinnvoller Routinen, zumindest könnte man noch weitere Teile in Unterroutinen auslagern um so die "mittleren Routinen" lesbarer zu gestalten...

  6. #6
    HaWe
    Gast
    15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
    ***duck-und-weg-renn***

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Zitat Zitat von HaWe Beitrag anzeigen
    15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
    ***duck-und-weg-renn***
    Ja genau, sogar mein Frisör hat's geschafft, sein Garagentor mittels Arduino zu steuern, obwohl er eine LED nicht von einem Widerstand
    unterscheiden kann! "3 Zeilen Code": mehr kann man von den MEISTEN Arduino-Usern auch nicht verlangen.

    mfg
    Achim

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Zitat Zitat von HaWe Beitrag anzeigen
    15 Forums-Seiten, um was auf LCD auszugeben ... Per Arduino wären das 3 Zeilen Code....
    ***duck-und-weg-renn***
    Und wer hat wohl die Bibliotheken geschrieben das ein User evtl es in 3 Zeilen schafft ?? Denn hinter diesen 3 Zeilen, in Hochsprache, stehen gute 250 Zeilen in ASM. Dazu stellt sich die Frage wieviel der Premiumprogrammierer von der Hardware überhaupt verstanden hat...

    Der Seitenhieb ist schon ganz schön heftig und extremst unfair. Zu den 15 Seiten die ersten 7 kannste mal subtrahiern....

Ä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