Hi, ich stehe mal wieder vor einem Problem. Ich versuche gerade eine
kleine Spielerrei zu bauen indem ich mit einem Atiny13 2 LED's ansteuern
möchte und zwar nacheinander.
Sprich im einschaltzustand soll LED1 an sein wenn ich den Taster drücke
soll LED1 aus und LED2 an. drücke ich nocheinmal den Taster soll alles
aus und der Atiny in den PowerDown modus.
So soweit ich das richtig rausgelesen habe kann ich auf INT0 im
Powerdown modus nur dann reagieren wenn dieser Low Level ist mit Falling
usw.. klappt das ja leider nicht.
So wenn ich die Schaltung nun einschalte geht LED1 an, drücke ich einmal
den Taster dann geht LED2 an und LED1 aus... soweit so gut, drücke ich
nochmal den Taster dann fängt alles Sporadisch an zu spinnen, LED2
Flackert, LED1 geht garnet an und überspringt zu LED2 usw...
Also alles im allem Funktioniert das nicht so wie ich mir das vorstelle
und ich stehe im Moment echt auf dem Schlauch :)
Bild meiner Schaltung: http://saitosan.de/pic/SAM_1854.JPG
1 | $regfile = "attiny13.dat"
| 2 | $crystal = 1000000
| 3 | $hwstack = 16
| 4 | $swstack = 5
| 5 | $framesize = 16
| 6 | Config Portb.4 = Output
| 7 | Config Portb.3 = Input
| 8 | Config Portb.2 = Output
| 9 | Config Portb.0 = Output
| 10 | Config Pinb.1 = Input
| 11 | Config Int0 = Low Level
| 12 | On Int0 Isr_key
| 13 | Enable Int0
| 14 | Enable Interrupts
| 15 |
| 16 | Pinb.1 = 1
| 17 |
| 18 | Dim Option As Integer
| 19 | Dim Bitkey As Bit
| 20 | Option = 0
| 21 |
| 22 | Portb.4 = 0
| 23 | Portb.0 = 0
| 24 |
| 25 | St1:
| 26 | If Bitkey = 1 Then
| 27 | Incr Option
| 28 | Bitkey = 0
| 29 | Waitms 120
| 30 | Enable Interrupts
| 31 | End If
| 32 |
| 33 | If Option = 0 Then Portb.0 = 1 : Portb.4 = 0
| 34 | If Option = 1 Then Portb.4 = 1 : Portb.0 = 0
| 35 |
| 36 | If Option = 2 Then
| 37 | Option = 0
| 38 | Bitkey = 0
| 39 | Enable Interrupts
| 40 | Powerdown
| 41 | End If
| 42 | Goto St1
| 43 |
| 44 | End
| 45 |
| 46 | Isr_key:
| 47 | Bitkey = 1
| 48 | Disable Interrupts
| 49 | Return
|
Mfg. Saito :)
> Pinb.1 = 1
Portb.1 = 1
du willst den Pullup Widerstand einschalten
> Waitms 120
Das halte ich für ein Gerücht, dass du es innerhalb 120ms schaffst einen
Taster zu drücken und wieder loszulassen. Ok, wenn man sich konzentriert
und genau darauf achtet, könnte es klappen. Aber 1/10 Sekunde ist schon
verdammt kurz.
Denk drann: Solange du den Taster gedrückt hältst, feuert auch der
Interrupt! Dies dewegen, weil er ja Level gesteuert ist! D.h. selbst
dann, wenn du dein waitms länger machen würdest UND selbst dann, wenn du
die Interrupts generell disablest, wird noch eine Interrupt Anforderung
registriert werden. Denn dieses registrieren geschieht ja nebenher und
auch dann wenn die Interrupts disabled sind.
So gehts also nicht.
Karl Heinz Buchegger schrieb:
>> Pinb.1 = 1
>
> Portb.1 = 1
>
> du willst den Pullup Widerstand einschalten
>
Richtig, danke den Fehler habe ich noch garnicht gesehen :)
>
> Denk drann: Solange du den Taster gedrückt hältst, feuert auch der
> Interrupt! Dies dewegen, weil er ja Level gesteuert ist! D.h. selbst
> dann, wenn du dein waitms länger machen würdest UND selbst dann, wenn du
> die Interrupts generell disablest, wird noch eine Interrupt Anforderung
> registriert werden. Denn dieses registrieren geschieht ja nebenher und
> auch dann wenn die Interrupts disabled sind.
> So gehts also nicht.
Ok, aus dem Aspekt habe ich das ganze noch garnicht betrachtet, steige
halt gerade erst in die MC-Welt ein :)
Wie könnte ich sonst mein Ziel erreichen, ich möchte halt alles über
einen Taster machen, und dabei versuchen mit sowenig Bauteilen wie
möglich und nur so vielen wie nötig meine Schaltung, im moment bin ich
schon froh wenn beide LED'S nach einander Schalten, er im Powerdown
modus geht und beim nächsten Tastendruck quasi wieder auf Anfang steht
:)
Mfg. Saito
Saito N. schrieb:
> Wie könnte ich sonst mein Ziel erreichen, ich möchte halt alles über
> einen Taster machen, und dabei versuchen mit sowenig Bauteilen wie
> möglich und nur so vielen wie nötig meine Schaltung, im moment bin ich
> schon froh wenn beide LED'S nach einander Schalten, er im Powerdown
> modus geht und beim nächsten Tastendruck quasi wieder auf Anfang steht
> :)
Tastenauswertung über externen Interrupt ist meistens der falsche Weg.
Achtung: Auswertung! Das gilt jedoch nicht für das Aufwecken aus dem
Powerdown!
D.h. der Interrupt holt den µC aus dem Powerdown. Mehr nicht!
Die Tastenauswertung macht zb weiterhin das BASCOM übliche Debounce.
Versuch nicht beides, Tastenauswertung und Aufwecken, mit ein und
demselben Mechanismus zu erschlagen.
D.h. schreib dein Programm erst mal ohne den Powerdown. So wie du die
Funktionalität da machen würdest.
Ist alles fertig, ergänzt du den Powerdown, in dem du den µC gezielt an
strategischen Stellen schlafen legst. In der Interrupt Routine machst du
im Grunde gar nichts. Du brauchst den Interrupt nur dazu, damit die
Programmausführung nach der Anweisung PowerDown weitergeht. Nicht mehr.
Ok zur Not muss ich die Schaltung mit 2 Tastern realisieren.
Aber gibt es denn eine Möglichkeit aus Bascom, mit inline ASM oder so
dem Atiny zu sagen reagiere nicht auf die Resetleitung, sprich die
Resetleitung zu deaktivieren das sie zwar auf gnd liegen kann aber kein
Reset ausführt.
Bevor ich dann in den PowerDown Modus schalte aktiviere ich die
Resetleitung wieder und verbinde reset mit dem Taster und gehe beim
interrupt vom Low Level auf Falling und wenn ich dam im Ruhemodus bin
resete ich halt den ATiny wieder denn das programm soll ja schliesslich
aus dem Ruhemodus wieder von Vorne starten.
Wäre das in irgendeiner weise möglich?
Mfg. Saito.
Saito N. schrieb:
> Ok zur Not muss ich die Schaltung mit 2 Tastern realisieren.
Warum?
Nur weil du den Taster am Interrupt Pin hast, heißt das ja nicht, dass
du den Debounce da nicht darauf ansetzen kannst.
Der Pin behält ja nach wie vor seine normale Funktion. Er löst halt
zusätzlich noch einen externen Interrupt aus. Aber abgesehen davon
ändert sich ja nichts.
>
> Aber gibt es denn eine Möglichkeit aus Bascom, mit inline ASM oder so
> dem Atiny zu sagen reagiere nicht auf die Resetleitung, sprich die
> Resetleitung zu deaktivieren das sie zwar auf gnd liegen kann aber kein
> Reset ausführt.
Das ist eine Fuse-Sache. Aber das solltest du dir gut überlegen. Denn
wenn der Reset-Pin seine Funktion verliert, dann kannst du den µC auch
nicht mehr mittels ISP Programmierung neu programmieren.
> Bevor ich dann in den PowerDown Modus schalte aktiviere ich die
> Resetleitung wieder und verbinde reset mit dem Taster und gehe beim
> interrupt vom Low Level auf Falling und wenn ich dam im Ruhemodus bin
> resete ich halt den ATiny wieder denn das programm soll ja schliesslich
> aus dem Ruhemodus wieder von Vorne starten.
>
> Wäre das in irgendeiner weise möglich?
Klingt nach einem völlig verkorkstem WEg.
Karl Heinz Buchegger schrieb:
> Saito N. schrieb:
>> Ok zur Not muss ich die Schaltung mit 2 Tastern realisieren.
>
> Warum?
>
> Nur weil du den Taster am Interrupt Pin hast, heißt das ja nicht, dass
> du den Debounce da nicht darauf ansetzen kannst.
> Der Pin behält ja nach wie vor seine normale Funktion. Er löst halt
> zusätzlich noch einen externen Interrupt aus. Aber abgesehen davon
> ändert sich ja nichts.
>
Achso, dann hatte ich das eben nur falsch verstanden, joa das ist eine
gute Idee, werde ich mich nachher nochmal ransetzen und das ganze
versuchen.
>> Wäre das in irgendeiner weise möglich?
>
> Klingt nach einem völlig verkorkstem WEg.
Ok wenn das so ist, stimme ich dir zu, war halt nur so ein Blitzgedanke
:)
Mfg. Saito
So kleine Rückmeldung von mir, hat nun alles so geklappt besten Dank für
die Anregungen, die Schaltung macht nun genau das was ich möchte nun
kann ich anfangen alles auf Lochraster zu löten :)
Für alle die es interessiert wie ich das Realisiert habe unten der Code,
für Verbesserungsvorschläge bin ich immer zu haben :)
Alles in allem belegt das nun 50% im ATiny 13-20PU
Bzw. kann ich noch mehr Stromeinsparpotential rausholen?
Mfg. Saito
1 | $regfile = "attiny13.dat"
| 2 | $crystal = 1000000
| 3 | $hwstack = 16
| 4 | $swstack = 16
| 5 | $framesize = 16
| 6 |
| 7 | Config Portb.0 = Output
| 8 | Config Pinb.1 = Input
| 9 | Config Portb.2 = Output
| 10 | Config Portb.4 = Output
| 11 | Config Int0 = Low Level
| 12 |
| 13 | On Int0 Isr_1
| 14 |
| 15 | Led1 Alias Portb.0
| 16 | Led2 Alias Portb.4
| 17 | Led3 Alias Portb.2
| 18 |
| 19 | Dim Option As Integer
| 20 | Dim I As Integer
| 21 |
| 22 | Portb.1 = 1
| 23 | Option = 0
| 24 | Gosub Allon
| 25 | Waitms 700
| 26 |
| 27 | Prg:
| 28 |
| 29 | Debounce Pinb.1 , 0 , Bkey , Sub
| 30 |
| 31 | If Option = 0 Then
| 32 | Gosub Alloff
| 33 | Led1 = 1
| 34 | End If
| 35 |
| 36 | If Option = 1 Then
| 37 | Gosub Alloff
| 38 | Led2 = 1
| 39 | End If
| 40 |
| 41 | If Option = 2 Then
| 42 | Gosub Alloff
| 43 | Led3 = 1
| 44 | End If
| 45 |
| 46 | If Option = 3 Then
| 47 | Gosub Allon
| 48 | End If
| 49 |
| 50 | If Option = 4 Then
| 51 | For I = 0 To 5
| 52 | Gosub Allon
| 53 | Waitms 250
| 54 | Gosub Alloff
| 55 | Next I
| 56 | Enable Int0
| 57 | Enable Interrupts
| 58 | Option = 0
| 59 | Powerdown
| 60 | Disable Int0
| 61 | Disable Interrupts
| 62 | End If
| 63 | Goto Prg
| 64 |
| 65 |
| 66 | Isr_1:
| 67 | Return
| 68 |
| 69 | Bkey:
| 70 | Incr Option
| 71 | Return
| 72 |
| 73 | Alloff:
| 74 | Led1 = 0
| 75 | Led2 = 0
| 76 | Led3 = 0
| 77 | Return
| 78 |
| 79 | Allon:
| 80 | Led1 = 1
| 81 | Led2 = 1
| 82 | Led3 = 1
| 83 | Return
|
Saito N. schrieb:
> Alles in allem belegt das nun 50% im ATiny 13-20PU
Das ist viel für das bissel Funktionalität.
Schau Dir mal Select Case an, ist bestimmt effizienter als die If-Orgie.
Schau auch mal ins Datenblatt, wie schnell ein Tiny13 rennen kann, 1 MHz
steht nämlich nicht zur Auswahl. Deine $Crystal-Definition, auf der die
Warteschleifenberechnung beruht, stimmt also nicht.
>
> Bzw. kann ich noch mehr Stromeinsparpotential rausholen?
Ja sicher doch. Man kann z.B.:
- den AC deaktivieren (ACD in ACSR),
- einen entsprechenden Sleep-Modus wählen (SM0, SM1 und SE in MCUCR),
- den Takt reduzieren (Vorsicht, nicht jeder ISP-Programmer kann
seinen ISP-Takt soweit reduzieren, dass er unter 1/4 des AVR-Taktes
bleibt...
...
Hannes Lux schrieb:
> Schau auch mal ins Datenblatt, wie schnell ein Tiny13 rennen kann, 1 MHz
> steht nämlich nicht zur Auswahl. Deine $Crystal-Definition, auf der die
> Warteschleifenberechnung beruht, stimmt also nicht.
Im Datenblatt steht:
1 | Operating Voltage:
| 2 | – 1.8 - 5.5V for ATtiny13V
| 3 | – 2.7 - 5.5V for ATtiny13
| 4 | • Speed Grade
| 5 | – ATtiny13V: 0 - 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V
| 6 | – ATtiny13: 0 - 10 MHz @ 2.7 - 5.5V, 0 - 20 MHz @ 4.5 - 5.5V
| 7 | • Industrial Temperature Range
| 8 | • Low Power Consumption
| 9 | – Active Mode:
| 10 | • 1 MHz, 1.8V: 240 μA
| 11 | – Power-down Mode:
| 12 | • < 0.1 μA at 1.8V
|
Dort steht im Activ mode 1 MHz! das habe ich leider auch noch nicht ganz
begriffen wo ich nun genau sehen kann mit welchem Takt ein Atmel rennt.
Select Case werde ich mal anwenden und schauen ob das den Code Drückt.
> Ja sicher doch. Man kann z.B.:
>
> - den Takt reduzieren (Vorsicht, nicht jeder ISP-Programmer kann
> seinen ISP-Takt soweit reduzieren, dass er unter 1/4 des AVR-Taktes
> bleibt...
Wie bzw wo kann ich den Takt reduzieren?
Ich arbeite mit dem Pollin Evu. Board 2.01 und PonyProg.
Mfg. Saito
Saito N. schrieb:
> Dort steht im Activ mode 1 MHz!
Das ist ein Kopierfehler, der Text wurde von anderen Datenblättern
kopiert. Schau lieber mal im Kapitel Clock Sources nach, da wirst Du
sehen, dass 1MHz nicht zur Auswahl steht.
Saito N. schrieb:
> Wie bzw wo kann ich den Takt reduzieren?
Du meinst den ISP-Takt. Gute Programmer-Software wie das AVR-Studio hat
dafür eine Einstellmöglichkeit.
Saito N. schrieb:
> Ich arbeite mit dem Pollin Evu. Board 2.01 und PonyProg.
Tja, da weiß ich nicht bescheid. Ich nutze STK500, Dragon und AVR-Studio
4.15. Gibt es dafür keine Doku? Ich habe mal was von "veryslow" gehört,
Gugel meint dazu: http://www.google.de/search?q=ponyprog+very+slow
...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|