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!!
Vermutlich weil ..... BANKSEL TRISC bsf TRISC,6 bsf TRISC,7 ..... beide USART-Datenleitungen auf INPUT stehen - zumindest TX sollte auf Output sein ;-)
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.