Forum: Mikrocontroller und Digitale Elektronik AVR, C, Timer: Falsche Frequenz mit Faktor 2,5


von Guri (Gast)


Lesenswert?

Frohes Wochenende,

ich versuche gerade einen Software-UART zum Laufen zu bekommen. Zum 
Senden mit 9600 baud per Compare-Interrupt bekomme ich allerdings etwa 
250 µs anstelle von 104 µs, also etwa das zweieinhalbfache. Der ATtiny45 
ist folgendermaßen eingestellt:
1
-U lfuse:w:0xe2:m -U hfuse:w:0xd7:m -U efuse:w:0xfe:m
also 8 MHz internal RC, CLKDIV ist nicht aktiv. Der Timer ist mit 1/8 
Prescaler eingestellt und das Compare-Register mit 104 gesetzt.
Betrieb mit Labornetzteil 4.2 V bei Raumtemperatur.

Hier ein Minimalbeispiel, das einen Pin in besagtem Interrupt "toggled":
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/wdt.h>
4
5
void init( void )
6
{
7
  wdt_disable();
8
  ACSR  = (1<<ACD);
9
  PORTB = (1<<PB3) | (1<<PB1);
10
  DDRB = (1<<PB3);
11
  // OSCCAL = 0x81 + 16 + 16 + 8;
12
  OCR1A = 104;
13
  TCCR1 = (1<<CTC1) | (1<<CS12);
14
  TIMSK = (1<<OCIE1A);
15
}
16
17
ISR( TIM1_COMPA_vect )
18
{
19
  PORTB ^= (1<<PB3);
20
}
21
22
int main(void)
23
{
24
  init();
25
  sei();
26
  while(1);
27
28
}

Die tatsächliche Zeit messe ich mit einem Oszilloskop.
Wo liegt mein Fehler?

von Guri (Gast)


Lesenswert?

Mit
1
TCCR1 = (1<<CTC1) | (1<<CS11) | (1<<CS10);
halbiert sich die Zeit: 127 µs.

OSCCAL auf 0xFF bringt etwa dasselbe.

von Ingo (Gast)


Lesenswert?

Ich tippe eher auf Faktor 256/104, dein Timer ist offensichtlich falsch 
eingestellt?!


Ingo

von Guri (Gast)


Lesenswert?

OK, danke. Das Problem ist, dass im CTC Modus bei OCR1C resettet wird 
(ich dachte, es ist beim Match von A der Fall).

(Zwischenzeitlich habe ich mit CKOUT die Frequenz gemessen: 8,16 MHz)

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.