Forum: Mikrocontroller und Digitale Elektronik PIC 16F887 - RS232 Software Problem


von Stefan L. (nickname)


Lesenswert?

Hey,
ich habe eine Frage bezüglich dem richtigen Ansteuern von RS232 
Schnittstellen. Zu nächst mal möchte ich nur Zeichen senden und noch 
nichts empfangen.


Ich habe einen PIC 16F887. Als Treiber ist ein Max 232 verbaut.
Der PIC wird intern mit 8MHz getaktet.
Ich möchte eine Baudrate von 9600 einstellen.


Dem Datenblatt konnte ich bisher folgenden Code entnehmen:

Init_serielle_Schnittstelle

  BANKSEL    TXSTA
  bsf    TXSTA, TXEN
  bcf    TXSTA, SYNC
  bcf    TXSTA, TX9
  bsf    TXSTA, SPEN
  bsf    TXSTA, SENDB

  BANKSEL    BAUDCTL
  bcf    BAUDCTL,ABDOVF
  bcf    BAUDCTL,SCKP
  bsf    BAUDCTL,BRG16
  bcf    BAUDCTL,BRGH

  BANKSEL    SPBRG
  movlw    D'51'
  movwf    SPBRG

  BANKSEL    RCSTA
  bsf    RCSTA, SPEN
  BANKSEL    ANSEL
  clrf    ANSEL
  BANKSEL    ANSELH
  clrf    ANSELH

  BANKSEL    TRISC
  bsf    TRISC,6
  bsf    TRISC,7

Unterprogramm:


RS232_SEND:
  BANKSEL    TXREG
  movwf    TXREG
  btfsc    TXSTA,TRMT    ;ready for next byte?
  goto    RS232_SEND    ;TXIF == 0 -> goto RS232_send

  return

SER_TEMP_IN:
  movlw    d'10'
  call    RS232_SEND
  movlw    d'12'
  call    RS232_SEND
  movlw    d'13'
  call    RS232_SEND
  movlw    a'L'
  call    RS232_SEND
  movlw    a'O'
  call    RS232_SEND
  movlw    a' '
  call    RS232_SEND
  movlw    a'D'
  call    RS232_SEND
  movlw    a'a'
  call    RS232_SEND

  return


Wäre super wenn mir irgendjemand sagen könnte, wo da der Wurm drin ist 
oder was ich vergessen habe.

Vielen Dank für eurer Bemühen!!

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Vermutlich weil
.....
BANKSEL    TRISC
  bsf    TRISC,6
  bsf    TRISC,7
.....
beide USART-Datenleitungen auf INPUT stehen - zumindest TX sollte auf 
Output sein ;-)

von Stefan L. (nickname)


Lesenswert?

Also laut Datenblatt müssen die auf Eingang stehen.
Ich finde leider grade die genaue Stelle nicht mehr.
In meiner Quelle wird es aber auch genau so gemacht.




Quelle
http://www.sprut.de/electronic/pic/grund/rs232.htm

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Genaugenommen ist es egal:
.....
Setting the SPEN bit of the RCSTA  register  enables  the  EUSART  and
automatically configures the TX/CK I/O pin as an output.
.....
und
.....
When the SPEN bit is set the RX/DT I/O pin is automatically configured 
as an input, regardless of the state of the corresponding TRIS bit and 
whether or not the EUSART receiver is enabled.
....
Keine Ahnung was passiert wenn man nach der Initianlisierung das wieder 
überschreibt....würde es einfach rausnehmen.

von Chris B. (dekatz)


Lesenswert?

RS232_SEND:
  BANKSEL    TXREG
  movwf    TXREG
  btfsc    TXSTA,TRMT    ;ready for next byte?
  goto    RS232_SEND    ;TXIF == 0 -> goto RS232_send
  return

Hmmmm......

TRMT: Transmit Shift Register Status bit
1 = TSR empty
0 = TSR full

Wenn das Senderegister noch voll (TRMT = 0)ist verläßt du die Routine 
und deine SER_TEMP_IN überschreibt es sofort mit dem nächsten Zeichen. 
Wenn es leer ist sendest du das Zeichen nochmals!?

Würde es mal "umdrehen" und das probieren:

RS232_SEND:
  BANKSEL    TXREG
  movwf    TXREG
wait_TX_ready
  btfss    TXSTA,TRMT      ;ready for next byte?
  goto    wait_TX_ready    ;TRMT = 0 : warte auf Sendungsende
  return

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.