Liebe Alle,
ich komme bei folgendem Problem nicht weiter. Ein Atmega8 (verbaut auf
einer Platine für eine Motorsteuerung per PWM und diverse LEDs und
Taster) soll nun noch per UART Daten ausgeben. Code ist wiefolgt:
1 | #include <avr/io.h>
|
2 | #include <string.h>
|
3 | #include <stdlib.h>
|
4 |
|
5 | #define TAKT 8000000UL
|
6 | #define UART_BAUDRATE 4800
|
7 | #define F_CPU 8000000UL
|
8 |
|
9 | #include <util/delay.h>
|
10 |
|
11 | #define LED_PORT PORTC
|
12 | #define LED_GRUEN 0
|
13 | #define LED_LILA 1
|
14 | #define LED_GELB 2
|
15 | #define LED_ROT 3
|
16 |
|
17 |
|
18 |
|
19 | // Berechnung der Konfigurationsparameter
|
20 | #define UART_SETTING ((TAKT/16L/UART_BAUDRATE)-1)
|
21 |
|
22 |
|
23 | void setup_uart()
|
24 | {
|
25 |
|
26 | UBRRH = (char) (UART_SETTING >> 8);
|
27 | UBRRL = (char) (UART_SETTING);
|
28 |
|
29 |
|
30 | UCSRB = (1<<TXEN);
|
31 |
|
32 | /* Asynchron, 8N1 */
|
33 | UCSRC = (1<<URSEL) | (3<<UCSZ0);
|
34 | }
|
35 |
|
36 | void uart_putchar(char c)
|
37 | {
|
38 | while (!(UCSRA & (1 << UDRE)))
|
39 | ;
|
40 | UDR = c;
|
41 | }
|
42 |
|
43 | void uart_putstring(char *str)
|
44 | {
|
45 | unsigned char i;
|
46 |
|
47 | for (i=0;i<255;i++)
|
48 | {
|
49 | if (str[i] != 0)
|
50 | uart_putchar(str[i]);
|
51 | else
|
52 | break;
|
53 | }
|
54 | }
|
55 |
|
56 |
|
57 |
|
58 | int main(void)
|
59 | {
|
60 |
|
61 |
|
62 | DDRC=0b00001111;
|
63 |
|
64 | PORTC=0xff;
|
65 |
|
66 |
|
67 | char kommando[255];
|
68 | char temp[10];
|
69 | unsigned char zahl=0;
|
70 |
|
71 | setup_uart();
|
72 |
|
73 | uart_putstring("UART läuft ...\r\n\r\n");
|
74 |
|
75 | while (1)
|
76 | {
|
77 |
|
78 | LED_PORT ^= (1 << LED_GRUEN | 1 << LED_LILA | 1 << LED_GELB | 1 << LED_ROT);
|
79 | _delay_ms(1000);
|
80 |
|
81 | }
|
82 |
|
83 | return 0;
|
84 | }
|
Der Atmega8 wird über nen 8 Mhz Quarz getaktet. Zu Testzwecken ist von
dem Atmega8 auch die gesamte andere Steuerungslogik runtergeflogen - ich
will lediglich den UART darauf testen. Die Verbindung über die
Tutorial-RS232 Signalanpassung gibt jedoch auf den PC keinen Mucks aus.
Gar nichts.
Der gleiche Code (oben habe ich ihn etwas verknappt) funktioniert jedoch
auf einem Atmega32 (mit gleichem Quarz, der is also funktionstüchtig)
und sendet das gewünschte Ergebnis.
Gibt es irgendwelche Stolpersteine die ich bei der "Portierung" von 32
auf 8 beachten muss oder ist der Fehler in der Hardware zu suchen? Die
RS232 Wandlung erfolgt über die gleichen Bauteile auf nem Testboard.
Viele Grüße und Danke
Hans