Hallo Forengemeinde! Ich verzweifle gerade an einem eigentlich recht einfachen Quelltext, der im Controller einfach nicht das macht, was er soll! Ich möchte einfach die Batteriespannung meines Systems messen und abhängig von der Höhe Ausgänge ein- bzw. ausschalten. Wenn ich das im Simulator probiere funktioniert es auch, aber wenn ichs auf den Controller übertrage dann nicht. Es scheint mir, als wäre mit der Initialisierung des ADC was nicht in Ordnung - aber was? .include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn26def.inc" ldi r16, ramend out SP, r16 ;Ein-/Ausgänge definieren ldi r16, 255 out DDRB, r16 ;PortB als Ausgang sbi DDRA, 7 ;PortA, Bit 7 als Ausgang sbi DDRA, 2 ;PortA, Bit 2 als Ausgang ;_____________________________________Definitionen .def temp = r16 .def T = r17 .def U_BATTL = r18 .def U_BATTH = r19 .equ LEDs = PortB .equ rot = 3 ;______________________________________Initialisierung ;ADC initialisieren ldi temp, 0b00100000 out ADMUX, temp ldi temp, 0b01010000 out ADCSR, temp sbi ADCSR, ADEN ;______________________________________Hauptprogramm rcall Leuchte_einschalten ;rcall Pause_1s Start: sbi ADCSR, ADSC wait_for_ADC: sbic ADCSR, ADSC rjmp wait_for_ADC in U_BATTL, ADCL in U_BATTH, ADCH nop cpi U_BattH, 92 brlo Unter1_8V nop cpi U_BattH, 97 brlo Unter1_9V nop cpi U_BattH, 107 brlo Unter2_1V nop cpi U_BattH, 112 brlo Unter2_2V nop ;rcall Leuchte_einschalten rjmp fertig Unter1_8V: cbi PortA, 7 cbi PortB, 6 cbi PortB, 5 cbi PortB, 4 sbi PortB, 3 sbi PortB, 2 cbi PortB, 1 cbi PortB, 0 rjmp fertig Unter1_9V: cbi PortA, 7 cbi PortB, 6 cbi PortB, 5 sbi PortB, 4 sbi PortB, 3 sbi PortB, 2 sbi PortB, 1 cbi PortB, 0 rjmp fertig Unter2_1V: cbi PortA, 7 cbi PortB, 6 sbi PortB, 5 sbi PortB, 4 sbi PortB, 3 sbi PortB, 2 sbi PortB, 1 sbi PortB, 0 rjmp fertig Unter2_2V: cbi PortA, 7 sbi PortB, 6 sbi PortB, 5 sbi PortB, 4 sbi PortB, 3 sbi PortB, 2 sbi PortB, 1 sbi PortB, 0 rjmp fertig fertig: ;rcall Pause_100ms rjmp Start ;_____________________________________Unterprogramme Pause_1ms: ;1ms bei 1MHz Frequenz push temp ldi temp, 199 Pause_1ms_weiter: dec temp cpi temp, 0 breq Pause_1ms_Ende rjmp Pause_1ms_weiter Pause_1ms_Ende: pop temp nop ret Pause_10ms: rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms rcall Pause_1ms ret Pause_100ms: rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms rcall Pause_10ms ret Pause_1s: rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms rcall Pause_100ms ret ;Leuchte einschalten Leuchte_einschalten: ldi r16 , 255 out PortB, r16 ;Leuchte einschalten sbi PortA, 7 ;Leuchte einschalten ret ;Leuchte ausschalten Leuchte_ausschalten: ldi r16 , 0 out PortB, r16 ;Leuchte einschalten cbi PortA, 7 ;Leuchte einschalten Schon jetzt besten Dank und viele Grüße Michael
Michael Scherner schrieb: > Wenn ich das im Simulator probiere funktioniert es auch, aber wenn ichs > auf den Controller übertrage dann nicht. Spitzen Fehlerbeschreibung. Da weiß man gleich worauf man sein Augenmerk richten soll :-) > Es scheint mir, als wäre mit der Initialisierung des ADC was nicht in > Ordnung - aber was? Woraus schliesst du das? > ;ADC initialisieren > ldi temp, 0b00100000 > out ADMUX, temp > ldi temp, 0b01010000 > out ADCSR, temp Ne. Das tu ich mir jetzt nicht an, wieder mal bei Atmel das Datenblatt zum Prozessor zu suchen um rauszufinden, was du da alles aktivierst.
Ich würde mir hier sbi ADCSR, ADSC wait_for_ADC: sbic ADCSR, ADSC rjmp wait_for_ADC in U_BATTL, ADCL in U_BATTH, ADCH nop ganz einfach mal den eingelesenen Wert in U_BATTH plain vanilla, so wie er ist, auf einen Port rauslegen und dann mit dem Multimeter (oder ein paar LED) dekodieren, was der ADC überhaupt gemessen hat.
Unter2_1V: cbi PortA, 7 cbi PortB, 6 sbi PortB, 5 sbi PortB, 4 sbi PortB, 3 sbi PortB, 2 sbi PortB, 1 sbi PortB, 0 rjmp fertig noch komplizierter und fehlerträchtiger konntest du das nicht schreiben? :-)
Hallo nochmal! Zunächst ein großes Dankeschön für deine Hilfe! Hab den Fehler gefunden! Software war OK... aber ich hab die Schaltung mit Krokodilklemmen ans Netzteil angeschlossen und die hatten so nen hohen Übergangswiderstand, dass da folglich auch ne Menge Spannung abfiel... Nunja, so kanns gehen ;-) Wie gesagt: vielen Dank! Gruß Michael
Michael Scherner schrieb: > Pause_1s: > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > rcall Pause_100ms > ret Ein kleiner Tipp: folgendes kleine BASIC-Programm erzeugt Dir ein Unterprogramm für eine Minute warten: print "Pause_1min:" for i=1 to 60 print "rcall Pause_1s" next i print "ret" Das Ergebnis musst Du nur kopieren und in Deinen Quelltext einfügen. lol. Das "Quell" in Quelltext kommt übrigens von "quellen". ;-)
Hi
>Das Ergebnis musst Du nur kopieren und in Deinen Quelltext einfügen.
Weder das eine noch das andere ist für sinnvolle µC-Programmierung
sinnvoll. Oder mal anders herum: Was würdest du zu einem PC-Programm
sagen, das bei jedem Tastendruck den Rechner erst mal für eine Sekunde
total blockiert.
MfG Spess
> Weder das eine noch das andere ist für sinnvolle µC-Programmierung > sinnvoll. Zumal man für solch lange Verzögerungen einen Timer bemüht. Dies hat noch den Nebeneffekt, dass der MC in der Wartezeit andere Jobs erledigen kann. Dies ist aber hier schon so oft angesprochen worden, dass ich da langsam keine Lust mehr drauf habe. ...
Hi >Dies ist aber hier schon so oft angesprochen worden, dass ich da langsam >keine Lust mehr drauf habe. Kann ich nachvollziehen. Wer so etwas empfiehlt gehört an eine virtuelle Wand gestellt werden und mit virtuellen Wattebällchen beworfen werden oder wenigsten ein Bit vom jedem Byte auf das er zugreift sollte schreibgeschützt sein. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.