Hi,
Dieses Thema gab es zwar schon oft, hab auch viele Threds und das
Datenblatt mehrmals gelesen doch leider hat s nie funktioniert. Also ich
will eine Binäruhr bauen die von einem Atmega8 mit 32,768khz Uhrenquarz
gesteruert wird, und da liegt das Problem. Also mein Code:
1 | /*Atmega8
|
2 | 32.768khz mit 33pf an PB6 und PB7
|
3 | Leds an PortC
|
4 | Taster an PD2 und GND
|
5 | */
|
6 | #include <avr/io.h>
|
7 | #include <avr/sleep.h>
|
8 | #include <avr/interrupt.h>
|
9 | #include <util/delay.h>
|
10 |
|
11 | int i;
|
12 |
|
13 | int main (void) {
|
14 |
|
15 | DDRC = 0xff; //PortC=Output
|
16 |
|
17 | /* Timer2 Initilisieren */
|
18 | ASSR |= (1<<AS2); //async operation
|
19 | TCCR2 |= (1<< CS22) | (1<< CS20); //Prescaler auf 128
|
20 | TCNT2 = 0x00; //Init counter
|
21 | TIMSK |= (1<<TOIE2); //Overflow Interrupt Enable
|
22 |
|
23 | /* Externe Interrupts Initilisieren */
|
24 | DDRD = 0x00; // PD3 = INT1 und PD2 = INT0
|
25 | PORTD = 0xFF; // PullUps aktivieren
|
26 | MCUCR &= ~0x3; // levelgesteuerter Int. an INT0
|
27 |
|
28 | ACSR = 0x80; //ADC ausschalten
|
29 | sei(); //Interrupts aktivieren
|
30 | GIMSK |= (1 << INT0); // externen Interrupt freigeben
|
31 | while (1)
|
32 | {
|
33 |
|
34 | PORTC = 0b11111111;
|
35 | _delay_ms(1000);
|
36 | PORTC = 0b00000000;
|
37 | _delay_ms(1000);
|
38 |
|
39 |
|
40 | GIMSK |= (1 << INT0); // externen Interrupt freigeben
|
41 |
|
42 | set_sleep_mode(SLEEP_MODE_PWR_SAVE);
|
43 | sleep_mode(); //Schlafen gehn
|
44 |
|
45 | //## hier wachen wir wieder auf ##//
|
46 | GIMSK &= ~(1 << INT0); // externen Interrupt sperren
|
47 |
|
48 | };
|
49 | };
|
50 |
|
51 |
|
52 | ISR(INT0_vect) { //ISR von esternem interrupt 0
|
53 | };
|
54 |
|
55 |
|
56 | ISR(TIMER2_OVF_vect) { //overflow Von Timer 2
|
57 | cli();
|
58 | TCNT2 = 0x00; //Init counter
|
59 | PORTC = PINC ^ ( 1 << PC0 );
|
60 | sei();
|
61 | };
|
Er Soll eigentlich nur die Led an PC0 blinken lassen, doch scheinbar
wird ISR2 nie aufgerufen. Der externe Interrupt INT0 funktioniert
allerdings problemlos.
Könnte jemand von euch bitte mal über den Code gucken und schauen ob er
den/die Fehler findet?
mfg Strangelet