Uhrenquarz an Atmega8

Gast #2475997
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
Gast
>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.
Gast
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.
Gast
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...
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?
Gast
>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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.