Handshake bei einer Atmega 16

Gast #619968
Lesenswert?

Hallo leute,
ich will die Daten zwischen ein PC und die Mikrocontroller übertragen 
aber manchmal gehen die daten verloren. und jetzt will ich die 
datenflusskontrolle mit Hardwareflusskontrolle machen
 In diesem Fall muss der Mikrocontroller dem PC signalisieren, dass er 
keine weitere Daten empfangen kann.
 wie kann ich das mit einer ATMega 16 controller machen?
MFG
Passi
Gast #619977
Lesenswert?

Ein zusaetzlicher Ausgang am Mega16 an den MAX232 anschluessen und auf 
den CTS(oder DSR) dess PC geben. Nun muss man dem PC noch beibringen, 
dass CTS(oder DSR) bedeutet mit dem Senden zu stoppen. Moeglicherweise 
kann der PC Treiber das schon und man muss dieses Feature nur 
zuschalten.
#619985
Lesenswert?

@ Passi (Gast)

>ich will die Daten zwischen ein PC und die Mikrocontroller übertragen
>aber manchmal gehen die daten verloren. und jetzt will ich die

Das sit meist ein Programmierfehler, z.b: zu lange und zu komplexe 
Interrupts.
Das solltest du prüfen.

>datenflusskontrolle mit Hardwareflusskontrolle machen
> In diesem Fall muss der Mikrocontroller dem PC signalisieren, dass er
>keine weitere Daten empfangen kann.

Kann man machen, ist aber bei richtiger Auslegung des Protokolls meist 
unnötig.

> wie kann ich das mit einer ATMega 16 controller machen?

Indem du RTS/CTS benutzt. Da du ja sowieso einen MAX232 hast, kannst du 
die freien Kanäle dafür benutzen.

MFG
Passi
#619987
Lesenswert?

Meist genügt es, mit der Baudrate einen Gang tiefer zu fahren.

Willst Du das nicht, so solltest Du per Interrupt empfangen und einen 
Ringpuffer für den Empfang einsetzen. Kann den Dein Programm nicht 
schnell genug leeren (abarbeiten), so kannst Du bei einem gewissen 
Füllstand des Ringpuffers über die Handshake-Leitung den PC stoppen und 
bei einem kleineren Füllstand (Hysterese) wieder freigeben. In der 
Richtung zum PC geht das ähnlich, indem man vor jedem Senden eines Bytes 
die Handshake-Leitung vom PC abfragt.

Das alles kann man aber umgehen, wenn man das Datenaufkommen auf beiden 
Seiten richtig plant. Man muss nicht immer am (oder über'm) Limit 
arbeiten.

MfG, Blaubärli
Gast #619999
Lesenswert?

Fuer ein ausgehendes Handshake wird ein zusaetzlicher Ausgang am Mega16 
benoetigt. zB PORTB,2, irgendwas. Der Mega16 Software muss man das auch 
beibringen.
Bei einem normalen Protokoll sollte Handshake vermieden werden koennen.
Manchmal laesst sich Flusskontrolle nicht vermeiden, speziell wenn man 
mit hohen Baudraten nahe am Kapazitaetslimit fahren will. Dann hat man 
das ueblich Master-Slave Warten schon lange hinter sich gelassen und 
arbeitet mit Buffern und verzoegertem Ack.
Gast #620011
Lesenswert?

@  Falk Brunner (falk)

ja ich will die RTS/CTS benutzen aber ich weiss nicht wie ich machen 
soll um der PC zu signalisieren das keine weitere daten sind empfanbar. 
und ich will ja wiessen wie macht man das (wie soll die code für diese 
befehlt in C aussehen )
Danke
#620016
Lesenswert?

Das Problem am Handshake ist, daß es keinen Standard gibt, wann der 
Sender danach aufzuhören hat.

D.h. bei eine USB-RS232 Umsetzer mit 4kB Puffergröße können dann 
durchaus noch die letzten 4095 Byte rausgerotzt werden, die schon im 
Puffer sind.

Es sei denn, daß Handshake wird direkt im USB-Chip ausgewertet und nicht 
erst im virtuellen RS-232 Treiber des PC.


Peter
#620272
Lesenswert?

@ Passi (Gast)

>habe ich nicht gut verstanden was sie meinen mit Das IST RS232! frank?

Ganz einfach, eben dieses Verfahren mit den Signalen RTS/CTS ist bereits 
in RS232 eingebaut. Kannman nutzen, muss man aber nicht.

Ist doch ganz einfach.
Wenn der AVR keine Daten mehr aufnehmen will, setzt er CTS auf LOW. Der 
PC merkt das und hört auf zusenden.
Wenn der AVR wieder Daten empfangen will setzt er CTS auf HIGH.  Der PC 
merkt das und sendet wieder.

MfG
Falk
#620392
Lesenswert?

Passi wrote:
> welche pin ist hier(ATMEGA16) ja zuständig für CTS/RTS

Diese Pins kannst Du selbst bestimmen, denn diese Signale musst Du 
selbst (mittels Deines selbstgeschriebenen Programms im AVR) erzeugen 
bzw auswerten.

> weil ich es suche
> seite heute und finde es nicht. wenn du es weisst bitte sagt mir

Da kannst Du lange suchen, die UART-Hardware unterstützt diese Pins 
nicht. Das wäre auch ziemlicher Unsinn, denn die UART-Hardware verfügt 
auch nicht über RX- und TX- Puffer, wüsste also nicht, woher sie die 
Information für CTS/RTS nehmen sollte.

Wenn Du unbedingt Handshake brauchst, dann musst Du erstmal Ringpuffer 
für RX (und evtl. auch TX) in Dein Programm implementieren und bei 
drohendem Überlauf den PC stoppen.

>
> MFG
> Passi

MfG, BlauBär
#620408
Lesenswert?

Passi wrote:
> mit dem ringpuffer habe ich schon gemacht jetzt meine ist wie kann nicht
> den PC bei überlauft stoppen? wie kann ich den CTS den PC ansprechen ?
> das ist mein Probleme
>
> MFG
> Passi

Naja, C kann ich nicht.
In ASM würde ich durch Subtraktion der Lese- und Schreinpointer des 
Ringpuffers den Füllstand ermitteln, bei Überschreiten der kritischen 
Grenze mittels SBI (oder CBI, ich weiß jetzt aus dem Hut die Pegel 
nicht) CTS aktivieren und bei Unterschreiten der "Sorglos-Grenze" mit 
CBI (oder SBI, je nach erforderlichem Pegel) wieder deaktivieren. Aber 
ob der PC sich auch danach richtet, steht auf einem anderen Blatt, siehe 
Beitrag von Peter Dannegger.

MfG, blauer Bär
#621062
Lesenswert?

Das ist einfach nur eine Leitung, die zusätzlich über den
MAX232 zum PC führt. An welchem Port du die an deinem µC
anschliesst bleibt völlig dir überlassen. Du kannst jeden
Port Pin nehmen, der noch frei ist. Den verbindest du mit
einer Treiberstufe auf dem MAX232 (die noch frei sein müsste),
und vom MAX232 gehts auf die CTS Leitung vom RS232 Kabel.

Am PC schaltest du dann das RTS/CTS Handshake ein (Hardware
Handshake) und wenn dein µC in Bedrängnis kommt, dass er mit
dem Empfang nicht mehr nachkommt, dann setzt er den Portpin
von 1 auf 0. Der PC hört dann auf zu senden. Ist der µC
wieder nachgekommen, dann setzt dein Programm den Portpin
wieder zurück auf 1 und der PC beginnt wieder zu senden.

So einfach ist das.

Oder wars: wenn der Pin auf 0 ist, darf der PC senden und
wenn er auf 1 geht, hört der PC auf.
Weiss nicht mehr und bin jetzt ehrlich gesagt zu faul
zum Nachdenken. Ist ja schliesslich auch dein Projekt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren