Forum: Mikrocontroller und Digitale Elektronik einfacher Schlafmodus und aufwecken Attiny13


von Osram L. (therealosram)


Lesenswert?

Hallo Leute,

ich hab schon drei Abende in Foren und auf Internetseiten geschaut, aber 
ich komm einfach nicht weiter. Wahrscheinlich ist das für die meisten 
hier nur ein Klax, aber ich raff's einfach noch nicht.

Ich möchte für meinen Kleinen eine Blinkschaltung mit Batterie bauen. 
Löten und Platinenbau ist kein Problem. In der Schalung soll ein 
Attiny13 auf Tastendruck (Pinb.2) "aufwachen" und zwei LEDs (Pinb.3/4) 
abwechselnd für eine kurze Zeit blinken lassen und dann wieder in 
Stromsparmodus verfallen um Batteriestrom zu sparen. Ich verwende 
BASCOM-AVR weil das für mich und meine Zwecke die einfachste Srache zu 
seien scheint. Ich komme aber einfach nicht weiter. Bitte helft mir.

Hier die Anfänge des Codes:

$regfile = "attiny13.dat"
$crystal = 128000

Stop Ac
Stop Adc

Dim A As Integer
Dim B As Integer
Dim I As Integer

A = 50
B = 200

For I = 0 To 20

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

Next I

von Peter D. (peda)


Lesenswert?

Beitrag "AVR Sleep Mode / Knight Rider"

ist aber in C (kann kein Bascom).

Peter

von Julian B. (julinho)


Lesenswert?

Mit Bascom wirst du wohl nicht sehr viele Tipps bekommen, weiter 
verbreitet bei den AVRs sind C und Assembler.

Prinzipiell mußt du eine oder mehrere Interrupt freischalten, die den 
Prozessor aufwecken können.
Dann schickts du den Prozessor schlafen und mit dem ersten auftretenden 
Interrupt wird die entsprechende Routine ausgeführt und danach macht der 
Prozessor nch der SLEEP-Anweisung weiter.

von Herr M. (herrmueller)


Lesenswert?

Ich kann jetzt kein Bascom, aber aufwachen aus dem Power Down Sleep geht 
nur mit INT0 (PinB2).

Vielleicht kommt ja auch mein BLINKY61 mit 6 Leds in Frage. Wacht mit 
einer Taste auf und geht nach programmierbaren 2-63min in Power Down.

Beitrag "Blinky61 - vielseitiges Blink- und Lauflicht - ATtiny13 mit 6 LEDs [ASM]"

Auch Attiny13 mit 6 Leds und 3 Widerständen


gruss herrmueller

von Osram L. (therealosram)


Lesenswert?

@herrmüller

Vielen Dank für die Antwort.

Leider kann ich kein Assembler und kann somit den Code nicht für meine 
Bedürfnisse umschreiben. Vom Grundsatz her ist das aber genau was ich 
suche.

@julinho

Ebenfalls vielen Dank für die Antwort,

mir ist aber nicht so ganz bewusst wie ich die Interups einstelle, 
welche ich benutze und welcher Schlaf- und Aufwachbefehl das Ganze 
steuert.

Gruß OsRam

von Peter D. (peda)


Lesenswert?

Herr Mueller schrieb:
> Ich kann jetzt kein Bascom, aber aufwachen aus dem Power Down Sleep geht
> nur mit INT0 (PinB2).

Nö, Aufwachen geht mit jedem Pin (Pin-Change-Interrupt).


Peter

von Herr M. (herrmueller)


Lesenswert?

Udo Leucht schrieb:
> Leider kann ich kein Assembler und kann somit den Code nicht für meine
> Bedürfnisse umschreiben. Vom Grundsatz her ist das aber genau was ich
> suche.


Was brauchst Du denn genau ?

von Julian B. (julinho)


Lesenswert?

Den Tiny13 kannst du nur über einen Levelinterrupt aus dem Schlaf 
aufwecken(siehe tabelle 7.1), der Tiny kann nur einen 
Low-Level-Interrupt,
d.h. zum Aufwecken muß der Pegel an INT0 von High auf Low gehen.

Dazu musst du ISC00 und ISC01 auf 0 setzen (tabelle 9.2)
Außerdem mußt du in GIMSK INT0 setzen, damit der Interrupt 
freigeschaltet ist.
Dann musst du noch eine ISR-Routine schreiben, die durch INT0 ausgelöst 
wird.

Dann schickts du den Prozessor schlafen, dazu gibts in C eine Library, 
in Bascom mit Sicherheit auch.

von Osram L. (therealosram)


Lesenswert?

@ herrmüller

Auf Tastendruck sollen die LED (blau) an 3 und 4 20mal abwechselnd für 
50 ms doppelt aufblitzen und danach soll der Controller wieder 
abschalten.

von Julian B. (julinho)


Lesenswert?

mit Pinchange gehts auch.

von Herr M. (herrmueller)


Lesenswert?

@PeDa und julinho

ja, ich habe das 'and' in der Tabelle  'INT0 and Pin Change' überlesen.

von Osram L. (therealosram)


Lesenswert?

Entschuldigt wenn ich frage, aber von welcher Tabelle redet Ihr?

von Osram L. (therealosram)


Lesenswert?

Das war ein Versuch, aber der geht auch nicht

$regfile = "attiny13.dat"
$crystal = 128000

Dim I As Integer
Dim A As Integer
Dim B As Integer

Config Pinb.2 = Input
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Int0 = Low Level

Enable Interrupts

Portb.2 = 1

On Int0 Button:
Enable Int0

Do
  Powerdown
Loop

Button:
  For I = 0 To 1

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

   Next I
Return

End

von Sam .. (sam1994)


Lesenswert?

Vom Datenblatt?

von Herr M. (herrmueller)


Lesenswert?

Tabelle 11 Seite 28 in der allerseits so ungeliebten 
'Bedienungsanleitung des Attiny13' = Datenblatt.


>20mal abwechselnd für
>50 ms doppelt aufblitzen


Heisst das LED3  50ms an ?ms aus 50ms an und dann
LED4  50ms an ?ms aus 50ms an und dann noch 19 mal ?



Fall Du wie oben doch INT0 nimmst, der ist port b.1

von Osram L. (therealosram)


Lesenswert?

@herrmüller

3 an
50ms
3 aus
50ms
3 an
50ms
3 aus

200ms

4 an
50ms
4 aus
50ms
4 an
50ms
4 aus

200ms

20mal wiederholen

Im Code habe ich bei den Ports einige Fehler entdeckt. Aber die Anwahl 
der Interrupts erschließt sich mir einfach nicht

von Osram L. (therealosram)


Lesenswert?

@ julinho

- d.h. zum Aufwecken muß der Pegel an INT0 von High auf Low gehen.

Das weis ich. Der Taster mus den Kontakt gegen Masse ziehen.

- ISC00 und ISC01 auf 0 setzen (tabelle 9.2)
- GIMSK INT0 setzen

Kann mir dazu jemand Codebeispiele geben?

- ISR Routine

hab ich glaub ich schon

von Herr M. (herrmueller)


Lesenswert?

Udo Leucht schrieb:
> Kann mir dazu jemand Codebeispiele geben

Wahrscheinlich sind die Bascom-Könner schon alle im Bett ;-)
Warte besser bis morgen.

von Julian B. (julinho)


Lesenswert?

was geht denn nicht, schläft er ncht oder wacht er nicht auf?

von Osram L. (therealosram)


Lesenswert?

Mein letzter Versuch für heute.
Er lässt sich nicht in den Schlafmodus versetzten.


$regfile = "attiny13.dat"
$crystal = 128000

Dim I As Integer
Dim A As Integer
Dim B As Integer
Dim V As Integer

A = 50
B = 200

Config Pinb.2 = Input
Config Pinb.3 = Output
Config Pinb.4 = Output
Set Portb.2

On Int0 Button
Config Int0 = Low Level
Enable Int0
Enable Interrupts

Entry:
Mcucr = Mcucr And &B10101111
Mcucr = Mcucr Or &B10100000
sleep
Goto Entry

End


Button:
  For I = 0 To 10

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

         Portb.4 = 1
         Waitms A
         Portb.4 = 0
         Waitms A
         Portb.4 = 1
         Waitms A
         Portb.4 = 0

         Waitms B

   Next I
Return

End

Für heute Gute Nacht

von Herr M. (herrmueller)


Angehängte Dateien:

Lesenswert?

Leider kann ich ja kein Bascom, deswegen habe ich mal was in Assembler 
gemacht. Vielleicht kannst Du die HEX Datei ja flashen.
Da es irgendwie nach einer Polizeiwagendachbeleuchtung aussieht, habe 
ich noch ein Tatü-Tataa 'Sound' an PB0 dazugemacht.

Takt des Attiny13 auf 4.8MHz und CKDIV8 setzen -> 600 KHz.

Der Programmablauf ist 'Spaghetti-maessig', da kann man sogar als nicht 
Assemblaner was dran ändern ;-)

viele Gruesse herrmueller

von therealosram (Gast)


Lesenswert?

@ herrmüller

Vielen Dank, genau das habe ich gesucht.
Ich konnte die HEX-Datei laden und musste nur des Taster an einen 
anderen Pin löten. Im Ruhestrom habe ich 0,4 mA gemessen. Kann man das 
noch verringern?

von Peter D. (peda)


Lesenswert?

therealosram schrieb:
> Im Ruhestrom habe ich 0,4 mA gemessen. Kann man das
> noch verringern?

Das dürfte dem Idle entsprechen.
Im Power-Down sollten es <0,02mA sein.


Peter

von therealosram (Gast)


Lesenswert?

@herrmüller

Ich muss mich korrigieren. Der Strom liegt bei 16 µA. Das hält ne Weile 
mit zwei Ladyzellen.

@Alle

Ich wäre trotzdem dankbar für ein laufendes Programm mit BASCOM, denn 
ich hab immer noch nicht verstanden, wie das eigentlich funktioniert. Da 
ich dienstlich viel mit VBA mache und BASCOM dem ähnelt, möchte ich mich 
nicht mit einer weiteren Sprache beschäftigen.

von Ziegenpeter (Gast)


Angehängte Dateien:

Lesenswert?

Ich kann zwar auch nicht mit BASCOM dienen, wollte mich aber trotzdem 
beschweren, dass oben behauptet wird, man kommt aus dem power down nur 
über INT0 oder Pin-change.
Es geht auch mit dem Watchdog.
Anbei mein asm-Beispiel-Code dazu.

von Herr M. (herrmueller)



Lesenswert?

Ich hatte vergessen, im Sleep modus die Ausgänge abzuschalten.

Jetzt dürfte kein nennenswerter Strom mehr fliessen. Je nachdem, ob Du 
den Ton Ausgang beschaltet hast, die Hex Datei mit oder ohne Ton wählen 
(Pullup aus oder an).

In Deinem Bascom Programm sehe ich immer noch PinB.2 als input und INT0 
(das ist PinB.1) als Interrupt.

Mein Programmablauf:
(*A)
Ich habe für den Powerdown Modus MCUCR auf 00110010 gesetzt = Powerdown 
und INT0 fallende Flanke
Ausserdem GIMSK auf 01000000 , das heisst INT0 Interrupt erlauben.
dann sleep

Wenn die Taste gedrückt wird, wird die IR.routine aufgerufen, in der ich 
nur den INT0 IR. sofort wieder sperre, damit die Taste nicht andauernd 
IR auslöst -> GIMSK = 0

Danach blinken dann im Hauptprogramm die LEDs und dann wieder nach (*A)


@Ziegenpeter   Es ging nur darum, den µC mit einer Taste zu erwecken.

von Ziegenpeter (Gast)


Lesenswert?

Ah ok, hab ich überlesen.

von Herr M. (herrmueller)


Lesenswert?

Berichtigung, für Powerdown Modus  muss MCUCR auf 00110000 gesetzt 
werden = Powerdown und INT0 low Level.

Ich habe gerade gegoogelt und man kann scheinbar in BASCOM auch

Mcucr = Bits(se , Sm1)
sleep

schreiben, das ist ja fast so schön wie in Assembler, da weiss man doch 
was man hat.

Ausserdem ist mir aufgefallen > $crystal = 128000 < , wenn der Tiny 
nicht auch mit 128kHz läuft (würde ich eigentlich nicht dazu raten), 
werden die Zeiten nicht stimmen.

Also teste es mal mit :


Config Int0 = Low Level
Enable Int0
Enable Interrupts
Mcucr = Bits(se , Sm1)
sleep

dann in der IR Routine

Disable Int0   (wenn es das so gibt)
return

und im Hauptprogramm nach sleep das Geblinke.


gruss  herrmueller

von therealosram (Gast)


Lesenswert?

eine Andere Frage, die Ihr bestimmt auch beantworten könnt:

über 3V Ruhestrom 1,6µA
unter 3V Ruhestrom >200µA

Kann mir das jemand erklären?

von Sam .. (sam1994)


Lesenswert?

Ziegenpeter schrieb:
> Es geht auch mit dem Watchdog.

Der braucht leider relativ viel Strom.

von Herr M. (herrmueller)


Angehängte Dateien:

Lesenswert?

So, jetzt habe ich mir doch tatsächlich das Bascom einmal runtergeladen 
und installiert und ein bisschen was gelesen. Dann habe ich mein 
Assemblerprogramm ziemlich direkt umgesetzt. Vieles ist wie Assembler, 
nur längere Befehle, mit längeren Wörtern ;-)

Auch habe ich gelernt, dass es den Sleep Befehl so wohl gar nicht gibt. 
Deshalb setzte ich die Register 'assembler-mässig' und benutze !sleep 
als direkten Assemblerbefehl.

'--------

$regfile = "attiny13.dat"
$crystal = 600000
$hwstack = 16
$swstack = 16
$framesize = 16

Dim B As Byte
Dim A As Byte
Dim I As Byte

A = 50
B = 200


On Int0 Button               ' bei Tasten-IR Tasten-IR wieder sperren

'Timer Für Tonerzeugung Initialisieren
Config Timer0 = Timer , Compare A = Toggle , Prescale = 8 , Clear Timer 
= 1                            ' fürn Ton



Haupt:



' PortB Einstellungen für Sleep

Ddrb = 0                      ' Config PinB.alle = Input
Set Portb.2                   ' nicht angeschlossen, deshalb Pullup an
Set Portb.1                   'Pullup für Taste

Config Int0 = Low Level       ' INT0 auf Low Level und anschalten und 
Enable Int0                   ' alle IR. erlauben
Enable Interrupts



Mcucr = Bits(se , Sm1)        ' Powerdown Sleepmodus laut Datenblatt
!sleep                        '  Assemblerbefehl für schlafen legen



' Hier erwacht der Controller nach Tastendruck  - und der IR Routine

' PortB Einstellungen für Betrieb
Config Pinb.0 = Output        ' Ton
Config Pinb.1 = Input         ' Taste
Config Pinb.3 = Output        ' Led
Config Pinb.4 = Output        ' Led
Set Portb.1                   ' Pullup für Taste



' endlich blinken
   For I = 0 To 20

   Ocr0a = 151                ' spiele ein 'c' an PB0

         Portb.3 = 1
         Waitms A
         Portb.3 = 0
         Waitms A
         Portb.3 = 1
         Waitms A
         Portb.3 = 0

         Waitms B

   Ocr0a = 114                ' spiele ein 'f' an PB0

         Portb.4 = 1
         Waitms A
         Portb.4 = 0
         Waitms A
         Portb.4 = 1
         Waitms A
         Portb.4 = 0

         Waitms B

   Next I

Goto Haupt              ' und wieder abschalten (sorry für das Goto - 
aber ein bisschen Basic muss sein)

'------------------------------------

'Interrupt Routine für INT0 -> Taste

Button:                  ' Tasten-IR wieder sperren

     Disable Int0

Return


End


'------


bei mir geht es so

lustige Sache, dieses Bascom, man muss sich mehr Wörter merken, aber 
weniger Bitbezeichnungen und Register. Für manche Sachen bestimmt nicht 
schlecht.

Viele Gruesse herrmueller

Oh je, ich muss ja bald arbeiten :-(

von therealosram (Gast)


Lesenswert?

Das ist der Hammer!! Genau das habe ich gesucht. Und jetzt kann ich 
damit "rumspielen" und versteh das vielleicht auch. DANKE.

Herr Mueller schrieb:
> man muss sich mehr Wörter merken, aber
> weniger Bitbezeichnungen und Register. Für manche Sachen bestimmt nicht
> schlecht.

Da es VBA in gewisser Weise ähnelt, habe ich mich auch dafür 
entschieden.

Danke an alle nochmals. :)))))))))

von therealosram (Gast)


Lesenswert?

Strommessung: (Oszi an R)

Ruhestrom:        11,4 µA
Belasung LED aus:  6,8 mA
         LED an:  20,4 mA

SUPER
Danke nochmals

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.