Du hast recht, wer nix weiss, soll nix reden.
Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
Werbung
Du hast recht, wer nix weiss, soll nix reden.
Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Na, ich denke, Du weist schon, speziell bei Inkey() mag das jetzt nicht der Fall sein.
Muss zugeben, das wusste ich auch nicht genau, nur ergab sich aus der Hilfe:Ich weiss nämlich nicht, was Bascom bei Soft-Uart "Inkey()" genau generiert.
dass Inkey() nicht-blockierend wirkt und lustig weitermacht, wenn nichts ansteht. Ob etwas ansteht, kann bei Soft-UART sowieso nur aktiv per Polling festgestellt werden (außer man verwendet Intx).If there is no character waiting, a zero will be returned.
Daraus ergab sich, dass es im Pogrammablauf sehr unwahrscheinlich ist, dass das einzelne Inkey() gerade da kommt, wenn das Startbit vom PC kommt. Es gibt ein Beispiel dazu, "open.bas" im Samples-Ordner, da wird Inkey() in 'ner Do/Loop gepollt.
Aber um auch sagen zu können, was Inkey() tatsächlich macht, hab' ich's mir angesehen.
Wenn der Pin auf High liegt, liefert es eine 0 zurück, wenn er auf Low liegt, wird die Soft-UART Empfangsroutine ausgeführt.
Bei Deinem Code ist die Schleifenabbruchbedingung x = 0. Aus dem Gesagten ergibt sich, dass dies sehr wahrscheinlich gleich beim ersten Durchlauf zutrifft, die Schleife also sofort verlassen wird.
Waitkey() hingegen würde darauf warten, dass der Pegel Low geht, blockiert aber wenn nix über die Serielle kommt den weiteren Ablauf, deswegen mein Vorschlag mit dem Timeout.
Geändert von MagicWSmoke (02.01.2012 um 12:57 Uhr)
Das Bascom-Help hat mich über die Eigenheiten bzw. Unterschiede bei HW- und Softuart nicht befriedigt.
Bevor ich aber da mangels bessern Wissens nochmal "Lull" und "lall" erzähle, werd ich mir die diversen Soft-Uart Routinen disassemblieren und melde mich dann auf der Kampfstatt wieder *g*
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
So, im Nachhinein betrachtet ohnehin klar:
Man muss/darf (wenn man INKEY() verwenden will) natürlich nur das speichern, was NICHT 0 ist. Als Endeerkennung einer Nachricht ist "0" wenig geeignet.
Wenn man z.b <CR> als Nachricht-Ende nimmt ( was Bascom-PRINT freiwillig tut, wenn man ihn nicht hindert), müsste die Receive-Schleife lauten:
unter der Annahme, dass das Speichern nicht zu langsam ist. Müsst man ausrechnen, bis zu welcher baudrate es reicht.Code:DO inchar= inkey(#2) if inchar > 0 incr myidx myarr(myidx) = inchar end if LOOP until inchar = 27 myarr(myidx) = 0 ' ev. ein String-ende aus dem <CR> machen
Sonst ist wohl eher "INPUT #" oder GET # geeignet
Wen es interessiert, so sieht INKEY() von innen aus:
Der Unterschied von Waitkey ist minimalCode:open comb.4:9600,8,n,1 L_0x00DE: ' delay 1/2 bit -------------------------- PUSH r24 PUSH r25 LDI r24,0x08 LDI r25,0x00 L_0x00E6: SBIW r24,0x0001 BRNE L_0x00E6 POP r25 POP r24 RET ' inkey (#1) --------------------------------- L_0x00F0: SBIS 0x0016,4 ' check PortB.4 RJMP L_0x00F8 ' start CLR r24 ' return 0 RET L_0x00F8: LDI r18,0x09 ' counter = 9 (8 + 1 ) L_0x00FA: ' loop until PortB.4 = 0 SBIC 0x0016,4 ' RJMP L_0x00FA RCALL L_0x00DE ' delay 1/2 bit L_0x0100: RCALL L_0x00DE ' delay 1/2 bit RCALL L_0x00DE ' delay 1/2 bit CLC ' clear carry SBIC 0x0016,4 ' PortB.4 = ? SEC ' = 1---> set Carry DEC r18 ' decr counter BREQ L_0x0114 ' counter= 0 --> exit ROR r24 ' shift carry into r24:r25 ROR r25 RJMP L_0x0100 ' next bit L_0x0114: RET ' R24 = inbyte (that's it)
Code:' waitkey (#1) --------------------------------- L_0x00F0: SBIS 0x0016,4 ' wait PortB.4 = 0 RJMP L_0x00F6 ' start RJMP L_0x00F0 ' cont'd wait Das ist der einzige Unterschied
Geändert von PicNick (02.01.2012 um 15:54 Uhr)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
9600 Baud = 9600 Bit/Sek, bei 16 MHz sind dann 1667 Takte pro Bit, da kann er viel speichern. Auch bei 76800 Baud, welche bei 16 MHz nur 0.2% Fehler hätten, wären's noch 208 Takte, sollte auch noch locker reichen. Voraussetzung ist, dass keine Interrupts unterbrechen.
Code:' inkey (#1) --------------------------------- L_0x00F0: SBIS 0x0016,4 ' check PortB.4 RJMP L_0x00F8 CLR r24 ' return 0 RETDer Unterschied von Waitkey ist minimalCode:' waitkey (#1) --------------------------------- L_0x00F0: SBIS 0x0016,4 ' wait PortB.4 = 0 RJMP L_0x00F6 ' start RJMP L_0x00F0 ' cont'd waitDas ist der einzige Unterschied
Aber der Entscheidende.
"der kleine Unterschied", in der Tat.
bei INKEY() kann man leicht eine Timeout-kontrolle einbauen, dafür muss man sich aber über die Fehlerbehandlung in so einem Fall Gedanken machen.
Bei WAITKEY() hilft ohnehin nur der reset-knopf oder der Watchdog.
pS: mit so Sachen wie Frame-control etc. hat sich Mark offenbar nicht auseinandergesetzt.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen