Atmega8 URAT RS232 - Problem Komunikation PC - MC sendet nichts

Gast #2508621
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
Angehängte Dateien:
Gast
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));
Gast
@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.
Gast
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
Gast
@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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.