Hallo zusammen,
ich versuche derzeit an einer ATmega32-Platine mit einem max232
(Verdrahtung nach
http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht#Daten_und_Texte_zum_PC_.C3.BCbertragen)
eine grundlegende µC<->PC-Kommunikation zum Laufen zu bringen.
Der µC wird von einem 16MHz Quarzoszillator auf Trab gehalten und
scheint zuverlässig zu funktionieren.
Nun habe ich den Quellcode aus dem Wiki genommen (siehe hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#UART_initialisieren),
um den UART zu initialisieren und periodisch alle 500ms ein 'x' zu
senden.
Da ich leider kein Oszilloskop besitze, kann ich mir die generierte
Signalform nicht ansehen, allerdings habe ich mittels einer LED erkennen
können, dass auf der TxD-Leitung des µC alle 500ms etwas passiert.
Durch diverse Tests kann ich sicher sagen, dass das Beschreiben des
Registers "UDR" alle 500ms periodisch durchgeführt wird; d.h. dass es in
der Hinsicht keine Fehler im Quellcode gibt.
Das Problem ist allerdings, dass auf meinem PC-Terminal (GTKTerm unter
Ubuntu) nichts passiert.
Um zu testen, ob es am PC liegen könnte, habe ich RxD und TxD der
PC-Leitung überbrückt und vom PC aus etwas gesendet. Dies wurde im
Terminal korrekt zurückgesendet. Am PC an sich liegt es wohl nicht.
Wie und wo würdet ihr weiter nach Problemen suchen? Ich stehe ein wenig
auf dem Schlauch...
Vielen Dank!
alias5000
=======================================================================
Auszüge aus dem Quellcode:
1 | /*
|
2 | UART-Init:
|
3 | Berechnung des Wertes für das Baudratenregister
|
4 | aus Taktrate und gewünschter Baudrate
|
5 | */
|
6 |
|
7 | #ifndef F_CPU
|
8 | /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
|
9 | F_CPU im Makefile definiert werden, eine nochmalige Definition
|
10 | hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
|
11 | #ifndef/#endif
|
12 |
|
13 | Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
|
14 | verwendet wird und dort eine andere, nicht zur Hardware passende
|
15 | Taktrate eingestellt ist: Dann wird die folgende Definition
|
16 | nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
|
17 | von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
|
18 | noch nicht definiert: */
|
19 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
20 | #define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
21 | // Ohne ergeben sich unten Fehler in der Berechnung
|
22 | #endif
|
23 |
|
24 | #define BAUD 4800UL // Baudrate
|
25 |
|
26 | // Berechnungen
|
27 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
28 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
29 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
30 |
|
31 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
32 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
33 | #endif
|
34 |
|
35 | void initializeUART();
|
36 |
|
37 | int main (void)
|
38 | {
|
39 | char currentMode = 1;
|
40 | char lastMode = 0;
|
41 |
|
42 | //erstmal alles initialisieren
|
43 | initializePorts();
|
44 | initializeUART();
|
45 |
|
46 |
|
47 | while(1) {
|
48 | //hier wird sonstiges Getan, bei dem offensichtlich (durch LED-Anzeigen) sichergestellt ist, dass der Code hier nicht hängen bleibt
|
49 |
|
50 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
51 | {
|
52 | }
|
53 |
|
54 | UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
|
55 | //_delay_ms(500);
|
56 |
|
57 | }
|
58 |
|
59 | }
|
60 |
|
61 | void initializeUART() {
|
62 | UCSRB |= (1<<TXEN)|(1<<RXEN); // UART TX/RX einschalten
|
63 | UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
|
64 |
|
65 | UBRRH = UBRR_VAL >> 8;
|
66 | UBRRL = UBRR_VAL & 0xFF;
|
67 |
|
68 |
|
69 | }
|