Hallo,
Haben folgendes Programm in den Controller (ATMega 16) geladen:
1 | #include <avr/io.h>
|
2 |
|
3 | #ifndef F_CPU
|
4 | #define F_CPU 8000000UL
|
5 | #endif
|
6 |
|
7 | #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
|
8 |
|
9 | #define UART_BAUD_RATE 9600
|
10 |
|
11 |
|
12 | int main (void)
|
13 | {
|
14 | UCSRB |= (1<<TXEN);
|
15 | UCSRC |= (1<<URSEL) | (3<<UCSZ0);
|
16 |
|
17 | UBRRH = 0x00;
|
18 | UBRRL = 0x33;
|
19 |
|
20 | //Senden einzelner Zeichen
|
21 |
|
22 | while (!(UCSRA & (1<<UDRE)))
|
23 | {
|
24 | }
|
25 |
|
26 | while (1)
|
27 | {
|
28 | UDR = 'A';
|
29 | }
|
30 |
|
31 | return (0);
|
32 | }
|
Die Baudrate ist auf 9600 eingestellt -> siehe UBRRL = 33_hex -> 51_dez
-> bei 8 MHz = 9600 Baud (laut Toturial)
Wir haben einen Schnittstellentreiber benutzt (MAX232). Zum Testen, ob
der Controller "sendet", haben wir ein Schnittstellentester zwischen
MC und PC geschaltet. Die LED TX und RX leuchten korrekt. Wir verwenden
auch das korrekte Kabel. Wir wollen das Zeichen "A" nun am PC auslesen.
Wir benutzen HyperTerminal. Drücken wir nun auf lesen (Baud - Rate,
Stop - , Startbit und soweiter korrekt eingestellt) erhalten wir
Zeichen vom MC. Jedoch NICHT nur dass gewünschte A, sondern ab und zu
ist ein "P" dabei, ein "I" u.s.w. Sieht aber alles sehr regelmäßig aus.
Wir haben nun zum Test ein anderes Zeichen vom MC gesendet. Es kommt
aber immer der selbe "Zeichensalat" an. Wir haben die TX - Leitung des
MC am Oszilloskop untersucht. Das "A" lässt sich nicht erkennen. Wir
haben das wie folgt gemacht:
ASCII - Code für "A" herausgesucht. Diesen in einen Binärwert
umgerechnet. Start- und Stopbit berücksichtigt. Dann haben wir uns
dass zu erwartende Bitmuster aufgezeichnet.
Anschließend haben wir gemessen. Das theoretische stimmt keineswegs
mit dem gemessenen überein. Wir sehen zwar TTL - Signale, die auch
sehr regelmäßig sind, diese ergeben aber keinen Sinn. Rechnerisch
brauchen wir bei 9600 Baud pro Bit etwa 10 us. Am Oszilloskop nach-
gemessen sind es etwa 100 us.
Ist am Programm etwas faul?
Sonstige Ideen ?
Achja:
Folgende Änderung des Quellcodes haben wir verwendet:
1 | while (1)
|
2 | {
|
3 | if (UCSRA & (1<<UDRE))
|
4 | {
|
5 | UDR = 'A';
|
6 | }
|
7 | }
|
Nach dieser Änderung sollte er nach jedem gesendeten Zeichen auf die
Bereitschaft ein Zeichen zu senden warten. Aber auch hier das selbe
Problem wie bereits erwähnt. Wir empfangen "Zeichensalat".