Hallo zusammen!
Ich bin gerade dabei einen neuen Geocache zu entwickeln. Wer nicht weiß
was das ist, auch egal...
Ich erzeuge mit dem Timer1 einen String in binärer Form, der dann auf
dem Display ausgegeben wird. Dieser wird für 3 Sekunden angezeigt, dann
soll der Bediener mit zwei Tasten diesen wieder eingeben.
Dann wird nur noch abgefragt, ob die beiden Strings übereinstimmen, wenn
nicht beginnt das Ganze von vorne.
Dieses Programm funktioniert schon so wie ich das haben wollte.
Nun geht es darum, dass der Atmega8 in Powerdown Modus gehen soll wenn
ca. 5 Min. keine Taste gedrückt wird. Das funktioniert auch (durch
Strommessung bestätigt) nach diesen ca. 5 Sekunden. Ich kann ihn nur
nicht mit einem Interrupt an Int0 aufwecken, wieso auch immer!
Ich habe das mit dem Powerdown und aufwecken mit einem simplen Programm
getestet, eine Taste zum Powerdown und eine zum aufwecken an Int0, hier
hat das einwandfrei funktioniert. Im unten stehenden Code bekomme ich
ihn nicht mehr zum "leben".
Ich hoffe ihr könnt mir hierbei helfen!
Das Programm ist mein erstes wirkliches Projekt nach etlichen
"Lern"-Projekten. Man kann in dem Code sicherlich einiges noch
verbessern oder vereinfachen...
Vielen Dank!
Lass mal in der ISR: eine LED blinken.
Vielleicht Loops er nur am Anfang des Programms, weil der Int0 dort
wieder enablen wird, dann wieder in die ISR gesprungen wird usw.
Der Int0 wird ja im Code erst im Label Power_down: enabled und nicht
oben bei den Configs oder sehe ich das falsch?
Ich werds auf jeden Fall morgen mal probieren wenn ich aus der Arbeit
zurück bin.
Hallo Maschke,
du legst den Controller im Interrupt schlafen. Da dort die Ints global
abgeschaltet sind, bekommst du ihn über einen Int nicht wieder
aufgeweckt.
Und wenn die Sache mit dem Powermode in der ISR dann erledigt ist
1
Isr:
2
Disable Int0
3
Goto 1
4
Return
goto 1?
wo soll das sein? Abgesehen davon. Du willst nicht aus einer Interrupt
Service Routine rausspringen. Der einzige erlaubte 'Ausgang' ist der
Return. Alles andere ist ein 'Ask for trouble'
> Lass mal in der ISR: eine LED blinken.
Habe ich mal gemacht (vor dem Disable Int0).
Die LED macht gar nichts. Somit gehe ich davon aus, dass Isr: gar nicht
angesprungen wird?
> goto 1?
Ich habe mal in einem Forum (weiß nicht mehr welches) gelesen, dass es
mit diesem Befehl möglich sei, an den Anfang (Zeile 1) des Codes zu
springen.
Gibt es hierfür eine andere Möglichkeit? In meinem Fall soll ja das
Programm nach dem Aufwecken immer von vorne beginnen.
mue_c schrieb:> du legst den Controller im Interrupt schlafen. Da dort die Ints global> abgeschaltet sind, bekommst du ihn über einen Int nicht wieder> aufgeweckt.
Tut mir leid, da komme ich gerade nicht mit. Stehe ich auf dem Schlauch?
Mit dem Disable Int0 wollte ich diesen bis zum nächsten Power_down:
deaktivieren, da die Taste 2 sonst keine 1 schreiben würde sondern immer
in Isr: springt.
Ich habe nun auch noch einen Versuch gestartet in dem ich die Isr: leer
gelassen habe.
1
Isr:
2
3
Return
Leider tut sich hier auch nicht mehr.
Der Controller bleibt im Tiefschlaf und auch die Stromaufnahme ändert
sich nicht.
Ist es möglich dass hier auch der Int1 noch eine Rolle spielt? Dieser
ist ja in meinem Code nirgendwo behandelt.
Ist es allgemein ratsam alle Eingänge mit Ddrx = &bxxxxxxxx festzulegen?
> ich hab mal gelesen
Da klingt nach "Programming by Gerücht". Da finde ich die
Fehlermeldungen eines kostenlosen Compilers, den nicht namentlich
genannt werden soll, besser. Der würde sowas nie zulassen. Und ich wüßte
auch warum.
Martin R. schrieb:> mue_c schrieb:>> du legst den Controller im Interrupt schlafen. Da dort die Ints global>> abgeschaltet sind, bekommst du ihn über einen Int nicht wieder>> aufgeweckt.> Tut mir leid, da komme ich gerade nicht mit. Stehe ich auf dem Schlauch?Maschde schrieb:> Isr_timer:> Abschaltzeit = Abschaltzeit + 1> If Abschaltzeit = 100 Then> Cls> Beleuchtung = 0> Gosub Power_down> End If> Return> ...> Power_down:> Enable Int0> Config Powermode = Powerdown> Return
Innerhalb der Timer_ISR legst du den Controller schlafen. Dabei gilt das
oben Gesagte. Also muss das Powerdown da raus. Powerdown kannst du nur
innerhalb einer ISR machen, wenn du die Ints wieder global eingeschaltet
hast, da muss man aber wissen, was man tut.
> Mit dem Disable Int0 wollte ich diesen bis zum nächsten Power_down:> deaktivieren, da die Taste 2 sonst keine 1 schreiben würde sondern immer> in Isr: springt.
Kannst du auch so machen, allerdings den Kommentar von Karl-Heinz
beachten.
Martin R. schrieb:>> goto 1?> Ich habe mal in einem Forum (weiß nicht mehr welches) gelesen, dass es> mit diesem Befehl möglich sei, an den Anfang (Zeile 1) des Codes zu> springen.
Zumindest die BASCOM Hilfe weiss von dieser Möglichkeit nichts.
Zumal es in BASCOM ja eigentlich auch gar keine Zeilennummern gibt, die
man anspringen könnte.
> Gibt es hierfür eine andere Möglichkeit? In meinem Fall soll ja das> Programm nach dem Aufwecken immer von vorne beginnen.
Der Normalfall ist:
Ein Programm macht nach dem Aufwachen genau an der Stelle weiter, an der
es eingeschlafen ist.
Damit ein Programm aber durch einen Interrupt wieder aufgeweckt werden
kann, müssen Interrupts auch erlaubt sein. Innerhalb einer ISR (wenn
also ein anderer Interrupt gerade abgearbeitet wird), sind die
Interrupts aber gesperrt. Und das ändert sich auch nicht, wenn du den
Prozessor schlafen legst. Gesperrte Interrupts führen aber im Gegenzug
wieder dazu, dass der Prozessor damit nicht mit einem Interrupt geweckt
werden kann.
(Ist dasselbe was auch mue_c schon geschrieben hat. Nur mit anderen
Worten)
Die Interrupt isr ist überflüssig wenn es ums wecken geht. Es reicht den
INT0 mit enable zu aktivieren und natürlich global. Statt config
powermode versuch mal nur:
Power Powerdown
Grüße, Uwe
Erst mal vielen Dank für die vielen schnellen Antworten!
Ich glaub jetzt hab ichs verstanden.
Ich miss also zusehen, dass ich den Powerdown Befehl aus der Timer-ISR
raus bekomme.
Wieder etwas dazugelernt ;-)
Ich werde das Ganze morgen austesten und mich dann nochmal melden.
Vielen Dank!
Ich habe zwar das Programm etwas umstricken müssen, aber das Powerdown
und Aufwecken funktioniert jetzt!
Es hat daran gelegen, dass der Powerdown Befehl in der isr des Timers
war.
Nun habe ich jedoch ein anderes Problem...
Dazu werde ich aber einen neuen Thread aufmachen, geht um was anderes.