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
Muss ich da den Idle -Befehl in Bascom benutzen. Wenn ich das richtig sehe, arbeiten, dann die IO's und der ADC weiter oder?
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
> 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
Wie muss ich dazu die Schaltung extern verändern? Wie kann ich den genau wecken? Ich bin leider ein ziemlicher Anfänger.
> 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.
Watchdog aktivieren Watchdog Interrupt freischalten Interrupts generell freischalten Sleep Mode Power down manuell
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.
Sieh dir mal das angehängte Bascom-Beispiel an. Das ist ein Tabletten-Erinnerer mit dem Attiny 13, der im Sleep ca 6uA verbraucht
Der Spannungsteiler aus LDR und R4 würde dennoch ständig Strom verbrauchen. Am besten über einen PortPin ein- und auch wieder ausschalten.
Schau mal unter http://reaktivlicht.de/atmel.html nach, da wird dein Problem auf verschiedenste Arten gelöst. Gruß Bussard
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.