Tach auch!
Ich versuche gerade eine Kommunikation zwischen PC und AVR über UART
herzustellen. Dabei war mir der Artikel hier bei µC.net mehr als nur
eine Hilfe.
Soweit kann ich auch Daten vom PC an den AVR senden.
Dieser gibt das richtige Bitmuster auch immer über die LEDs aus.
Direkt im Anschluss darauf soll dieses Zeichen wieder an den PC
zurückgeschickt werden und im "Recived Data" angezeigt werden.
Letzteres funktionierte aber nicht. Ich finde auch nirgends den Fehler.
Das ganze hab ich auf dem ATmega32 mit externem Quarz (12Mhz) am laufen.
Als Terminal benutzt ich HTerm.
Der Code sieht so aus:
1 | #include <inttypes.h>
|
2 | #include <avr/io.h>
|
3 |
|
4 | #ifndef F_CPU
|
5 | #define F_CPU 12000000UL
|
6 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 12Mhz"
|
7 | #endif
|
8 |
|
9 | #define BAUD 2400UL
|
10 |
|
11 | // Berechnungen
|
12 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
13 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
14 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
15 |
|
16 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
17 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
18 | #endif
|
19 |
|
20 |
|
21 |
|
22 | /*****************************
|
23 | ******** Funktionen **********
|
24 | ******************************/
|
25 |
|
26 | void uart_init(void)
|
27 | {
|
28 | UBRRH = UBRR_VAL >> 8;
|
29 | UBRRL = UBRR_VAL & 0xFF;
|
30 |
|
31 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
|
32 | UCSRB |= (1<<RXEN);
|
33 | }
|
34 |
|
35 |
|
36 | uint8_t uart_getc(void)
|
37 | {
|
38 | while (!(UCSRA & (1<<RXC)));
|
39 | return UDR;
|
40 | }
|
41 |
|
42 | int uart_putc(unsigned char c)
|
43 | {
|
44 | while (!(UCSRA & (1<<UDRE)));
|
45 |
|
46 | UDR = c;
|
47 | return 0;
|
48 | }
|
49 |
|
50 |
|
51 | /*****************************
|
52 | ****** Hauptprogramm *********
|
53 | ******************************/
|
54 |
|
55 | int main(void)
|
56 | {
|
57 | uart_init();
|
58 | DDRA = 0xFF; // PORTC Ausgang
|
59 |
|
60 | while (1)
|
61 | {
|
62 | uint8_t c;
|
63 | c = uart_getc();
|
64 | PORTA = ~c;
|
65 |
|
66 | uart_putc(~c);
|
67 | }
|
68 | return 0;
|
69 | }
|