Hallo. Ich versuche nun schon seit Wochen Daten mit meinen PIC zu senden. Aber es läuft einfach nicht. Ich habe zwei Taster über die ich jeweils ein langes Datenpaket versenden möchte. Ob ich das Paket so zerstückeln darf, weiß ich zwar auch noch nicht, aber das ist erst mal nebensächlich. Es soll ein serielles Datenpaket für ein XBee Funkmodul sein. Zur Zeit sieht es noch so aus: Wenn ich einen Taster betätige, fängt der Versand an. 0x7E und 0x00 wird versendet, doch dann wird PIR1 nicht gelöscht. Und ich hänge in der senden Schleife fest. Kann mir vielleicht jemand einen Tipp geben und sich ggf meinen Code mal anschauen, ob das so überhaupt funktioniert. MfG
Du rufst von main aus die an und aus Routinen mit call auf, kehrst aber nicht mit return sondern goto main zurück - das gibt einen Stacküberlauf.
Das mit call sowie goto ist nicht weiter schlimm, das passt schon. Was mir aufgefallen ist, weiß aber nicht, ob das der Grund ist, Status, RP1 ist undefiniert, also könntest du in die falschen Register schreiben, probier mal das Statusregister, goto init, oder auch da, mit einem clrf status zu löschen. Sonst müsste man die Initialisierung genauer nachschauen. Mir sind da schon kleine Fehler aufgefallen, wie z.B. TX als Input declarieren, aber eins nach dem anderen.
Dann kann es noch sein, dass du den XBee überfährst, weil du TXIF und nicht TRMT überprüfst. Sprut schreibt dazu:
1 | ++ACHTUNG FALLE++ |
2 | |
3 | Wird eine Menge Daten ohne Pause gesendet, und als einzige Bremse das |
4 | TXIF-Flag abgefragt, so kann es am Empfänger der Daten zum Verschlucken |
5 | von Zeichen kommen, da der Empfänger die Lücke zwischen 2 benachbarten |
6 | Zeichen nicht erkennt. In diesem Fall empfehle ich nicht TXIF sondern |
7 | besser TRMT im Register TXSTA abzufragen. Dieses Bit wird erst gesetzt, |
8 | wenn das zu sendende Byte komplett herausgeschoben ist. TXSTA liegt in |
9 | der Bank1 ! |
TX muss auf Input geschaltet sein, sonst funktioniert das Empfangen nicht:
1 | Bit SPEN (RCSTA<7>) and bits TRISB<5,2> have to |
2 | be set in order to configure pins, RB5/SS/TX/CK and |
3 | RB2/SDO/RX/DT, as the Addressable Universal |
4 | Synchronous Asynchronous Receiver Transmitter. |
call muss immer mit return abgeschlossen werden, sonst gibt es wie Dieter schon sagte, einen Stack-Overflow. Chris liegt falsch.
Danke für eure Tipps! Habe ich gleich mal umgesetzt. Nun werden alle Daten gesendet. Aber ich glaube die werden nur so rausgeschleudert. Denn, wenn ich dies im MPLAB simuliere bleibt das Bit TRMT nach dem ersten senden auf low gesetzt. Dann dürfte eigentlich nicht weitergesendet werden. Merkwürdig. Habe ich das, mit dem call und dem return, richtig umgesetzt?
Schon klar, daß es den Stack-Überlauf gibt, bloß mit dieser Programmierung ist es egal, ob ein Stack-Überlauf passiert oder nicht, das programm macht das identische, gleich ob ein return oder goto verwendet wird. Das in der realen HW, im Simulator kann das ein Unterschied sein.
senden bsf STATUS,RP0 btfss TRMT,TXSTA Im letzten Befehl stimmt die Reihenfolge nicht.
Mensch, stimmt ja! btfss TXSTA,TRMT Vielen Dank! Dann mach ich mich jetzt mal ran, meinen ersten PIC zu brennen.
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.