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.
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.
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?
Geändert von HeSt (02.02.2019 um 07:52 Uhr)
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:
2.Code:in Register , SREG PUSH Register Prgrammcode POP REGISTERWenn du den ADC jedesmal nach der Wandlung deaktivierst:Code:WADC: ;Schleife bis Messung sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0 rjmp wadc cbi ADCSRA,ADEN ;ADC ausschalten out SREG,savr pop savr ret
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
Wenn man dann in den Sleep wechseln will wird vor dem Sleep der ADC deaktiviert und nach dem Sleep neu initalisiert.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
3. Wann wird denn ein Key gepresst ?
Lass die Routine komplett durchlaufen und mach die Keyabfrage ausserhalb dieser Routine (Wahrscheinlich auch beabsichtigt)Code:rjmp bri ;loop until any key pressed
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!
Verbesserungsvorschlag:Code:rjmp pc-1
Ein weiterer Hinweis betrifft: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
Was keinerlei Nährwert hat und kann komplett in allen Routinen entfernt werden.Code:push savr in savr,SREG . . . . out SREG,savr pop savr
Hi,
DANKE, dass du dir die Mühe gemacht hast, das Progrämmchen durchzusehen!
Das Register ersparst du dir nicht, man braucht es sowieso in den ISRs.
Deinen Vorschlag zur Sicherung nehme ich an.
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?
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)
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?
Ja eben nicht wenn du nach der Wandlung sofort den ADEN = 0 setzt danach passiert mit dem ADC gor nix mehr der ist AUS.
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.
Wenn du schläfst kannst du denn Daten aufnehmen also aktiv lernen ? (Der Mensch kanns schonnur 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...
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...
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....
Lesezeichen