Hallo Leute,
ich hab eine kleines Problem mit einer ISR beim Tiny2313.
Und zwar soll mein Tiny wenn er eine Low-Flanke an INT1 detektiert in
der ISR ein Zeichen per Uart Empfangen und dieses in eine globale
Variable schreiben danach soll er wieder zum Hauptprogramm wechseln. Das
anspringen der ISR klappt aber komischerweise liest er immer erst 4
Zeichen ein bevor er wieder raussüringt.
Kann eventuell jemand was zu meinem Code sagen ,weil ich finde den
Fehler einfach nicht.
1 | #include <avr/io.h>
|
2 | #include <avr/wdt.h>
|
3 | #include <inttypes.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/sleep.h>
|
7 |
|
8 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
9 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
10 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
|
11 | #define BAUD 115200L
|
12 |
|
13 | void init_mcu (void);
|
14 |
|
15 | int main (void)
|
16 | {
|
17 | init_mcu();
|
18 | while(1)
|
19 | {
|
20 |
|
21 | PORTB |= (1<<PB4);//LED AUS
|
22 |
|
23 | }
|
24 |
|
25 | return 0;
|
26 | }
|
27 |
|
28 | void init_mcu (void)
|
29 | {
|
30 |
|
31 | DDRB =0b11111111;
|
32 | PORTB=0b11100000;
|
33 | DDRD =0b01100000;
|
34 | PORTD=0b00000000;
|
35 | UCSRB = 1<<TXEN | 1<<RXEN; // UART TX einschalten UART RX einschalten
|
36 | UCSRC = 1<<UCSZ1 | 1<<UCSZ0; // Asynchron 8N1
|
37 | UBRRH = UBRR_VAL >> 8;
|
38 | UBRRL = UBRR_VAL & 0xFF;
|
39 | MCUCR |=(1<<ISC10)|(1<<ISC11);
|
40 | GIMSK |=(1<<INT1);
|
41 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
42 | //_delay_ms(30000);
|
43 | sei();
|
44 | }
|
45 |
|
46 | ISR(INT1_vect)
|
47 | {
|
48 |
|
49 |
|
50 | PORTB &= ~(1<<PB4);
|
51 | in=uart_getc();
|
52 | uart_putc(in);
|
53 | }
|
Falls sich jemand nach dem Sinn fragt : Dies ist erstmal nur ein Test ob
das rein und rausspringen klappt.Es geht hinterher darum ein
Steuerzeichen zu empfangen was von einem Linux Router kommt,wobei dessen
RS232 Schnittstelle aber nicht explizit frei ist für diese eine Aufgabe.
MfG
Max