Forum: Mikrocontroller und Digitale Elektronik Atiny13, Taster, int0, PowerDown und jede Menge Fragen :)


von Saito N. (saito84)


Lesenswert?

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 :)

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Saito N. (saito84)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Saito N. (saito84)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Saito N. (saito84)


Lesenswert?

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

von Saito N. (saito84)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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...

...

von Saito N. (saito84)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.