Oh weh, da habe ich schlecht geraten - vielmehr völlig ungenügend das Datenblatt gelesen - - ich hatte einfach den Abschnitt Interrupt aufgeschlagen. Sorry ihr Beiden.Zitat:
Zitat von Besserwessi
Druckbare Version
Oh weh, da habe ich schlecht geraten - vielmehr völlig ungenügend das Datenblatt gelesen - - ich hatte einfach den Abschnitt Interrupt aufgeschlagen. Sorry ihr Beiden.Zitat:
Zitat von Besserwessi
aber nicht doch!
im kapitel 7.1.3 Power-Down Mode seite 31 steht als 3. satz (kopiert):
Only an External Reset, a Watchdog Reset, a Brown-out
Reset, an external level interrupt on INT0, or a pin change interrupt can wake up the MCU.
also kann JEDER dieser interrupts den tiny wieder wecken ...
auch aus dem power down modus.
Ich glaube, damit steht der Sieger in diesem kleinen Lesewettbewerb eindeutig fest.
Da steht im datenblatt aber auch die Einschränkung, das Int0 nur als Level Interrupts geht. Mit Pin Change interrupt ist der extra Pin-change Interruts gemeint, der auch die anderen Pins abdecken kann.
Was aber nicht geht ist Int0, wenn die Bits ISC01/ISC00 nicht 0/0 sind, also die Reaktion auf eine oder beide Flanken.
wo liest du, dass int0 nur als level interrupt geht? seite, kapitel?Zitat:
Zitat von Besserwessi
was meinst du mit "extra pin change" ??Zitat:
Zitat von Besserwessi
das kann ich auch nicht raus lesen:Zitat:
Zitat von Besserwessi
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.
übrigens hab ich das problem mit dem int0 geklärt.
zum laden des codes habe ich das lernprogramm und die platine von franzis verwendet - funktioniert ja, da bei den experimenten diverse codes in den tiny geladen wurden. aber solange nur diese codes lädt.
nur, was ich nicht bedacht habe, es bleibt aufgrund des noch vorhandenen bootladers PB1 für den datenaustausch mit dem pc aktiv ...
daran hatte ich nicht gedacht !!
ich muss also ein anderes programm zum echten "flashen" (mit PB5 > gnd) verwenden, damit ich den bootloader raus bringe und nur mehr mein code drin ist.
Das mit dem Int0 steht in der Fußnote zu Tabelle 11, und in der Erklärung zu External Interrupts.
Auch wenn da eine Bootloader drauf ist, kann man den Controller in den Powerdown Mode versetzen. Der Bootloader ist normalerweise nur direkt nach dem Reset aktiv. Wenn da kein Signal gefunden wird, wird das normale Programm gestartet ohne das der Bootloader wieder dran kommt. Man hat halt nur weniger Speicher (flash) zur verfügung als ohne Bootloader. Wenn man den Pin PB5 als reset lassen will, und über die Resetfunktion auswerten will, dann hat man natürlich mit den meisten Bootloadern ein Problem.
Grübelgrübelgrübel - ich habe das "Lernpaket Microcontroller" - und dazu habe ich ein Programm LPMicros und ein weiteres, das LPMicro ISP. Das erste lädt die Experimentierumgebung in den tiny13 - und der versprochene bzw. angeblich enthaltene Bootloader funktionierte bei mir leider nie. Daher hatte ich die selbst geschriebenen Programme als eigenständige Programme geschrieben und mit dem LPMicro ISP in den t13 geflasht. Lief immer bestens.Zitat:
Zitat von HeSt
Das LPMicros verwende ich immer noch und immer wieder. Es ist recht praktisch, damit mal eine LED anzuknipsen um deren Stromaufnahme zu messen, oder ähnliche, einfache Abläufe, die immer wieder mal vorkommen schnell aufzubauen und zu testen.
Ich grüße euch,
ich bin zwar auch nicht der Asm-Profi, aber ich versuche mal mitzuteilen wo (auch) ich eventuell ein Problem sehe.
Genau wie Besserwessi schon geschrieben hat, sehe ich auch an den gleichen Stellen ein grundsätzliches Problem.
Ich beziehe mich auf den einzigen geposteten Code von dir HeSt aus dem Post an dieser Stelle.
Wenn ich richtig geschaut habe, landen deine 3 Interrupt-Funktionen (und auch die nicht genutzten über main) alle wieder an einem "rjmp pwrdwn". Nun geht das main so von oben in diese sleep-Funktion.
Jetzt wird also mit dem "sleep" die CPU geparkt, und der erwartete Interrupt sollte seine Arbeit machen und wieder mit dem "rjmp pwrdwn" aus der ISR bzw. den aufgerufenen Funktionen irgendwie wieder, von oben zum "sleep" kommen.
Was aber dann nicht in den ISR-Funktionen ausgeführt wird ist der Befehl "reti".
Genau hier würde ich nun das Problem erwarten, da die AVR's (und wohl auch alle andere CPUs) das I am reti nutzen um einige Bits und Bytes in der Interrupt-Hardware/Register zu richten.
Da ich nun nicht weiß, ob dieses von dir benutzte Schema grundsätztlich funktioniert in dieser CPU, kann ich natürlich auf dem Holzweg sein.
Ich habe auch nicht geprüft, ob diese nicht durchgeführte Aktion vom fehlenden reti, in deinem Programm überhaupt eine Auswirkung hätte.
Meine ASM's hatte ich immer so geschrieben:
main
- init-Code
- sprungmarke: sleep
- jump sprungmarke
ISR
- tu was zu tun ist
- reti
--> reti wird ausgeführt, und im main geht es nach dem sleep mit speed wieder zum sleep. Genau so hatte Besserwessi ja auch schon geschrieben.
--> Ansonsten können nun die ISRs machen was sie wollen, und ich muss nicht darauf achten, dass sie alle wieder mit dem "rjmp pwrdwn" von oben zum sleep kommen. Sonst fehlt ja tatsächlich danach ein weiterer Befehl.
Hast du das, was ich gerade so umständlich beschrieben habe, somit schon erledigt? (Besserwessi hat nur ca. 2% meiner Wortanzahl benötigt ;-))Zitat:
Zitat von HeSt
Wohin springst du, wenn du ".. auf den anfang .." springst?
Ich hoffe, wir kommen gut in den Winter-Sleep und auch wieder raus.
Gruß Sternthaler
hallo sternthaler, danke für deine ausführungen.
ich werde leider mit dem tiny13 meine problemstellung in „normaler“ form – also ohne änderung der fuses – nicht realisieren können, da mir der port5 nicht als ein-/ausgang zur verfügung steht sondern nur als reset eingang.
und ich hab leider kein programm mit dem ich fuses ändern kann.
somit baue ich eine „hybrid“ lösung mit zusätzlichen herkömmlichen ic’s.
wie kann man das unterscheiden?Zitat:
Zitat von besserwessi
ich sehe keine möglichkeit, denn die i/o register werden alle resettet und das kann ich nicht brauchen, denn die ports müssen ihren status behalten um sie auslesen zu können.
und das lese ich nirgendwo raus, dass portb nicht auch auf 0 gestellt wird, samt ddrb.
portb, pinb und ddrb sind doch i/o register, oder irre ich hier?
auszug aus dem datenblatt:
During reset, all I/O Registers are set to their initial values, and the program starts execution from the Reset Vector.
eine frage noch zu den fuses:
ich müsste, um portb5 als „normalen“ ein-/ausgang verwenden zu können, das bit 4, SELFPRGEN Self Programming Enable im hi-byte der fuses umschießen – nachdem ich das programm geladen habe, denn sonst kann ich den tiny ja nicht mehr programmieren/flashen.
sehe ich das richtig?