AVR, C, Timer: Falsche Frequenz mit Faktor 2,5

Gast #2817584
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren