Hallo liebe Mikrocontroller-Gemeinde, dies ist mein erster Beitrag, darum bitte ich um Verständnis bei eventuellen Formfehlern. Ich gebe mir die aller größte Mühe Fehler zu vermeiden. Ich hoffe ihr könnt mir weiterhelfen! Ich möchte von einem Atmega8 via UART bzw. RS232 Daten an einen Computer schicken. Aufgebaut habe ich die Schaltung wie es im AVR-Tutorial: UART beschrieben wird. Mein MC-Programm habe ich angehangen, dieses basiert auch auf den auf der Website beschriebenen Zeilen zur UART. Nun mein Problem: Der MC weigert sich Irgendetwas zu senden. Ich horche mit einem Ozsi den TXD und RXD ab und sehe nichts. Auch am PC empfange ich nichts. Was ich bereits überprüft habe: Die Verbindung von MC über MAX232 zum Stecker am PC scheinen i.o. Ich hab den MC aus dessen Sockel entfernt und die Buchsen TXD und RXD gebrücket und von PC angefangen Zeichen zu senden. Steck die Brücke werden diese als Echo auch ohne Probleme an den PC zurück gesendet. Also gehe ich davon aus das die Hardware soweit funktionsfähig ist. Das Programm hab ich auch schon zich mal überprüft, doch kann ich meinen Fehler nicht finden. So, ich hoffe mal das ich alles Notwendig erwähnt habe. Wäre echt sehr Dankbar könntet ihr mir weiterhelfen. Beste Grüße Ban
Hi > UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << USBS); > UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0); Mit der zweiten Zeile überbügelst du die Einstellungen von der ersten. MfG Spess
Der Fehler mit UCSRC (und implizit damit auch UBRRH) sollte den UART allerdings nicht daran hindern, wenigstens mit den Pins zu wackeln. Schmeiss aus der Init mal den Teil
1 | // Flush Receive-Buffer //0 0 1 6-Bit
|
2 | //(entfernen evtl. vorhandener ungültiger Werte) //0 1 0 7-Bit
|
3 | do{UDR;} //0 1 1 8-Bit |
4 | while (UCSRA & (1 << RXC)); //1 1 1 9-Bit |
raus. Übrigens: scheusliche Schreibweise. Ich hab zuerst gedacht, da wäre eine Endlosschleife.
1 | // Flush Receive-Buffer
|
2 | //(entfernen evtl. vorhandener ungültiger Werte)
|
3 | do { |
4 | UDR; |
5 | } while (UCSRA & (1 << RXC)); |
@Spess Das ist mir aber neu, dass das Setzten von unterschiedlichen Bits aufeinander Auswirkungen hat, in der Form das die zuvor gesetzten Bits wieder geändert werden. Du meinst also ich sollte das in einer Zeile tun? Wenn ja hat das mir leider nicht viel gebracht. @Karl Heinz Denn Flush Receive-Buffer habe ich rausgenommen. Und du hast Recht, die Schreibweise ist wirklich nicht die feine englische Art. Leider hat aber auch diese Maßnahme meinen MC nicht dazu beweg Etwas von sich zu eben.
Ban schrieb: > Das ist mir aber neu, dass das Setzten von unterschiedlichen Bits > aufeinander Auswirkungen hat, in der Form das die zuvor gesetzten Bits > wieder geändert werden. Du meinst also ich sollte das in einer Zeile > tun? Deine 6 Werte kannst du auch in 6 Zeilen schreiben. Nur nicht so: > UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << USBS); > UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0); Da ^ darf kein Gleichheitszeichen stehen, sondern das muss mit dem aktuellen Inhalt ODER verknüpft werden: UCSRC |= (1 <<...... mfg.
Hi >Das ist mir aber neu, dass das Setzten von unterschiedlichen Bits >aufeinander Auswirkungen hat, in der Form das die zuvor gesetzten Bits >wieder geändert werden. Wenn du schreibst a *=* 5 a *=* 6 Welchen Wert hat a nach der zweiten Zeile? Allerdings hat das beim ATMega8 noch einen anderen Effekt. Das Bit URSEL entscheidet, ob der Wert in UCSRC oder UBRRH landet. Da hier > UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0); URSEL nicht gesetzt ist (da hatte ich mich geirrt) beschreibst du UBRRH mit 0x04. MfG Spess
@Spess Mit dem |= solltest du wohl Recht haben. In meinem Fall könnte ich dann auch anstatt:
1 | UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << USBS); |
2 | UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0); |
folgendes schreiben:
1 | UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); |
Da die anderen Bits ja Null sind. Zu: spess53 schrieb: > Allerdings hat das beim ATMega8 noch einen anderen Effekt. Das Bit URSEL > entscheidet, ob der Wert in UCSRC oder UBRRH landet. Da hier > >> UCSRC = (0 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0); > > URSEL nicht gesetzt ist (da hatte ich mich geirrt) beschreibst du UBRRH > mit 0x04. Da habe ich das URSEL richtig gesetzt oder? Ich meine nur wenn das "1" ist kann ich dem MC sage wieviel Bit ich haben möchte. Leider löst das mein Problem noch nicht. Der MC ist nach wie vor still :(
Bist du sicher, dass du am richtigen Pin misst und du den Pin extern nicht irgendwie festgenagelt hast? Minimalprogramm
1 | #include <avr/io.h> |
2 | |
3 | #define F_CPU 16000000UL
|
4 | #define BAUD 9600
|
5 | #define MYUBRR F_CPU/16/BAUD-1
|
6 | |
7 | int main (void) |
8 | {
|
9 | UBRRH = MYUBRR >> 8; |
10 | UBRRL = MYUBRR; |
11 | |
12 | UCSRB |= (1 << TXEN); |
13 | |
14 | while( 1 ) { |
15 | |
16 | while(!(UCSRA & (1<<UDRE))) |
17 | ;
|
18 | |
19 | UDR = 'a'; |
20 | }
|
21 | }
|
Damit muss der Mega8 mit dem Pin wackeln. Ob du am PC damit ein 'a' hervorzaubern kannst ist eine andere Frage, aber mit dem Oszi musst du damit am Pin TxD (Pin 3) auf jeden Fall Bewegung sehen.
Also nun hat es funktioniert! Vielen Dank an euch Beide! Weiß nur leider nicht woran es letzten Endes gelegen hat, aber bin froh des es jetzt geht. Danke noch mal.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.