Hallo liebe Bastler,
heute wende ich mich mal wieder mit einem Problem an euch!
Ich habe einen ATMEGA48, der im Sekundentakt eine LED blinken lassen
soll.
Der Takt kommt von einem externen Uhrenquarz mit 32,768kHz (10pF),
welcher direkt zwischen TOSC1 und TOSC2 (ohne extra Kondensatoren)
angeschlossen ist.
Der µC schläft die ganze Zeit und wird nur einmal pro Sekunde durch den
Uhrenquarz aufgeweckt.
Der Controller wird von 3 AA-Batterien direkt gespeist (zusammen ca.
4,5V) - ohne Spannungsregler.
Hier ist der Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/sleep.h>
|
4 |
|
5 | void initTimer( void )
|
6 | {
|
7 | ASSR = (1 << AS2); //externer Quarz
|
8 | TCCR2A = (1 << WGM21); //waveform generation method
|
9 | TCCR2B = (1 << CS22) | (1 << CS21); //prescaler 256
|
10 | TIMSK2 = (1 << OCIE2A); //Compare Match A Int Enable
|
11 | OCR2A = 127;
|
12 | }
|
13 |
|
14 | int main ( void ) {
|
15 | DDRB |= 0b00000001; //led ausgang
|
16 |
|
17 | initTimer();
|
18 |
|
19 | sei();
|
20 |
|
21 | while (1)
|
22 | {
|
23 | set_sleep_mode(SLEEP_MODE_PWR_SAVE);
|
24 | sleep_mode();
|
25 | }
|
26 | }
|
27 |
|
28 | ISR (TIMER2_COMPA_vect)
|
29 | {
|
30 | //sollte im sekundentakt aufgerufen werden.
|
31 | if ((PORTB & 0b00000001) > 0)
|
32 | {
|
33 | PORTB &= 0b11111110; //switch led off
|
34 | }
|
35 | else
|
36 | {
|
37 | PORTB |= 0b00000001; //switch led on
|
38 | }
|
39 | }
|
Nun zu meinem Problem:
Es hat bereits mal funktioniert, dass es im Sekundentakt geblinkt hat.
Aber nicht nach jedem Reset, sondern nur teilweise.
Ich hatte das Gefühl, dass es deutlich häufiger ging, als der Programmer
noch angesteckt war (!?).
Aber selbst da hat es nicht jedesmal funktioniert.
Meistens blinkt gar nichts, also die LED bleibt dunkel nach dem Reset.
Der Reset funktioniert immer einwandfrei, das hab ich getestet.
- Ist die direkte Batteriespannung von 4,5V zu instabil, sodass ich
einen Spannungsregler verwenden sollte? (Der zieht halt nochmal mehr
Standby-Strom...)
- Muss ich das Uhrenquarz doch mit zusätzlichen Kondensatoren versehen?
- Fehlt noch eine Initialisierung oder muss ich ein Fuse-Bit setzen?
- Oder evtl. was ganz anderes?
Danke schon jetzt für eure Antworten!
Ihr helft mir ungeheim weiter...