Forum: Mikrocontroller und Digitale Elektronik Handshake bei einer Atmega 16


von Passi (Gast)


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

von Nailpainter (Gast)


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.

von Passi (Gast)


Lesenswert?

was fuer ein zusaetzlicher Ausgang? wie kann ich das erstellen?

von Falk B. (falk)


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

von Troll B. (blaubeer)


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

von Nailpainter (Gast)


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.

von Passi (Gast)


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

von Peter D. (peda)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

CTS einschalten, PC darf Daten senden, CTS ausschalten, PC muß stoppen. 
Das Programm, mit dem Du die Daten auf dem PC sendest, muß dies aber 
auch unterstützen (Hardware-Flußkontrolle). Normal ist der ATMEGA aber 
absolut schnell genug, um mit 115kbit Daten zu empfangen (Höchstgrenze 
realer Com-Ports).

von Passi (Gast)


Lesenswert?

ist es mit eine RS232 machtbar? weil die kommunication zwischen den PC 
und die Mikrocontroller mache ich via der RS232 schnittstelle.

von Falk B. (falk)


Lesenswert?

@ Passi (Gast)

>ist es mit eine RS232 machtbar? weil die kommunication zwischen den PC
>und die Mikrocontroller mache ich via der RS232 schnittstelle.

Das IST RS232!

MFG
Falk

von Passi (Gast)


Lesenswert?

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

von Passi (Gast)


Lesenswert?

entschuldingung Falk statt Frank wollte ich sagen

von Falk B. (falk)


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

von Passi (Gast)


Lesenswert?

welche pin ist hier(ATMEGA16) ja zuständig für CTS/RTS weil ich es suche 
seite heute und finde es nicht. wenn du es weisst bitte sagt mir

MFG
Passi

von Passi (Gast)


Lesenswert?

Hallo Falk kannst du mir sagen wie ich das machen kann Bitte

von Troll B. (blaubeer)


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

von Passi (Gast)


Lesenswert?

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

von Troll B. (blaubeer)


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

von Condi (Gast)


Lesenswert?

Das ist nicht das einzige Problem.

http://de.wikipedia.org/wiki/EIA-232

Ob die Flußkontrolle verwendet wird bzw. wie man Sie einschaltet erfährt 
man in dem Handbuch/der Hilfe des PC Programms das du zum empfangen 
benutzt.

Condi

von Passi (Gast)


Lesenswert?

wie kann ich den CTS in seite von der Mikrocontroller bestimmen? wenn 
jemand ein beispiel von ein Hardware handshake mit dem RS232 bitte 
zeigen sie mir wie es geht.
Danke im voraus
Passi

von Passi (Gast)


Lesenswert?

Hallo kann jemand mir helfen?

von Karl H. (kbuchegg)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Bei Anschluß über MAX232: Controllerpin=0 setzt CTC, was "Clear To Send" 
heißt und erlaubt somit das Senden vom PC. Controllerpin=1 löscht CTC 
und unterbindet somit das Senden vom PC.

von Passi (Gast)


Lesenswert?

IN Mein Platine habe ich keine MAX232 ich habe nur das RS232 ich benutze 
die ATmega16. ohne den MAX232 geht es nicht?

von Troll B. (blaubeer)


Lesenswert?

Passi wrote:
> IN Mein Platine habe ich keine MAX232 ich habe nur das RS232 ich benutze
> die ATmega16. ohne den MAX232 geht es nicht?

Poste mal den Schaltplan Deiner Platine.
Der MAX232 kann auch anders heißen wenn er von einem anderen Hersteller 
als MAXIM kommt.

MfG, BlauBärli

von Passi (Gast)


Lesenswert?

meine platine ist die STK500 die ATmega16 von ATmel mit alle bausteine

von Troll B. (blaubeer)


Lesenswert?

Passi wrote:
> meine platine ist die STK500 die ATmega16 von ATmel mit alle bausteine

Nagut, da ist kein Kanal vom MAX202 mehr frei, der Zweitkanal wird ja 
für den Programmer verwendet. Pech gehabt...

MfG, Bär, blauer

von Passi (Gast)


Angehängte Dateien:

Lesenswert?

so sieht mein platine aus (siehe Datei anhang)
MFG
Passi

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.