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
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 Modehttp://avrhelp.mcselec.com/config_powermode.htm
> 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.
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
> 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.
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?
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.
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
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.
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
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
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.