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?