Forum: Mikrocontroller und Digitale Elektronik ATtiny 13 in den Sleepmodus schicken


von D. Riedel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Liebe Mikrocontrollergemeinde,

zu meiner Person: Ich bin 26 Jahre alt und sehr unerfahren in Sachen 
Mikrocontroller.

Ich habe ein Programm geschrieben um eine LED über einen LDR zu 
schalten.
Leider braucht der yC zu viel Strom. Ich habe hier gelesen, dass es 
einen Sleepmodus gibt. Konnte den Modus allerdings nicht in mein 
Programm integrieren, da ich zu wenig Ahnung davon habe.

Ich programmiere mit bascom avr.

Hier ist mein Programm:

$regfile = "Attiny13.dat"
$crystal = 1200000
$hwstack = 10
$swstack = 10
$framesize = 10

Dim Uist1 As Long

'ADC definieren
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc

Config Portb.0 = Output

Declare Sub Einschalten()

 Portb.0 = 1

Do

 Uist1 = Getadc(3)

 If Uist1 > 200 And Uist1 < 600 Then
   Gosub Einschalten
 End If

Loop

Einschalten:
 Portb.0 = 0

 Wait 2

 Portb.0 = 1

 Waitms 200

 Return

End


Wo und wie muss ich da nun den Sleepmodus integrieren.

Vielen Dank für Eure Hilfe

Gruß Denis

von D. Riedel (Gast)


Lesenswert?

Muss ich da den Idle -Befehl in Bascom benutzen.
Wenn ich das richtig sehe, arbeiten, dann die IO's und der ADC weiter 
oder?

von Krapao (Gast)


Lesenswert?

In IDLE (0,3mA) läuft der ADC noch.

Die Frage ist, brauchst du das oder kannst du von der Anwendung her den 
AVR in den Tiefstschlaf (POWERDOWN, 0,3μA) legen und regelmäßig für eine 
ADC Messung wecken. Beim Wecken dann auch die I/O-Pins entsprechend 
konfigurieren. Als Wecker kann z.B. der Watchdog (Diskrete Zeiten 16 ms 
bis 8 s, Table 8-2 im DB) benutzt werden.

Sleep Mode
http://avrhelp.mcselec.com/config_powermode.htm

von Krapao (Gast)


Lesenswert?

> In IDLE (0,3mA) läuft der ADC noch.

Allerdings brauchst du auch einen Wecker.

Das Hauptprogramm (Uist1 = Getadc(3)...If Uist1 > 200 And Uist1 < 600 
Then) läuft im Sleep-Modus nicht.

Als Wecker könntest du bei IDLE z.B. den Analog Comparator Interrupt 
(bei entsprechender externer Schaltung) oder den ADC Conversion Complete 
interrupt benutzen. Andere IRQs gehen natürlich auch.

von D. Riedel (Gast)


Lesenswert?

Danke für deine Antwort.

Je weniger Strom er verbraucht desto besser.
Das mit den 0,3µA hört sich sehr gut an. Aber wie programmiere ich das 
in bascom?

Ich habe dies eingegeben:

 Config Powermode = Powerdown

Alleine bei dieser einzelenen Zeile kam eine Fehlermeldung:
Unkown CONFIG parameter [POWERMODE]

Wieso kennt er diesen Befehl nicht?

Gruß Denis

von D. Riedel (Gast)


Lesenswert?

Wie muss ich dazu die Schaltung extern verändern?
Wie kann ich den genau wecken? Ich bin leider ein ziemlicher Anfänger.

von Krapao (Gast)


Lesenswert?

> Wieso kennt er diesen Befehl nicht?

Vielleicht ist dein BASCOM zu alt. In der Hilfe bei IDLE steht "You 
should use the new CONFIG POWERMODE statement." Was "new" in diesem 
Zusammenhang heisst, habe ich auf der MCS Seite nicht herausfinden 
können.

> Wie muss ich dazu die Schaltung extern verändern?

Wenn du dich für den Analog Comparator entscheidest, muss 1/ das 
Analogsignal vom LDR auch zu dessen Eingang AIN1 und 2/ braucht der AC 
auch eine Vergleichsspannung an AIN0. LED3 wäre an einen anderen Pin zu 
hängen.
Günstig wäre es, wenn du bei der Vergleichsspannung die interne 
Bandgap-Referenz nutzen könntest. Müsste man mal rechnen, wie du mit der 
Bandgap und deinem Signal eine sinnvollen AC Vergleich aufbauen kannst, 
der einen IRQ auslösen kann.

> Wie kann ich den genau wecken? Ich bin leider ein ziemlicher Anfänger.

Das Thema ist kein Anfängerthema. Da ist heftiges Einarbeiten gefragt.

von Falk B. (falk)


Lesenswert?

Watchdog aktivieren
Watchdog Interrupt freischalten
Interrupts generell freischalten
Sleep Mode Power down manuell

von D. Riedel (Gast)


Lesenswert?

Danke für deine Antwort Falk.

Kannst du mir ein kleines Programmbeispiel in Bascom geben?
Wie gesagt ich bin Anfänger. Oder gibt es generell ein Befehl den ich 
ausgeben könnte um Strom zu sparen?

von Eumel (Gast)


Lesenswert?

Bascom ist dein Feind. Das Datenblatt hingegen dein Freund. Da gibts 
einen extra Abschnitt der sich damit beschäftigt wie man möglichst viel 
Energie spart. Dann setzt du das ganze in Asm um, sind vielleicht 20 
Zeilen.
Und der sparsamste Weg ist den Tiny pennen zu lassen, mit dem Watchdog 
aufwecken, Helligkeit messen und dann je nach Ergebniss weiter pennen 
oder die Led einschalten.

von S. N. (Firma: flipdot hackerspace kassel) (snafu)


Angehängte Dateien:

Lesenswert?

Sieh dir mal das angehängte Bascom-Beispiel an. Das ist ein 
Tabletten-Erinnerer mit dem Attiny 13, der im Sleep ca 6uA verbraucht

von Stefan P. (form)


Lesenswert?

Der Spannungsteiler aus LDR und R4 würde dennoch ständig Strom 
verbrauchen. Am besten über einen PortPin ein- und auch wieder 
ausschalten.

von bussard (Gast)


Lesenswert?

Schau mal unter http://reaktivlicht.de/atmel.html nach, da wird dein 
Problem auf verschiedenste Arten gelöst.
Gruß Bussard

von Norbert S. (norberts)


Lesenswert?

Hi,

man könnte das so machen:
1
$regfile = "Attiny13.dat"
2
$crystal = 1200000
3
$hwstack = 10
4
$swstack = 10
5
$framesize = 10
6
7
Dim Uist1 As Long
8
9
'ADC definieren
10
Config Adc = Single , Prescaler = Auto , Reference = Avcc
11
Start Adc
12
Config Timer0 = Timer, , Prescale = 1024 'OVF after 218ms
13
Enable Timer0
14
Enable Interrupts
15
Config Portb.0 = Output
16
Portb.0 = 1
17
Do
18
 Uist1 = Getadc(3)
19
 If Uist1 > 200 And Uist1 < 600 Then
20
   Gosub Einschalten
21
 End If
22
 Stop ADC
23
 Idle
24
 Start ADC
25
Loop
26
27
Einschalten:
28
 Portb.0 = 0
29
 Wait 2
30
 Portb.0 = 1
31
Return
32
33
End

Der Überlauf des Timers weckt die Kiste einfach nur aus dem Idle auf.
So verbraucht er schonmal nur noch 0,x mA.

Wenn es mit
Config Powerdown = Idle
nicht geht, dann update mal Dein Bascom.

Edit: ADC Stop/Start

Gruß,
Norbert

von Ringy (Gast)


Lesenswert?

Am meisten Strom könntest Du wahrscheinlich sparen, wenn Du die LED
nicht 2 sec. einschalten würdest, sondern nur kurz aufblitzen lassen 
würdest z.B. 50 msec.

von Norbert S. (norberts)


Lesenswert?

Hi,

Ringy hat Recht (je nachdem wie oft die an sein wird)

For I = 1 To 4
 Led = 1
 Waitms 50
 Led = 0
 Waitms 450
Next

Das kann man u.U. sogar besser erkennen als eine leuchtende LED.

Gruß,
Norbert

von ocramfff (Gast)


Lesenswert?

Hallo,

Es ist lange her, aber für die Lesenden:

Ich hatte heute exakt das selber Problem bei einem Attiny85.
~260 uA im Powerdown. Ich konnte das Problem lösen indem ich den ADC 
vorher ausschalte:     ADCSRA &= ~(1<<ADEN);


Vielleicht hilft es ja dem ein oder anderen.


Lg

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Noch besser gehts mit dem PRR Register:
1
; disable unused modules
2
  ldi  temp,(1 << PRUSI) | (1 << PRADC) ; USI und ADC abschalten
3
  out  PRR,temp
100µA für einem laufenden 128kHz Tiny85. Ausserdem lohnt es sich, Pins 
nicht floaten zu lassen, sondern sie sls Ausgänge oder Inputs mit Pullup 
zu schalten.

: Bearbeitet durch User
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.