Hi,
ich bin völlig verzweifelt - mit meinem Latein am Ende....
Seit geraumer Zeit entwickle ich erfolgreich ein Programm mit GCC für
eine Rolladensteuerung. Mein Mega16 sendet dazu sehr robust seit Wochen
wie ein Weltmeister mit 9600Baud Daten. Empfangen (von Hyperterm) will
er aber trotz diverser Versuche nicht :-(
Ich nutze einen Mega16 mit Minimalbeschaltung: 7,3728MHz-Quarzoszllator
und MAX232 an PINs 14 und 15. Fuses für den Oszillator etc. stimmen...
Ich habe diverse Dinge erfolgreich ausprobiert... Auch der
"Loopback-Test" (Überbrücken von Pin 14+15 und Echo aufs Terminal)
funktioniert einwandfrei. Damit wäre der PC, die Anbindung, sowie der
MAX getestet ...
Ich verwende den anhängenden (fehlerfrei compilierbaren) Code.
1 | #define F_CPU 7372800UL // Takt in Herz
|
2 | #include <avr/io.h>
|
3 |
|
4 | void toggle_LED(void)
|
5 | {
|
6 | if (PINB & (1<<PINB4)) { PORTB &= ~(1<<PB4); }
|
7 | else { PORTB |= (1<<PB4); }
|
8 | }
|
9 |
|
10 | int uart_putc(unsigned char c)
|
11 | {
|
12 | while (!(UCSRA & (1<<UDRE))) { ;} /* warten bis Senden moeglich */
|
13 | UDR = c; /* sende Zeichen */
|
14 | return 0;
|
15 | }
|
16 |
|
17 | void uart_puttext(char array[]) // gib text auf uart aus
|
18 | {
|
19 | uint8_t i=0;
|
20 |
|
21 | while(array[i]!='\0') {
|
22 | uart_putc(array[i]);
|
23 | i++;
|
24 | }
|
25 | }
|
26 |
|
27 | int main (void) {
|
28 |
|
29 | //UART konfigurieren
|
30 | UCSRB |= (1<<RXEN) | (1<<TXEN); // UART RX+TX einschalten
|
31 | UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Asynchron 8N1
|
32 | UBRRH = 47 >> 8; // Baud-Rate=9600
|
33 | UBRRL = 47 & 0xFF;
|
34 |
|
35 | uart_putc('\n'); uart_putc('\r');
|
36 | uart_puttext(__TIME__);
|
37 | uart_putc('\n'); uart_putc('\r');
|
38 |
|
39 | //Warte auf Taste
|
40 | uart_puttext("Taste1");uart_putc('\n'); uart_putc('\r');
|
41 | while (!(UCSRA & (1<<RXC))) { ;}
|
42 |
|
43 | uart_puttext("Taste2");uart_putc('\n'); uart_putc('\r');
|
44 | while (!(UCSRA & (1<<RXC))) { ;}
|
45 |
|
46 | while(1) {
|
47 | // Blinken
|
48 | toggle_LED();
|
49 | }
|
50 | return 0;
|
51 | }
|
Den einzigen Hinweis auf einen Fehler ist der Signallevel an PIN 14 des
Mega16. Wenn ich mehrere Zeichen vom PC sende, sehe ich Signale an PIN
14. Im Ruhezstand ist der Pegel 5V und geht auf ca. 2,5V runter wenn
Zeichen gesendet werden.
Grundsätzlich ist dieses Verhalten ja richtig, allerdings wundert mich
der Pegel von 2,5V für "low".
Wer hat eine Idee woran es liegen könnte? Das obige Programm liefert
genau folgende Ausgabe:
Danach tut sich nichts mehr ...
Gruß und schonmal Danke für die Tipps ...
Andreas