Forum: Mikrocontroller und Digitale Elektronik Uhrenquarz an Atmega8


von Strangelet (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Schwingt der 32kHz Quarz denn auch?

von Strangelet (Gast)


Lesenswert?

Ja ich kann ihn hören!

Ne spass, also ich vermute schon da er ganz neu ist, gibts einen weg zu 
testen ob er läuft?

von holger (Gast)


Lesenswert?

>Ne spass, also ich vermute schon da er ganz neu ist, gibts einen weg zu
>testen ob er läuft?

Minimalprogramm nehmen (ohne Sleep Geraffel, INT0 usw.) und den
Timerwert irgendwie ausgeben? Machst du im Prinzip
ja mit dem Overflow Int. Wenn der nicht kommt dann stimmt was nicht.
Was könnte das sein? Der Quarz schwingt nicht.

von Kilpikonna (Gast)


Lesenswert?

Wenn du den Controller schlafen legst, wird er dann auch durch den 
Interrupt wieder aufgeweckt? Das würde ich als erstes auskommentieren. 
Wenn es dann läuft lag es dran. Wenn nicht, weiter gucken wir weiter.

von Strangelet (Gast)


Lesenswert?

hab ich auch schon Probiert, aber auch dann wird der Interrupt nicht 
aufgerufen :(

von Strangelet (Gast)


Lesenswert?

Sry für Doppelpost, also hier nochmal das nichtfunktionierende 
Minimalprogramm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main (void) {
5
    ASSR |= (1<<AS2);                     //async operation
6
    TCCR2 |= (1<< CS22) | (1<< CS20);     //Prescaler auf 128
7
    TCNT2 = 0x00;                         //Init counter
8
    TIMSK |= (1<<TOIE2);                  //Overflow Interrupt Enable  
9
10
    DDRC = 0xff;                          //PortC=Output  
11
    sei();                               //Interrupts aktivieren
12
13
    while (1) 
14
    {
15
    };
16
};
17
18
ISR(TIMER2_OVF_vect) {                 //overflow Von Timer 2 
19
cli(); 
20
    TCNT2 = 0x00;                  //Init counter
21
    PORTC = PINC ^ ( 1 << PC0 );
22
sei();  
23
};


Ich vermute das irgendwelche der Register falsch Beschrieben sind aber 
ich weiß nicht welche...

von Stefan W. (wswbln)


Lesenswert?

33p erscheint mir für einen Uhrenquarz (der üblicherweise für 
Lastkapazitäten von 7..12p ausgelegt ist) recht hoch. Hast Du irgendwie 
Zugriff auf ein Oszilloskop und/oder einen Frequenzzähler?

Wie hast Du die Fuses eingestellt?

von holger (Gast)


Lesenswert?

>Ich vermute das irgendwelche der Register falsch Beschrieben sind aber
>ich weiß nicht welche...

Blödsinn. Dein Quarz schwingt nicht. Halt mal für 20 Sekunden
deinen Finger an XTAL1 ohne Masse zu berühren. Bei mir kommt
der Interrupt.

von Strangelet (Gast)


Lesenswert?

OMG!

100 Punkte für Stefan Wimmer mit den 33pf hatte ich glaub ich irgendo 
gelesen aber es waren sogar noch schlimmer 100pf oder so verbaut hab da 
allerdings beim programmieren nichtmehr drangedacht : (

Mit 27pf funktioniert es Jetzt jedocheinwandfrei danke an alle! :D

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
Noch kein Account? Hier anmelden.