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