Forum: Mikrocontroller und Digitale Elektronik Atmega8 URAT RS232 - Problem Komunikation PC - MC sendet nichts


von Ban (Gast)


Angehängte Dateien:

Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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));

von Ban (Gast)


Lesenswert?

@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.

von Thomas E. (thomase)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Ban (Gast)


Lesenswert?

@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 
:(

von Karl H. (kbuchegg)


Lesenswert?

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.

von Ban (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.