Hallo zusammen, mache gerade meine ersten Gehversuche mit einem tiny15 und Assembler mit AVR Studio4. Dieser soll sich mit einer Taste aus dem Power down einschalten und sofort eine LED leuchten lassen. Mit einem weiteren Tastendruck der gleichen Taste soll die LED blinken. Beim nächsten Tastendruck soll der tiny wieder in den Power down Modus. als absoluter Neuling habe ich die Einzelfunktionen so leidlich hinbekommen, jedoch nicht auf einer Taste! also: LED an - ok / Led blinken - mit PWM, aber noch zu schnell / schlafen - klappt auch / aufwecken noch mit der Reset Taste vom STK500 Ich wäre um jeden Denkanstoß aber gerne auch etwas weitergehende Hilfe dankbar. Die eigentliche Frage ist wohl, wie ich es hinbekomme, dass eine Taste zum Aufwecken einen Interrupt auslöst und dann im Programm nicht. Grüße aus dem Ruhrpott Klaus
Ich hoffe, du hast die Taste an PB2/INT0 ngeschlossen (schliesser auf gnd). Wenn du am blinken bist und die Taste gedrückt wird: - Externen Interrupt auf "Lowlevel" und "enablen" (ext. und global) - Sleep starten Bei einem langen Tastendruck (PB2 auf gnd) erfolgt ein Interrupt. In den Start springen, ext.Int. nicht freigeben. für mehr Assemblerunterstützung: http://www.avr-asm-tutorial.net/avr_de/index.html PS: der tiny15 ist abgelaufen, nur noch zum basteln gut wenn er sonst rumliegt! gruß hans
Hallo Hans, danke für die schnelle Antwort! > Ich hoffe, du hast die Taste an PB2/INT0 ngeschlossen noch nicht, aber in ein paar Minuten ;-) Das weitere zeigt mir die Richtung - ich weiß auf jeden Fall, worüber du sprichst. Gestern wäre das noch anders gewesen..... > PS: der tiny15 ist abgelaufen.... oha, den habe ich die Tage erst bei R angeschafft. Oder hätte ich jetzt tiny15L schreiben sollen? Ist der auch abgelaufen? Gibt es was vergleichbares mit 3,3V Betriebsspannung und auch nicht größer? Werde erst einmal versuchen, deine Vorschläge umzusetzen. viele Grüße Klaus
zwischenbilanz: sobald der externe Interrupt enabled wird, läuft er über sleep hinweg und fängt wieder am Programmanfang - besser gesagt - mit dem zweiten Befehl wieder an. was das??? wird der Interrupt nicht enabled, hält er brav an, lässt sich jedoch nicht starten.
Schau mal bei Hannes, da habe ich mal Spielereien mit Tiny15 und Sleep gesehen: http://www.hanneslux.de/avr/divers/melody/melody01.html http://www.hanneslux.de/avr/divers/melody/index.html KH
Du musst in der Interrupt Addresse ein rjmp auf deine Interrupt-Funktion setzen. Am besten zeig mal Code her von Dir. .org INT0addr rjmp int0_handler ; IRQ0 Handler int0_handler: //Tu was oder auch nit reti Gruß
Du musst in Deinem Programm warten, bis die Taste wieder losgelassen wird, bevor Du den Controller in den Sleep schickst. Ansonsten wacht er gleich wieder auf. Gruß Jörg
Die Standardlösung: - Pin-Change-Interrupt weckt AVR auf, schaltet Sleepmode aus. - standard Entprell- und Tastendruckerkennungsroutine im Timerinterrupt. - Mainloop wertet Tastendruck-Flag aus und macht Aktion. - passiert etwa 500ms keine Aktion, setzt der Timerinterrupt den Sleepmode. - Mainloop führt Sleep aus. Optional: - PCI disabled sich selbst - Timerinterrupt enabled PCI wieder beim Sleepmode setzen Peter P.S.: Da man beim ATtiny15 den PCI nicht maskieren kann, müssen alle unbenutzten Pins auf festes Potential gesetzt werden!
Also, mal eins nach dem anderen, ich verliere jetzt schon fast den Überblick. Ich bin keinesfalls an den tiny 15L gebunden, jeder andere AVR wäre mir genauso recht, einzigste Vorausetzung: er muß mit 3,3 Volt laufen und klein sein. Vielleicht gibt es da ja einen, für den es schon ein fertiges prg gibt. Das Programm von Hanneslux ist - wie ich es beurteilen kann - erstklassig! Ich würde nach Rücksprache mit Hannes auch gerne Teile davon benutzen, jedoch startet das Prg bei drücken der (für mich einen) Aufwachtaste das Prg jedesmal neu. Man kann mit der Taste also in dem Zustand weder andere Dinge auslösen, noch den Tiny schlafen schicken. Den Vorschlag von Jörg habe ich mit einer ellenlangen warteschleife ausprobiert - erfolglos, vielleicht habe ich ja was falsch gemacht. Die Sachen von Fabian und Peter werde ich jetzt mal angehen. in dem Zuge werde ich auch den Code mal aufräumen, so dass man ihn zeigen kann. ;-) Danke an alle Klaus
Klaus W. wrote:
> Ich bin keinesfalls an den tiny 15L gebunden
Dann würde ich zum ATtiny13 oder 25 raten.
Diese Typen sind derzeit in Produktion und gut erhältlich.
Außerdem kann man sie in C programmieren.
Peter
Peter wrote: >Außerdem kann man sie in C programmieren.< Faulpelz^^. Gruß
Peter wrote: >Außerdem kann man sie in C programmieren.< Das kann man auch in BASCOM (wenn man es denn kann), muss man aber nicht. ;-) KH
Hier mal die Statemaschine in C (AVR-GCC) für nen ATtiny13:
1 | int main( void ) |
2 | {
|
3 | u8 state = 0; |
4 | |
5 | PORTB = 0xFF; // all IOs high (LEDs off, Pullups on) |
6 | LED0_DDR = 1; |
7 | LED1_DDR = 1; |
8 | PCMSK = 1<<KEY0; // PCINT on Key0 |
9 | get_key_init(); |
10 | sei(); |
11 | |
12 | for(;;){ |
13 | |
14 | if( get_key_press( 1<<KEY0 ) ) |
15 | state++; // next state on every key press |
16 | |
17 | switch( state ){ |
18 | case 2: // LED flashing |
19 | sleep_timer = 0; // no sleep on flashing |
20 | if( flash_timer != FLASH_ON ){ // on time |
21 | if( flash_timer < FLASH_ON + FLASH_OFF ) // off time |
22 | break; |
23 | |
24 | case 1: |
25 | flash_timer = 0; |
26 | LED0 = 0; // LED on |
27 | break; |
28 | |
29 | case 0: |
30 | default:
|
31 | state = 0; |
32 | }
|
33 | LED0 = 1; // LED off |
34 | break; |
35 | }
|
36 | |
37 | LED1 = 1; // for debug only |
38 | // LED1 = off: power down
|
39 | sleep_cpu(); |
40 | LED1 = 0; |
41 | }
|
42 | }
|
Ist aber noch nicht getestet. Im Anhang das komplette Programm. Peter
So, aufm STK500 läuft es. Ein kleiner Fehler ist noch in der Pindefinition für die LED drin gewesen. Peter
Hallo, so, spät war es gestern abend, da hatte ich mein kleines micro - beast soweit, dass es macht, was es soll! -stolz- Ist zwar mit der Keule programmiert, es ging aber erst einmal um die Funktion..... so wie ich das jetzt sehe, war noch jemand sehr produktiv. Obwohl ich von "C" nur weiß, das es der dritte Buchstabe im Alphabet ist ;-) , lässt sich doch erahnen, dass es das gleiche tut, wie mein "Keulenprg" auch -- was, aber zum Himmel ist eine Statemaschine??? Oder liege ich falsch? Riesig! Danke an Peter. So wie ich gerade gesehen habe, läuft das Tiny13 Ding auch unter 3,3V und hat auch nur 8 Beine. werde vermutlich erstmal meine paar tiny15 verbauen und mich bei weiterem Bedarf noch mit C befassen und dann auf die "Peter-Version" umsteigen. Ich habe mal angehängt,was das überhaupt werden soll: Bin aber gestern wohl auf den Geschmack gekommen und habe schon ein neues Projekt im Auge, wo gottlob kein Termin hintersteht. Grüße Klaus
http://de.wikipedia.org/wiki/Endlicher_Automat Wenn ich deine Aufgabe hätte machen müssen wäre das erste was mir eingefallen wäre ein Zustandsautomat gewesen ;-)
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.