Hallo, Ich habe das Problem das mein Attiny2313 mit dem Code unten einfach nicht per Uart empfangen will, der Interrupt wird nicht ausgelöst was ich an der LED erkennen kann. Wenn ich den Code zum Led blinken im normalen Code verwende blinkt die Led wie sie soll. Ein externer Quarzoszillator(Ja der mit 4 Beinchen) mit 16Mhz ist dran, nachdem's mit dem Internen auch nicht funktioniert hat. Die Fusebits sind richtig auf Externen Takt und ohne Clockdiv gesetzt. Am PC Empfang ich die gesendeten Daten 1A und wenn ich mit dem PC sende kommen auch die richtigen Daten an, das hab ich per LA am Pin geprüft. Also sieht irgendjemand einen Fehler in dem Code? Mir fällt einfach nichts mehr ein was ich noch debuggen könnte...
1 | /*************************************************************************
|
2 | Title: Servo Cam
|
3 | Author: Strangelet http://lloyd3000.wordpress.com/
|
4 | Hardware: Attiny2313
|
5 |
|
6 | **************************************************************************/
|
7 | |
8 | #include <stdlib.h> |
9 | #include <avr/io.h> |
10 | #include <avr/pgmspace.h> |
11 | #include <avr/interrupt.h> |
12 | #include <util/delay.h> |
13 | |
14 | |
15 | #define UART_BAUD 9600
|
16 | |
17 | #define UART_BAUD_CALC(UART_BAUD,F_OSC) ((F_CPU)/((UART_BAUD)*16L)-1)
|
18 | |
19 | #define F_CPU 16000000UL
|
20 | |
21 | volatile char data; |
22 | |
23 | |
24 | void USART_Transmit(void); |
25 | |
26 | |
27 | int main(void) |
28 | {
|
29 | |
30 | DDRB = 0b01111110; |
31 | |
32 | UBRRH=(unsigned char)(UART_BAUD_CALC(UART_BAUD,F_CPU)>>8); |
33 | UBRRL=(unsigned char)UART_BAUD_CALC(UART_BAUD,F_CPU); |
34 | |
35 | |
36 | // UART Receiver und Transmitter anschalten
|
37 | UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE); |
38 | // Data mode 8N1, asynchron
|
39 | UCSRC = (1 << UCSZ1) | (1 << UCSZ0); |
40 | |
41 | sei(); |
42 | |
43 | data = 'x'; |
44 | |
45 | |
46 | while(1){ |
47 | |
48 | USART_Transmit(); |
49 | _delay_ms(200); |
50 | |
51 | }
|
52 | |
53 | }
|
54 | |
55 | |
56 | ISR(USART_RX_vect){ |
57 | |
58 | PORTB |= (1<<PB2); //Turn LEDs on |
59 | _delay_ms(200); |
60 | PORTB &= ~(1<<PB2); //Turn LEDs on |
61 | |
62 | |
63 | /* Wait for data to be received */
|
64 | while ( !(UCSRA & (1<<RXC)) ); |
65 | |
66 | /* Get and return received data from buffer */
|
67 | data = UDR; |
68 | |
69 | }
|
70 | |
71 | |
72 | void USART_Transmit(void) |
73 | {
|
74 | /* warten bis Senden moeglich */
|
75 | while (!(UCSRA & (1<<UDRE))) |
76 | {
|
77 | }
|
78 | /* schreibt das Zeichen x auf die Schnittstelle */
|
79 | UDR = data; |
80 | }
|