Forum: Mikrocontroller und Digitale Elektronik Stoerung von RTC


von Owen S. (senmeis)


Lesenswert?

Hi,

mit dem folgenden Code möchte ich ein Byte über der UART vom Atmega169 
senden. Das ganze funktioniert soweit nur wenn RTC_init() nicht 
ausgeführt wird, sonst wird nichts gesendet. In meinem Beispiel wird der 
interne RC Oszillator verwendet. Was ist die Ursache?
1
int main( void )
2
{
3
  clock_init_1MHz();
4
  
5
  //RTC_init();
6
  USART_Init(12); // 9600bps bei 1MHz
7
  
8
  __enable_interrupt();
9
  
10
  for(;;)
11
  {
12
     Delay(1000);
13
     Usart_Tx(0x5A);
14
  }
15
}
16
17
void clock_init_1MHz(void)
18
{
19
  CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
20
    
21
  // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
22
  CLKPR = (1<<CLKPS1) | (1<<CLKPS0); 
23
}
24
25
void Delay(unsigned int millisec)
26
{
27
    int i;
28
    
29
    while (millisec--)
30
        for (i=0; i<125; i++);
31
}
32
33
void USART_Init(unsigned int baudrate)
34
{
35
    // Set baud rate
36
    UBRR0H = (unsigned char)(baudrate>>8);
37
    UBRR0L = (unsigned char)baudrate;
38
39
    // Enable 2x speed
40
    UCSR0A = (1<<U2X0);
41
42
    // Enable receiver and transmitter
43
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
44
45
    // Async. mode, 8N1
46
    UCSR0C = (0<<UMSEL0)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
47
}
48
49
void Usart_Tx(char data)
50
{
51
    while (!(UCSR0A & (1<<UDRE0)));
52
    UDR0 = data;
53
}
54
55
void RTC_init(void)
56
{
57
    Delay(1000);            // wait for 1 sec to let the Xtal stabilize after a power-on,
58
59
    __disable_interrupt();  // disabel global interrupt
60
61
    cbi(TIMSK2, TOIE2);             // disable OCIE2A and TOIE2
62
63
    ASSR = (1<<AS2);        // select asynchronous operation of Timer2
64
65
    TCNT2 = 0;              // clear TCNT2A
66
    TCCR2A |= (1<<CS22) | (1<<CS20);             // select precaler: 32.768 kHz / 128 = 1 sec between each overflow
67
68
    while((ASSR & (0x01 | 0x04)));       // wait for TCN2UB and TCR2UB to be cleared
69
70
    TIFR2 = 0xFF;           // clear interrupt-flags
71
    sbi(TIMSK2, TOIE2);     // enable Timer2 overflow interrupt
72
73
    OCR2A = 200;    // set timer2 compare value
74
    
75
    __enable_interrupt();                 // enable global interrupt
76
}

Gruss
Owen

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Timer2 Overflow Interrupt initialisiert? Also Interruptmethode korrekt 
vorhanden? Nicht, dass er da immer "Softresettet" in dem er zu einem 
Interrupt springt für den es keinen handler gibt?

Nachgeguckt hab ich jetzt auf die schnelle nicht, wartest du auf die 
richtigen Bits:
while((ASSR & (0x01 | 0x04))); ?

Nimm lieber die x << REGNAME schreibweise, die ist übersichtlicher und 
weniger fehleranfällig.

Bei nem anderen Controller (Cortex-M3) hatte ich das Problem, dass sich 
der Takt nie stabilisiert hat, weil der Quarz nicht richtig dran hing, 
da hat er ewig drauf gewartet, dass der Takt hoch kommt ;)

Mehr fällt mir gerade auch nicht ein.

von slow (Gast)


Lesenswert?

>    __enable_interrupt();                 // enable global interrupt

Was mach diese Zeile in :  void RTC_init(void)

Brauchst Du wirklich all diese Delays? Die sind doch nur grausam. Sowas 
hab ich noch nie gebraucht.

von sebastian (Gast)


Lesenswert?

Owen Senmeis schrieb:
> UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);

Wenn du dein SFR so setzt überschreibst du auch alle anderen Bits. Wäre 
es so nicht sinnvoller:

UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);

von (prx) A. K. (prx)


Lesenswert?

Die RTC-Init wird wohl hängenbleiben.

Bitte beachten, dass mit dem Setzen von AS2 diverse Timer-Register über 
Bord gehen, insbesondere TCCR2. Unangebracht ist also
  TCCR2A |= ...

von (prx) A. K. (prx)


Lesenswert?

slow schrieb:

> Brauchst Du wirklich all diese Delays? Die sind doch nur grausam. Sowas
> hab ich noch nie gebraucht.

Dann hast du wohl noch nie einem 32KHz Quarz bei Start zugesehen und 
auch nicht die betreffende Doku von Atmel gelesen.

von Owen S. (senmeis)


Lesenswert?

Sicher ist eine ISR vorhanden, aber die ist unrelavent.

Kann das sein, dass der Code bei
1
while((ASSR & (0x01 | 0x04)));

haengenbleibt?

Owen

von (prx) A. K. (prx)


Lesenswert?

Keine Oszillation => kein asyncr. Takt => kein Registerupdate => hängt.

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.