Gast
#181312
Hallo zusammen, Ich habe einen ATMega16 und benutze das neueste WinAVR. Hier ist mein Quellcode: #include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> void delay_ms(uint16_t ms) { for (uint16_t i=0;i<ms;i++) { _delay_ms(1); } } void uart_putc(uint8_t c) { while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */ UDR = c; /* sende Zeichen */ } int main (void) { PORTA=0x00; DDRA=0x00; UCSRA=0b00000000; UCSRB=0b11011000; UCSRC=0b10100110; UBRRH=0b00000000; UBRRL=0b01100111; // Global enable interrupts sei(); delay_ms(500); // *3 uart_putc(0x89); DDRA=0xFF; // Wird ausgefuehrt *1 delay_ms(500); // *4 //DDRA=0xFF; // Wurde nicht mehr ausgefuehrt *2 uart_putc(0x57); while (1) { }; return 1; } Mein Problem ist, dass *2 nicht ausgefuehrt wird, wenn ich Interrupts angeschaltet habe. Wenn ich sei() auskommentiere klappt alles oder wenn ich das USART ohne den Transmit Interrupt initialisiere. Wenn ich die Zeilen mit delay_ms auskommentiere klappt es auch. Kommentiere ich *4 aus klappt es, wenn nur *3 weg ist, klappt es nicht. Also wenn ich erst uart_putc und dann delay_ms aufrufe, stürzt es genau da ab. Ich habe mir die cof Datei generiert und im AVR Studio debuggt. Da stürzt das Programm auch an der Stelle ab. Ich weiß nicht mehr weiter. Bitte helft mir! :) Grüße