Hallo Meine Frage: Kann man überprüfen, ob ein Gerät überhaupt am Uart angeschlossen ist? Beispiel: Mein Mikrocontroller sendet Daten über Uart an Gerät. Dieses antwortet dann in einer bestimmten Art. Die empfangenen Zeichen landen im Flash. Wenn ich nun Zeichen von Mikrocontroller sende und es ist kein Gerät angeschlossen, was kommt beim Mikrocontroller an? Die Daten als Echo oder nichts? Ich verwende ATMega32.
Nichts. Eine sichere Erkennung ist unmöglich, außer man bekommt eine bekannte Antwort auf einen gesendeten Befehl.
Kommt ganz drauf an, was das "andere" Gerät sendet... früher gabs genau zu diesem Zweck verdrahtete Handshake-Leitungen. Quasi eine Drahtbrücke im Stecker.
Ich poste einfach mal hier weiter. Wollte fragen, ob ich den Sprung "jmp ende" (siehe Quelltext) machen darf oder lieber doch nicht. Ein "ret"-Befehl würde dann wegfallen. Kenne mich mit dem Stack nicht so gut aus. main: ldi temp1, low(RAMEND) out SPL, temp1 ldi temp1, high(RAMEND) out SPH, temp1 ... ende: call temperature_to_LCD call check_temperature_alert call ... ; muss nicht ausgeführt werden, wenn Handy ; nicht verbunden jmp ende ;---------------------------------------- temperature_alert: push temp1 ... call call_phone_number1 call control_call_phone_number1 ... pop temp1 ret ;----------------------------------------- control_call_phone_number1: push temp1 push SRAM_register clr try_again ; SRAM auslesen und kontrollieren, gelesenes Byte in SRAM_register ; X-Zeiger wird in read_SRAM erhoeht next_try: call read_SRAM mov temp1, SRAM_register ; UART Daten lesen cpi SRAM_register, 'A' brne error_call_pn1 ; branch if not equal no_error_call_pn1: call clear_line4 ; LCD pop SRAM_register pop temp1 ret error_call_pn1: ; wenn Register "try_again=5", dann Handy nicht verbunden ; springen nach call temperature_to_LCD d.h. nach Marke "ende" inc try_again ldi temp1, 5 cp try_again, temp1 ; compare with 5 breq not_connected ; equal --> no mobile call call_phone_number1 rjmp next_try not_connected: call no_mobile_connected pop SRAM_register pop temp1 jmp ende --> besser nicht machen???? ;ret
theoretisch könnte das gehen, aber absolut unsinnig dein ganzer code ist sehr unstruktiert und chaotisch, besser macht man es so: mainloop: call routine1 rjmp mainloop routine1: tu dies tu jenes IF FallA jump Skip_FallA NICHTFall A: tu was anderes (fehlerbehandlung) jump Ende_routine1 Skip_FallA: FallA: da alles ok, mache hier die eigentliche aufgabe Ende_routine1: ret bei solchen if then else verzweigungen sollte man einen codeblock für den NICHT fallA mit branchbefehl oder jmp überspringen der zum fallA führt. wenn NICHT FallA gilt, wird dieser Skip nicht ausgeführt, und es geht direkt im anschluss an den Bedingungstest zum NICHT FallA teil, an dessen ende dann wiederrumm ein Skip des FallA steht (hier jump Ende) Für die Bedingungstests gibts zwei konstrukte: die logischen branch befehle wie brne, mit denen du nach compare oder sonstigem z.b. den gegenteiligen fall per Skip-sprung überspringst. und dann gibt es den oft hilfreichen Skip if bit set, mit denen du einzelne Flags checken kannst: Routine2 SBRS Register, Bitnummer rjmp SkipBitistgesetzt (hier der teil für den fall das Bit gesetzt ist) rjmp SkipBitnichtgesetzt: SkipBitistgesetzt: (hier den teil für den fall das bit nicht gesetzt= SkipBitnichtgesetzt: ... ret wenn du dich an die üblichen programmkonstruke der hochsprachen hälst vermeidet man die berüchtigten unlessbaren assemblerschweinerein. IF THEN ELSE kann man mit obigen Modellen nachbauen, Switchcase ebenso, for A do X kann man so machen: Loop: IF FallA, jump break_loop schleifeninhalt X rump loop break_loop: ... weiter do X while A dann so: loop2: schleifeninhalt X if A jump loop2 ... weiter wenn man ein switchcase für flags haben will, lässt es sich elegant so machen: Skip if bit A cleared call bitAset jump break Skip if bit B cleared call bitBset jump break ... weitere skip if break: besonders vermeidest du so, das es zu jedem routinenanfang mehrere returns an verschiedenen sprungzielen gibt, was sehr undurchsichtig ist und eine fehlerquelle sein kann. programmteile die einzelne routinen darstellen solltest du auch deshalb nie mit jump ansteuern, auch wenn die routine immer nur zur selben stelle zurückkehrt. besonders aber lass die finger von stack-pfuschereien, das kann sehr sporadische fehler geben die erst nach ein paar wochen auftauchen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.