RS-232 sendet nicht, weil Transmit-Buffer nie empty
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Schnittstellen (Assembler)  |  RS-232 sendet nicht, weil Transmit-Buffer nie empty « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: RS-232 sendet nicht, weil Transmit-Buffer nie empty  (Gelesen 1918 mal)
 
mgebha
Newbie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« am: Dezember 21, 2008, 12:31:34 »

Ich bin relativ neu in der Welt der PICs und experimentiere mit dem PICkit 2 mit Low Pin Count Demo Board mit einem PIC16F690. Bei meinen Versuchen, über RS-232 Daten zu senden, komme ich seit Tagen nicht mehr weiter und bin schon sehr verzweifelt. Das Datenblatt des PIC, unzählige Web-Sites und auch dieses Forum habe ich schon mehrfach erfolglos nach einer Erklärung durchsucht.

Hier ist mein Problemkind:

Code: (asm)
#include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

    org 0
Start:
    bsf     STATUS, RP0      ; select Register Page 1
   
    bcf     TRISC, 0         ; make IO Pin C0 an output for LED
   
    movlw   D'12'            ; Configure baud rate:
    movwf   SPBRG            ;   19200 Baud @ 4MHz
    bsf     TXSTA, BRGH      ;   divisor 12, BRGH 1
   
                             ; Asynchronous serial port:
    bcf     TXSTA, SYNC      ;   no Sync
    bsf     RCSTA, SPEN      ;   enable serial operation
    bsf     TXSTA, TXEN      ;   enable transmission

    bcf     STATUS, RP0      ; back to Register Page 0

    bsf     PORTC, 0         ; turn on LED to indicate 'before send'
    movlw   'A'

Loop:
    btfss   PIR1, TXIF       ; Transmit buffer empty?
    goto    Loop             ; 0 = full => back

    bcf     PORTC, 0         ; turn off LED to indicate 'writing to TXREG'
    movwf   TXREG            ; Write W to serial port
    goto    $

    end

Bei der Initialisierung der Schnittstelle habe ich versucht mich genau an die Vorgaben aus dem Datenblatt zu halten.
Über eine LED an RC0 kann ich beobachten, wo das Programm steht: Starte ich den PIC, so wird die LED wird zwar ein, nicht aber wieder ausgeschaltet. D.h. das Programm hängt in einer Endlosschleife bei "Loop", der Transmit buffer wird als nie "empty".

Habt Ihr einen Hinweis für mich, woran das liegen könnte?
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #1 am: Dezember 21, 2008, 13:47:16 »

 
Zitat
Code:
bcf     TXSTA, SYNC      ;   no Sync
 bsf     RCSTA, SPEN      ;   enable serial operation
 bsf     TXSTA, TXEN      ;   enable transmission

RCSTA ist in Bank 0, bei Ausführung deines Codes ist aber Bank 1 ausgewählt.


Viele Grüße

Bernd
Gespeichert

mgebha
Newbie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #2 am: Dezember 21, 2008, 18:23:25 »

Super! Genau das war der Fehler. Jetzt klappt's. Mein Bastelsonntag ist gerettet :-) Vielen Dank!

Ich habe den LED-Debug-Code rausgeworfen und ein klein wenig aufgeräumt. So sieht jetzt das funktionierende "RS-232 TX Hello World" aus:

Code: (asm)
#include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

    org 0
Start:
    bsf     STATUS, RP0      ; select Register Page 1
    movlw   D'12'            ; Configure baud rate:
    movwf   SPBRG            ;   19200 Baud @ 4MHz
    bsf     TXSTA, BRGH      ;   divisor 12, BRGH 1
                             ; Asynchronous serial port:
    bcf     TXSTA, SYNC      ;   no Sync
    bcf     STATUS, RP0      ; select Register Page 0
    bsf     RCSTA, SPEN      ;   enable serial operation
    bsf     STATUS, RP0      ; select Register Page 1
    bsf     TXSTA, TXEN      ;   enable transmission
    bcf     STATUS, RP0      ; back to Register Page 0

Main:
    movlw   'H'
    call    Rs232Out
    movlw   'e'
    call    Rs232Out
    movlw   'l'
    call    Rs232Out
    movlw   'l'
    call    Rs232Out
    movlw   'o'
    call    Rs232Out
    movlw   ' '
    call    Rs232Out
    movlw   'W'
    call    Rs232Out
    movlw   'o'
    call    Rs232Out
    movlw   'r'
    call    Rs232Out
    movlw   'l'
    call    Rs232Out
    movlw   'd'
    call    Rs232Out
    movlw   '!'
    call    Rs232Out
    movlw   0x0D
    call    Rs232Out
    movlw   0x0A
    call    Rs232Out
    goto    Main

Rs232Out:
    btfss   PIR1, TXIF       ; Transmit buffer empty?
    goto    Rs232Out         ; full => back
    movwf   TXREG            ; Write W to serial port
    return   

    end
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.039 Sekunden mit 19 Zugriffen.
 
Top! Top!