Moin Leute, habe ein Problem ein Zeichen zu empfangen. Senden geht hingegen problemlos! Es ging auch schonmal vor einiger Zeit nur jetzt weiß ich nicht mehr wieso es nicht geht. Hier mein Programm.
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <stdint.h> |
4 | #include <inttypes.h> |
5 | |
6 | /*
|
7 | UART-Init:
|
8 | Berechnung des Wertes für das Baudratenregister
|
9 | aus Taktrate und gewünschter Baudrate
|
10 | */
|
11 | |
12 | #ifndef F_CPU
|
13 | /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
|
14 | F_CPU im Makefile definiert werden, eine nochmalige Definition
|
15 | hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
|
16 | #ifndef/#endif
|
17 |
|
18 | Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
|
19 | verwendet wird und dort eine andere, nicht zur Hardware passende
|
20 | Taktrate eingestellt ist: Dann wird die folgende Definition
|
21 | nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
|
22 | von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
|
23 | noch nicht definiert: */
|
24 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
|
25 | #define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
26 | // Ohne ergeben sich unten Fehler in der Berechnung
|
27 | #endif
|
28 | |
29 | #define BAUD 9600UL // Baudrate
|
30 | |
31 | // Berechnungen
|
32 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
33 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
34 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
35 | |
36 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
37 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
38 | #endif
|
39 | |
40 | |
41 | //Prototypes
|
42 | void uart_init(void); |
43 | uint8_t uart_getc(void); |
44 | |
45 | int main(void) |
46 | {
|
47 | uart_init(); |
48 | char start='x'; |
49 | |
50 | while(1) |
51 | {
|
52 | if(uart_getc==start) |
53 | PORTD |=(1<<PD4); //LED |
54 | }
|
55 | return 0; |
56 | }
|
57 | |
58 | |
59 | void uart_init(void) |
60 | {
|
61 | UCSR0B |= (1<<TXEN0); // UART TX einschalten |
62 | UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01)|(1<<USBS0); // Asynchron 8N1 |
63 | |
64 | UBRR0H = UBRR_VAL >> 8; |
65 | UBRR0L = UBRR_VAL & 0xFF; |
66 | }
|
67 | |
68 | /* Zeichen empfangen */
|
69 | uint8_t uart_getc(void) |
70 | {
|
71 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar |
72 | ;
|
73 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben |
74 | }
|
Ich habe beim SUB-D Stecker nur Leitung 2,3 und 5 angeschlossen (reicht ja aus). Ich verwende den ATmega324P20PU und einen externen 16 Mhz Quarz.