Forum: Mikrocontroller und Digitale Elektronik UART durchschleifen Atmega8


von Kaito C. (kaitocross)


Lesenswert?

Hallo :)
Um einen Routerlog per UART (38400 Baud) auszulesen möchte ich diesen an 
meinen atmega8 anschließen, um den atmega8 an meinen PC anzuschließen um 
per UART den Router zu verfolgen.
Hintergrund: Das UART des Routers läuft auf 3,3V Pegel und ich möchte 
mir den Pegelwandler sparen.
Der atmega8 sitzt auf einem MyAvrBoard light 
(http://shop.myavr.de/Hardware%20-%20Baus%C3%A4tze/myAVR%20Board%20light,%20Bausatz.htm?sp=article.sp.php&artID=200084) 
und hat daher einen USB-Anschluss.
Würde es reichen, den rx/tx des Routers an die 2 Interrupts zu hängen 
und die werte an die UART ports des atmega8 anzulegen sobald sie sich 
ändern oder müsste eine andere lösung her?
lg

von Oliver (Gast)


Lesenswert?

Du könntest entweder:

- beide USARTS mit gleicher Baudrate aufsetzen und den RX Interrupt 
einschalten
- im RX-Interrupt jeweils das empfangene Byte auf dem anderen USART 
senden
- In der Hauptschleife nur sei(); und dann eine Endlosschleife ohne 
Inhalt

oder:

- den USART nicht benutzen und stattdessen die Portpins entsprechend als 
Ein- und Ausgänge konfigurieren
- in einer Endlosschleife die beiden Eingänge ständig abfragen und den 
dazu
gehörigen Ausgangspin auf den gleichen Pegel setzen
- Vorteil: Funktioniert mit beliebigen Baudraten, solange die 
Taktfrequenz ausreichend hoch ist

von Oliver (Gast)


Lesenswert?

Hier ein Beispiel, wie es mit einfachem Durchreichen von einem Pin an 
den nächsten funktioniert:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
6
  PORTE = (0 << PINE0) | (1 << PINE1);
7
  PORTH = (0 << PINH0) | (1 << PINH1);
8
9
  DDRE = (1 << PINE1);
10
  DDRH = (1 << PINH1);
11
12
  while (1==1)
13
  {
14
    if ((PINE & (1 << PINE0)) == 0)
15
      PORTH &= ~(1 << PINH1);
16
    else
17
      PORTH |= (1 << PINH1);
18
19
    if ((PINH & (1 << PINH0)) == 0)
20
      PORTE &= ~(1 << PINE1);
21
    else
22
      PORTE |= (1 << PINE1);
23
  }
24
25
  return 0;
26
27
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Kaito C. schrieb:
> Würde es reichen, den rx/tx des Routers an die 2 Interrupts zu hängen
> und die werte an die UART ports des atmega8 anzulegen sobald sie sich
> ändern oder müsste eine andere lösung her?

 Welche UART ports ?
 MEGA8 hat nur einen.
 Und wenn MEGA nichts anderes zu tun hat, als nur Pegel umzusetzen,
 kannst du das auch in einer normaler Schleife in main() tun.
 USART ausschalten, TX pin auf Ausgang, die beiden Eingänge ständig
 abfragen und entsprechend ihren Zustand nach TX durchschalten.
 Nur aufpassen, wer wann anfängt zu senden (Startbit). Idle und
 Stoppbit ist dasselbe, dort wo du als erstes Startbit empfängst,
 bleibt so lange Aktiv, bis ein Startbit vom anderen Eingang kommt.

Oliver schrieb:
> - in einer Endlosschleife die beiden Eingänge ständig abfragen und den
> dazu gehörigen Ausgangspin auf den gleichen Pegel setzen
> - Vorteil: Funktioniert mit beliebigen Baudraten, solange die
> Taktfrequenz ausreichend hoch ist
 Blödsinn.
 Welche Ausgangpins ? Geht auf USB raus - nur ein Ausgang.

Oliver schrieb:
> Hier ein Beispiel, wie es mit einfachem Durchreichen von einem Pin an
> den nächsten funktioniert:
 Noch dümmer.
 Erstens: MEGA8 hat kein E- und H-Port.
 Zweitens: siehe oben, nur ein Ausgang.
 Drittens: deinen Programm will ich gar nicht kommentieren.

von Kaito C. (kaitocross)


Lesenswert?

Wenn mans richtig anschließt kann man in Dauerschleife PORTD = PINC 
ausführen. Klappt bei mir mit 38400 Baud nur lesend angedacht!!

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marc Vesely schrieb:
>  Welche UART ports ?
>  MEGA8 hat nur einen.

Zum lesen brauchst Du nur RX, zum Senden nimmst Du TX. Dafür reicht ein 
UART.

>  Blödsinn.
> [...]
>  Noch dümmer.

Sag mal, gehst Du immer so mit Leuten um, mit denen Du kommunizierst?

>  Erstens: MEGA8 hat kein E- und H-Port.

Was hast Du an dem Wort "Beispiel" nicht verstanden?

>  Drittens: deinen Programm will ich gar nicht kommentieren.

Frage: Hast Du im realen Leben vielleicht schon mal erlebt, dass Du was 
auf die Fresse bekommen hast und Du konntest es Dir wirklich nicht 
erklären, warum?

von Cor Tex (Gast)


Lesenswert?

Kaito C. schrieb:
> Wenn mans richtig anschließt kann man in Dauerschleife PORTD = PINC
> ausführen.

Mach mal lieber PORTD |= PINC

von Cor Tex (Gast)


Lesenswert?

Ach quatsch. Vergiß meine Beitrag. Ist falsch

von Max H. (hartl192)


Lesenswert?

Cor Tex schrieb:
> Mach mal lieber PORTD |= PINC
Und wie werden damit bits in PORTD die einmal gesetzt wurden jemals 
wieder gelöscht? Der Ruhepegel für UART ist 1 und somit wäre der 
ausgangs Pin seit dem Rest dauerhaft auf 1.

von John Wayne sein Garagennachbar (Gast)


Lesenswert?

Frank fragte vorsichtig den Schwätzer Marc Vesely:
>Frage: Hast Du im realen Leben vielleicht schon mal erlebt, dass Du was
>auf die Fresse bekommen hast und Du konntest es Dir wirklich nicht
>erklären, warum?

:-)))

Wunderbar! Das sind die richtigen Antworten auf solche Anwürfe...

von Thomas E. (thomase)


Lesenswert?

John Wayne sein Garagennachbar schrieb:
> Wunderbar! Das sind die richtigen Antworten auf solche Anwürfe...

Bist du sonst nicht immer John Wayne seine Schwiegermutter?

mfg.

von John Wayne sein Garagennachbar (Gast)


Lesenswert?

Thomas fragte:
>Bist du sonst nicht immer John Wayne seine Schwiegermutter?

Nein, das ist der Schwiegervater. Ich bin der Garagennachbar sowohl
vom Schwiegervater als auch von John selbst. Es handelt sich nämlich
um eine Doppelgarage.

Ich hoffe, daß ich nun alle Fragen erschöpfend beantwortet habe.

von M. K. (sylaina)


Lesenswert?

Kaito C. schrieb:
> Um einen Routerlog per UART (38400 Baud) auszulesen möchte ich diesen an
> meinen atmega8 anschließen, um den atmega8 an meinen PC anzuschließen um
> per UART den Router zu verfolgen.

Öhm, warum den Umweg über den Atmega8? Es gibt doch mehr als genügend 
UART2USB oder UART2RS232 Wandler.

Beispiel: 
http://www.elv.de/Kompakt-umgesetzt-–-Mini-USB-UART-Umsetzer/x.aspx/cid_726/detail_30827

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael Köhler schrieb:
> Öhm, warum den Umweg über den Atmega8?
Weil er offenbar sein Board nicht umlöten und den darauf befindlichen 
RS232-USB Wandler verwenden will...

Kaito C. schrieb:
> um per UART den Router zu verfolgen.
Zum Mithören allein reicht doch die RX-Leitung des USB-Wandlers aus. 
Wofür brauchst du die TX Leitung?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Da die beiden Beiträge auf die ich geantwortet habe, nicht auch gelöscht
 würden, nehme ich an, dass das löschen meiner Beiträge ein Fehler war,
 deshalb nochmals die Antworten:

Frank M. schrieb:
> Frage: Hast Du im realen Leben vielleicht schon mal erlebt, dass Du was
> auf die Fresse bekommen hast und Du konntest es Dir wirklich nicht
> erklären, warum?
  Nein.
  Aber du anscheinend schon mehrmals.

John Wayne seine GaragenTante schrieb:
> Wunderbar! Das sind die richtigen Antworten auf solche Anwürfe...
  LOL.
  Auch eine auf die Fresse mitgekriegt zusammen mit Frank ?

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

John Wayne sein Garagennachbar schrieb:
> Ich bin der Garagennachbar sowohl
> vom Schwiegervater als auch von John selbst. Es handelt sich nämlich
> um eine Doppelgarage.

Demzufolge gehört dir also die mittlere.

mfg.

von Sebastian W. (wangnick)


Lesenswert?

Marc Vesely schrieb:
> Kaito C. schrieb:
>> Würde es reichen, den rx/tx des Routers an die 2 Interrupts zu hängen
>> und die werte an die UART ports des atmega8 anzulegen sobald sie sich
>> ändern oder müsste eine andere lösung her?
>
>  Welche UART ports ?
>  MEGA8 hat nur einen.

Ich glaube, Kaito meint mit "UART ports des atmega8" den RX und den TX 
Port der UART des Atmega die mit dem UART-USB-Wandler verbunden sind.

>  Und wenn MEGA nichts anderes zu tun hat, als nur Pegel umzusetzen,
>  kannst du das auch in einer normaler Schleife in main() tun.

Das war ja auch Olivers Vorschlag, anstelle der von Kaito angedachten 
Interrupt-Steuerung eben "busy polling" zu betreiben.

>  USART ausschalten, TX pin auf Ausgang, die beiden Eingänge ständig
>  abfragen und entsprechend ihren Zustand nach TX durchschalten.
>  Nur aufpassen, wer wann anfängt zu senden (Startbit). Idle und
>  Stoppbit ist dasselbe, dort wo du als erstes Startbit empfängst,
>  bleibt so lange Aktiv, bis ein Startbit vom anderen Eingang kommt.
> Oliver schrieb:
>> - in einer Endlosschleife die beiden Eingänge ständig abfragen und den
>> dazu gehörigen Ausgangspin auf den gleichen Pegel setzen
>> - Vorteil: Funktioniert mit beliebigen Baudraten, solange die
>> Taktfrequenz ausreichend hoch ist
>  Welche Ausgangpins ? Geht auf USB raus - nur ein Ausgang.

Das verstehe ich nicht. Es muss doch bidirektional übermittelt werden, 
um die Kommandos zum Auslesen des Logs an den Router absetzen zu können, 
also gibt es doch zwei TX-pins:

Router TX -> Atmega8 -> USB RX
Router RX <- Atmega8 <- USB TX

Marc Vesely schrieb:
> Oliver schrieb:
>> Hier ein Beispiel, wie es mit einfachem Durchreichen von einem Pin an
>> den nächsten funktioniert:
>  Erstens: MEGA8 hat kein E- und H-Port.
>  Zweitens: siehe oben, nur ein Ausgang.
>  Drittens: deinen Programm will ich gar nicht kommentieren.

So schlecht ist das Beispielprogramm von Oliver doch gar nicht. Sicher, 
es ginge noch etwas einfacher. Und er erzeugt bei laufender 
Kommunikation zur Startzeit einen Kurzschluss, indem er die RX-Pins auf 
HIGH setzt bevor er sie auf Eingang umschaltet. Und die UART-Ruhelage 
ist HIGH, also erzeugt die Initialisierung der TX-Ports mit LOW einen 
Glitch. Aber der Kurzschluss ist wirklich kurz (zwei Zyklen), da wird so 
schnell schon nichts passieren ...

LG, Sebastian

PS: Blödsinn, dümmer, Fresse, Schwätzer scheinen mir die guten Absichten 
aller Mitforisten nicht hinreichend zu würdigen.

von M. K. (sylaina)


Lesenswert?

Marc Vesely schrieb:
> Da die beiden Beiträge auf die ich geantwortet habe, nicht auch gelöscht
>  würden, nehme ich an, dass das löschen meiner Beiträge ein Fehler war,
>  deshalb nochmals die Antworten:

Diese beiden Antworten wurden wohl gelöscht weil sie schlicht nichts mit 
dem Thema zu tun haben genau wie dieser Beitrag nun von mir ;)

Tipp von mir: Ignorier einfach solche Beiträge die eiinen nur angreifen. 
Bringt eh nie was gegen den Poster vorzugehen. Dafür ist das Internet zu 
anonym ;)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sebastian Wangnick schrieb:
> Das verstehe ich nicht. Es muss doch bidirektional übermittelt werden,
> um die Kommandos zum Auslesen des Logs an den Router absetzen zu können,
> also gibt es doch zwei TX-pins:
>
> Router TX -> Atmega8 -> USB RX
> Router RX <- Atmega8 <- USB TX

 Irgendwie hab ich gedacht, dass er nur Router_Rx und Router_Tx
 überwachen, bzw. abhören will und diese beiden Leitungen über
 MEGA8 als ein Signal an PC weiterleiten will.
 Ohne dass der PC direkt mit Router kommuniziert.
 Hmmm...
 Falsch gedacht, sorry.

> PS: Blödsinn, dümmer...
 Ja, das war dummer Blödsinn von mir, es tut mir leid.

: Bearbeitet durch User
von gvs (Gast)


Lesenswert?

Gibt sowas das nannte sich wohl XPort oder ZPort als Weiterleitung von 
RS232, auch per Linux von PC zu PC oder beim ethersex Projekt bzw. 
AVRNetIO. Problem ist nur: Es ist Mist wenn da was dazwischen hängt.

Nimm halt einfach einen Pegelwandler und einen Seriell zu USB. Dann 
gehts auch. Oder direkt eine serielle am PC, soll es ja auch mal geben 
haben.

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.