Forum: Mikrocontroller und Digitale Elektronik Daten senden über AUSART mit PIC16F88


von Benjamin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Dieter W. (dds5)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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.

von Benjamin (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Chris (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

senden
    bsf  STATUS,RP0
    btfss   TRMT,TXSTA

Im letzten Befehl stimmt die Reihenfolge nicht.

von Benjamin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.