Hallo zusammen, Ich habe folgendes Problem. Ich möchte von einem Atmega 328p einen String per UART ausgeben. Dies funktioniert ohne Probleme solange ich Interrupts nicht global aktiviere. Wenn ich Interrupts global mit sei() aktiviere wird mir der String mehrmals oder sogar in einer Endlosschleife gesendet. Anbei noch das Programm:
1 | #define F_CPU 16000000UL
|
2 | #define BAUD 9600
|
3 | #define BRC ((F_CPU/16/BAUD) - 1) //Calculation for setting baud rate
|
4 | |
5 | #include <avr/io.h> |
6 | #include <util/delay.h> |
7 | #include <avr/interrupt.h> |
8 | |
9 | |
10 | volatile uint8_t flag = 0; |
11 | |
12 | |
13 | |
14 | |
15 | int main(void) |
16 | {
|
17 | |
18 | interrupt_init(); |
19 | |
20 | uart_init(); |
21 | |
22 | sei(); |
23 | |
24 | |
25 | while(1) |
26 | {
|
27 | |
28 | if (flag == 1) |
29 | {
|
30 | uart_puts("Flag gesetzt"); |
31 | |
32 | flag = 0; |
33 | }
|
34 | |
35 | |
36 | }
|
37 | |
38 | |
39 | |
40 | }
|
41 | |
42 | void uart_putc( unsigned char data ) |
43 | {
|
44 | |
45 | while ( !( UCSR0A & (1<<UDRE0))) |
46 | {
|
47 | |
48 | }
|
49 | |
50 | UDR0 = data; |
51 | |
52 | }
|
53 | |
54 | void uart_puts (char *s) |
55 | {
|
56 | while (*s) |
57 | { // so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" |
58 | uart_putc(*s); |
59 | s++; |
60 | }
|
61 | }
|
62 | |
63 | void uart_init() |
64 | {
|
65 | |
66 | UBRR0H = (BRC >> 8); |
67 | |
68 | UBRR0L = BRC; |
69 | |
70 | UCSR0B = (1 << TXEN0) | (1 << TXCIE0); |
71 | |
72 | UCSR0C = (1 << UCSZ01)|(1 << UCSZ00); |
73 | |
74 | }
|
75 | |
76 | void interrupt_init() |
77 | {
|
78 | //falling edge interrupt for INT0
|
79 | EICRA = (1<<ISC01); |
80 | |
81 | EIMSK = (1<<INT0); |
82 | |
83 | }
|
84 | |
85 | |
86 | ISR (INT0_vect) |
87 | |
88 | {
|
89 | flag = 1; |
90 | }
|
Danke und Gruss