• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Fragen zum ATiny 13

kurzwelle

Geocacher
Hallo

Ich möchte mir einen ewigen Blinker mit dem ATiny 13 basteln. Momentan habe ich die 5Volt Version des Tiny. Takt ist auf 128khz, Taktteiler deaktiviert.
Trotzdem braucht der Tiny etwa 1mA, wenn die LED aus ist.

Wie kann ich den Stromverbrauch weiter senken?
Warum leuchtet die LED statt den programmierten 1000ms ein paar Sekunden?

mfg
 

thomas_st

Geowizard
Hi kurzwelle,

könntest Du mit ein paar weiteren Informationen rausrücken? Welche Schaltung? Welche Widerstände (ok, beim reinen Blinker und LED aus wohl nicht relevant)? Welches Programm? Wird der Proz. wenn immer möglich schlafen geschickt oder dreht er lustig ein paar Warteschleifen?

Fragende Grüße,
Thomas(_st)
 
OP
K

kurzwelle

Geocacher
Ich bin immer noch am "entwickeln" dran.

Es soll einfach ein Programm sein, dass alle paar Sekunden eine LED mal kurz aufblitzen lässt.

Ich habe das momenten mit einer Do - Loop Schleife gemacht.

Do
led an
warten
led aus
waren
Loop

Funktioniert auch, braucht aber leider 1mA

mfg
 

hendyp

Geocacher
kurzwelle schrieb:
Ich habe das momenten mit einer Do - Loop Schleife gemacht.

Do
led an
warten
led aus
waren
Loop

Funktioniert auch, braucht aber leider 1mA
Dieses Pseudocodefragment sieht so aus, als würde der Controller die ganze Zeit arbeiten; die gängigen Wartebefehle zählen nämlich einen Zähler hoch, bis eine bestimmte Zahl (ergibt sich aus Taktfrequenz und zu wartender Zeit) erreicht ist und beenden sich dann.

Besser macht man das über Timer und schickt den Controller im Hauptprogramm ständig schlafen. Da "Do - Loop" in keiner der Sprachen vorkommt, mit denen ich bisher Microcontroller programmiert habe (Assembler, C), kann ich Dir bei den Details aber nicht so gut helfen.

Was die falsche Dauer angeht, könntest Du mal überprüfen, ob Du Deinem Compiler die richtige Taktfrequenz angegeben hast und ob die benutzten Warte-Befehle auch für die Taktfrequenz geeignet sind.

Gruß,
hendy
 

KrasserMann

Geocacher
Der Stromverbrauch sinkt mit 3V rapide!

Mit 5V ist es mir auch nie gelungen Den Strom unter 1mA zu bekommen, die gleiche Schaltung mit dem gleichen Programm bei 3V lag dann bei 15 uA

Probier das mal aus!

Gruß Martin
 
OP
K

kurzwelle

Geocacher
Das mit dem Timer saugt bei mir etwa 300uA.

Das hier werde ich nun verwenden, braucht bei mir nur 7uA @5Volt:

$regfile="attiny13.dat"
$crystal=128000
'WatchdogResetnachca.2s
ConfigWatchdog=2048
StartWatchdog
Ddrb.3=1
Portb.3=1
Waitms1
Portb.3=0
Powerdown
End

mfg
 

hendyp

Geocacher
Im Datenblatt zum ATtiny13 stehen in Kapitel 8.4 Codebeispiele zur Benutzung des Watchdog. Im Prinzip heißt es nur, die Register auf die richtigen Werte zu setzen. Für den AVR-gcc gibt es eine Include-Datei <avr/wdt.h>. Ich habe allerdings beide Varianten noch nicht ausprobiert, da ich noch nie mit dem Watchdog gearbeitet bzw. gespielt ;) habe.

Gruß,
hendy
 

thomas_st

Geowizard
flopp schrieb:
Apropos Watchdog: wie macht man das denn mit C (avr-gcc)?
Neben den schon genannten Codebeispielen aus dem Datenblatt, gibt es weiter unten einen Thread von mir "Reaktives Licht mit Attiny13V in C" in dem ich den Quelltext eines RL in C dargestellt habe. Dieses Programm setzt vollkommen auf den Watchdog (WD). Der Code ist zwar an einigen Stellen noch verbesserungswürdig (das sei(); z.B. würde ich heute so nicht mehr verwenden) aber er funktioniert problemlos.

Beim WD muss man aufpassen, das man seine "eigentliche" Funktionalität lahmlegt - normalerweise soll er nach einer festgelegten Zeitspanne einen Reset auslösen und nicht wie bei mir "nur" einen Interrupt. Das Abschalten des Resets ist mit einigen Hürden versehen.

Viele Grüße,
Thomas(_st)
 

flopp

Geomaster
thomas_st schrieb:
flopp schrieb:
Apropos Watchdog: wie macht man das denn mit C (avr-gcc)?
Neben den schon genannten Codebeispielen aus dem Datenblatt, gibt es weiter unten einen Thread von mir "Reaktives Licht mit Attiny13V in C" in dem ich den Quelltext eines RL in C dargestellt habe.
Oh. Vielen Dank, Thomas. Diesen Thread kannte ich ja noch gar nicht, aber es ist genau das, was iczh gesucht habe... :kopfwand:
Ich denke, da werde ich mir einiges abgucken können.

Grüße,
Flopp
 

stonewood

Geowizard
kurzwelle schrieb:
Das mit dem Timer saugt bei mir etwa 300uA.

Das hier werde ich nun verwenden, braucht bei mir nur 7uA @5Volt:

$regfile="attiny13.dat"
$crystal=128000
'WatchdogResetnachca.2s
ConfigWatchdog=2048
StartWatchdog
Ddrb.3=1
Portb.3=1
Waitms1
Portb.3=0
Powerdown
End
Ah, also mit bascom. War aus dem oben nicht ganz klar.

Übrigens treibst Du damit den Tiny bei jedem Zyklus in einen Reset. Zumindest meine ich daß nach Ende des Programms der Tiny erst mal einen Reset macht bevor das Programm wieder von vorne beginnt. Keine Ahnung ob das zum Stromverbrauch etwas tut, aber ich kann mir zumindest vorstellen daß das ohne Reset noch weniger Strom braucht.

Und 'waitms' macht Busy wait, braucht also viel Strom. Eventuell könnte man das auch noch per Watchdog weiter optimieren.
 

huirad

Geocacher
Toll, was man im Forum so alles lernen kann!
Ich habe den stromsparenden Blinker jetzt mal in C-Code umgesetzt, siehe unten.
Danke an thomas_st für die Vorlage!

Code:
//Beispielprogramm stromsparendes ATTiny13 Blinklicht mit Watchdog Timer; verbaut in K1 Final
//Beschaltung: LED mit Vorwiderstand zwischen PB4 (Pin3) und Masse

//Referenz/Idee: Beiträge von thomas_st im geoclub: 
//  http://www.geoclub.de/viewtopic.php?f=57&t=20603
//  http://www.geoclub.de/viewtopic.php?f=57&t=26708
//AVR-GCC-Tutorial 
//   http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Sleep-Modes
//   http://www.mikrocontroller.net/articles/Sleep_Mode
//AVR LibC Doku
//  http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html
//  http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
//ATTiny13 Datenblatt:  http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf
//  Kapitel 7 "Power Management and Sleep Modes" (S. 27)
//  Kapitel 8.3 "Watchdog Timer" (S. 37)
//  Kapitel 9 "Interupts" (S. 44)


#include <avr/io.h>         //IO Pins schalten für LED
#include <avr/sleep.h>      //sleep modes
#include <avr/interrupt.h>  //interrupt
#include <avr/wdt.h>        //watchdog timer


//1. Pins konfigurieren. Unnötige Verbraucher abschalten. 
void mcu_init(void)
{
    DDRB = 0b00010000; // Pinb.4 auf 'Ausgang', Rest auf 'Eingang' schalten
    PORTB = 0b11101111; // Pullups zuschalten, außer für Pinb.4
    ADCSRA &= ~(1<<ADEN); // A/D-Wandler abschalten
    ACSR |= (1<<ACD); // AnalogKomparator abschalten
    
    PORTB &= ~(1<<PB4); // Portb.4 auf Masse schalten
    
    sei();  // Interrupts einschalten (sind zu Beginn noch inaktiv)
}


//2. Funktionen zum Warten per Watchdog Timer

//2.1 Interrupt Service Routine - macht nix, muss aber da sein!
ISR(SIG_WATCHDOG_TIMEOUT)
{
}

//2.2 Watchdog Timer starten und MCU schlafen legen
//@par WDTO_value eine der WDTO_ Konstanten aus wdt.h
//Referenz: Funktion void setWD(BYTE bTimeConst) von thomas_st
void sleep_wdt(uint8_t WDTO_value)
{
    // Zeit setzen
    wdt_enable(WDTO_value);
    // Watchdog-RESET deaktivieren (wir wollen nur den Interrupt)
    //   erst das entsprechende Bit im MCUSR löschen, sonst hat die Änderung
    //   im WDTCR kein Effekt
    MCUSR &= ~_BV(WDRF);
    // Watchdog Timer Interrupt einschalten                WDIE -> 1
    // um den Reset auszuschalten, muss das "Sicherungsbit"
    //   WDCE muss gesetzt sein                           WDCE -> 1
    // Reset ausschalten                              WDE  -> 0
    WDTCR = (WDTCR & ~_BV(WDE)) |_BV(WDCE) |_BV(WDTIE);

    //MCU schlafen legen
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_cpu();

}

    
//3. Startsequenz: mehrfach blinken
void blink_start(void)
{
    char i;
    for (i=0; i <5; i++)
    {
        PORTB |= (1<<PB4); // PB4 auf Vcc schalten
        sleep_wdt(WDTO_60MS);  //LED leuchtet auch im während sleep!
        PORTB &= ~(1<<PB4); // PB4 auf GND schalten    
        sleep_wdt(WDTO_120MS);
    }
}

//4. 1x blinken
void blink_once(void)
{
    PORTB |= (1<<PB4); // PB4 auf Vcc schalten
    sleep_wdt(WDTO_60MS);  //LED leuchtet auch im während sleep!
    PORTB &= ~(1<<PB4); // PB4 auf GND schalten
}

//5. Hauptprogramm
int main(void) 
{
    mcu_init();
    
    blink_start();

    while (1) 
    {
        sleep_wdt(WDTO_4S);
        blink_once();
    }    
    return 0;
}
 

upigors

Geowizard
http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=C31;GROUPID=3291;ARTICLE=15191;START=0;SORT=artnr;OFFSET=16;SID=31zBoZdqwQAR8AAELrB74e118e7bae63bd5b04a33169951de4861

möchte dieses Relais, zusätzlich noch ne Diode parallel zur Spule als Schutzdiode, an einen Ausgang des ATiny 13 hängen. Brauch ich da nen Vorwiderstand oder ähnliches? Nen transistor dürfte ja nicht nötig werden.... Oder?
 

thomas_st

Geowizard
upigors schrieb:
http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=C31;GROUPID=3291;ARTICLE=15191;START=0;SORT=artnr;OFFSET=16;SID=31zBoZdqwQAR8AAELrB74e118e7bae63bd5b04a33169951de4861

möchte dieses Relais, zusätzlich noch ne Diode parallel zur Spule als Schutzdiode,
Jep! Steht ja da: "Ohne Diode", daher die Diode extra einbauen.

upigors schrieb:
Brauch ich da nen Vorwiderstand oder ähnliches? Nen transistor dürfte ja nicht nötig werden.... Oder?
So wie ich es sehe: Nein und Nein.

Viele Grüße,
Thomas(_st)
 

Windi

Geoguru
5 Volt geteilt durch 200 Ohm ergibt nach Georg Simon 25 mA.
Einen I/O-Pin kann man mit max. 40 mA belasten also gibt es hier kein Problem. Geht ohne Transistor.
Dumm ist nur dass man 5 Volt benötigt. Geht vermutlich auch mit weniger aber dann ist es halt nicht garantiert dass es funzt.
Falls machbar könnte man natürlich auch einen Optokoppler einsetzen.
 

upigors

Geowizard
danke für eure antworten....
hab so ein relais (nur mit einem schliesser) seit > 1 jahr an 3 V und bisher ohne einen einzigen aussetzer.... sollte also gut klappen.... hatte glaubich irgendwann mal gemessen ab 2,4 V oder so arbeiten die zuverlääsig
 
Oben