PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ewiger Blinker ATtiny13



runner02
08.09.2013, 12:37
Hallo,

Ich bin dabei, einen "ewigen Blinker" mittels eines ATtinys zu bauen. Dazu lege ich den Chip schlafen (im Power-down Mode >0,1 uA Verbrauch), und dann soll er durch den Timer-Interrupt aufwachen. Es hängt nur eine LED am PB0.

Dazu hätte ich diesen Code so geschrieben / angepasst.

Leider tut er nichts. Die LED blinkt einmal (Funktionstest) und dann nie wieder...



$regfile = "attiny13.dat" ' specify the used micro
$crystal = 1000000 ' used crystal frequency

$hwstack = 20 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 30 ' default use 40 for the frame space





'The following code shows how to use the TIMER0 in interrupt mode

Config Portb = Output
Dim I As Byte
I = 0


'Configute the timer to use the clock divided by 1024
Config Timer0 = Timer , Prescale = 1024

'Define the ISR handler
On Ovf0 Tim0_isr
'you may also use TIMER0 for OVF0, it is the same

Enable Timer0 ' enable the timer interrupt
Enable Interrupts

Portb = &B00000000
Wait 1
Portb = &B11111111 'Funktionstest LED ein und ausschalten
Wait 1
Portb = &B00000000

'allow interrupts to occur
Do
Powerdown
MCUCR = bits( SE , SM1)
SLEEP

Loop

'the following code is executed when the timer rolls over
Tim0_isr:

I = I + 1

If I >= 9 Then
I = 0
Portb = &B11111111
Wait 1
Portb = &B00000000
End If

Return


End


Wäre echt classe, wenn mir jemand mit Interrupterfahrung den Fehler fände ;)


Danke & Mfg

Sauerbruch
08.09.2013, 14:53
Zum Powerdown-Modus schreibt das Datenblatt fogendes:


"When the SM1..0 bits are written to 10, the SLEEP instruction makes the MCU enter
Power-down mode. In this mode, the Oscillator is stopped, while the external interrupts,
and the Watchdog continue operating (if enabled). Only an External Reset, a Watchdog
Reset, a Brown-out Reset, an external level interrupt on INT0, or a pin change interrupt
can wake up the MCU. This sleep mode halts all generated clocks, allowing operation of
asynchronous modules only."


Da der interne Oszillator angehalten wird, gibt´s auch keinen Timer-Overflow mehr. Die einzige Möglichkeit eines Aufwachens ohne ein externes Ereignis wäre der Watchdog.

runner02
08.09.2013, 18:44
Zum Powerdown-Modus schreibt das Datenblatt fogendes:


"When the SM1..0 bits are written to 10, the SLEEP instruction makes the MCU enter
Power-down mode. In this mode, the Oscillator is stopped, while the external interrupts,
and the Watchdog continue operating (if enabled). Only an External Reset, a Watchdog
Reset, a Brown-out Reset, an external level interrupt on INT0, or a pin change interrupt
can wake up the MCU. This sleep mode halts all generated clocks, allowing operation of
asynchronous modules only."


Da der interne Oszillator angehalten wird, gibt´s auch keinen Timer-Overflow mehr. Die einzige Möglichkeit eines Aufwachens ohne ein externes Ereignis wäre der Watchdog.

Ok, das heißt in der Theorie könnte der Code schon das tun, was ich wollte. Nur halt gibt es keinen Timer-Interrupt.

Sprich, ich werde mich einlesen, wie man den WatchDog bedient.


Danke!!

Lg

Wsk8
08.09.2013, 21:25
Sprich, ich werde mich einlesen, wie man den WatchDog bedient.
1. Weißt du schon, was der Watchdog macht?

2. Schon mal nen Blick ins Datenblatt geworfen? Hier gibts den Idle Mode

Idle mode enables the MCU to wake up from external triggered interrupts as well as internal
ones like the Timer Overflow.

3. Warum einen µC für ein Blinklicht?

mfg

Sauerbruch
08.09.2013, 22:56
2. Schon mal nen Blick ins Datenblatt geworfen? Hier gibts den Idle Mode

Das stimmt - aber der Idle-Mode reduziert die Stromaufnahme ungefähr nur auf 50%. Da ist der Power-Down-Modus schon wesentlich effektiver, was Stromsparen anbetrifft.

Bleibt natürlich der berechtigte Punkt 3. - mit einem CMOS-Inverter, einem 10MOhm-Widerstand und ´nem 100nF-Kondensator ließe sich auch ein Rechteckgenerator aufbauen, der unter 1µA zieht...

PsychoDreams
14.12.2013, 20:11
Hallo runner02,
probiers doch mal so:


$regfile = "ATtiny13.DAT"
$crystal = 128000 'Reale Frequenz des internen 128kHz-Oszillators
Config Portb = &B00000001 'Pinb.0 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11111110 'Pullups zuschalten, au¼er fÄur Pinb.0
Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen


Enable Interrupts


Do
Portb.0 = 1
Wdtcr = &B11000000 'watchdog auf 16ms setzen
Reset Watchdog
Powerdown
Portb.0 = 0
Wdtcr = &B11000111 'watchdog auf 2s setzen
Reset Watchdog
Powerdown

Loop

End

So hab ich meine programmiert und die halten jahre mit einer mignon zelle.
hier noch ne schaltung: http://www.b-kainka.de/Weblog/Schaltungen/Eloflasher.html
und schau dir bitte mal "das Kochbuch" an, das enthält auch ne liste mit den möglichen Watchdogzeiten: http://www.reaktivlicht.de/kochbuch_V3.pdf