Applegunner
28.01.2007, 21:55
Hallo
ich bin noch recht neu in dem Bereich was µC an geht und hab vor einer Weile angefangen mich mit dem pic16f628 vertraut zu machen.
besonders mit der rs232 kommunikation, worüber ich mit nem alten Notebook kontakt zum pic aufnehmen will.
Das Empfangen von bytes mit dem pic klappt mittlerweile auch. Allerdings klappt es nur (pic läuft mit intosc 4mhz) wenn ich ins Register SPBREG 6 schreibe und in TXSTA, BRGH=0 setze (9600 Baud). Obwohl auf sprut.de steht dass diese einstellung zu unzulässiger Abweichung kommt (und somit zu Lesefehlern). Eigendlich müßte ich BRGH=0 und SPBRG=25 setzen. Aber mit den Einstellungen kommt nur bit-Salat an.
Kann dass der Frequenzabweichung des internen Oszillators liegen?
Weiteres Problem:
Ich schaffe es einfach nicht Daten mit dem PIC zu senden (obwohl das ja eigendlich einfacher sein soll als Empfangen).
An dieser seite hab ich mich gehalten:
http://sprut.de/electronic/pic/grund/rs232.htm
aber nicht erfolgreich was das Daten senden betrifft.
vielleicht sieht jemand den Fehler im Code oder kann mir Tipps geben.
ich benutze den Pegelwandler MAX232 um mit dem PC zu kommunizieren.
mit dem Oszi kann ich überprüfen ob sich an den pins was tut. besonders Pin 8 (TX)
im normalen I/O modus kann ich den pin ansteuern.
list p=16f628
;************************************
;*
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 (RA0) a
;* 1 (RA1) b
;* 2 (RA2) c
;* 3 (RA3) d
;* 4 (RA4) e
;* 5 (RA5) -
;* 6 (RA6) f
;* 7 (RA7) g
;* PORTB: 0
;* 1 (RX) rot vom Treiber
;* 2 (TX) blau zum Treiber
;* 3
;* 4
;* 5
;* 6
;* 7
;*
;*
;*
;*
;*
;*
#include <p16f628.inc>
__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
zeichen equ 0x20
org 0x00
; empfangenen wert aus RCREG lesen und an Port A ausgeben
; initialisieren
BSF STATUS, RP0 ; auf Bank 1 umschalten
CLRF TRISA ; PORTA auf Output
BCF STATUS, RP0 ; auf Bank 0 zurückschalten
BSF CMCON, CM0 ;Comparatoren ausschalten
BSF CMCON, CM1 ;damit PORTA
BSF CMCON, CM2 ;als IO genutzt werden kann
; USART initialisieren und Baudrate einstellen
MOVLW b'00100100'
MOVWF TXSTA
MOVLW b'10010000'
MOVWF RCSTA
BSF STATUS,RP0 ; Bank1
BCF STATUS,RP1 ; Bank1
MOVLW 6 ; Set Baud rate 9,6 kBPS bei 4 MHz
MOVWF SPBRG
BCF TXSTA, BRGH ; BRGH=0
BCF STATUS,RP0 ; Bank 0
clrf PORTA ;porta auf low schalten
RS232in
btfss PIR1,RCIF ; sind Daten da ?
goto RS232in ; nein, noch keine Daten da
movf RCREG, w ; RS232-Register auslesen
movwf zeichen
movlw 0x30 ; zahl in w setzen
subwf zeichen, w ;w von zeichen abziehen und in w speichern
movwf PORTA ; und in das register von PORTA schreiben
movwf TXREG ; Das Byte wieder zurück senden (was aber nicht funzt)
goto RS232in
end
ich wäre sehr dankbar wenn mir jemand helfen kann.
gruß Applegunner
ich bin noch recht neu in dem Bereich was µC an geht und hab vor einer Weile angefangen mich mit dem pic16f628 vertraut zu machen.
besonders mit der rs232 kommunikation, worüber ich mit nem alten Notebook kontakt zum pic aufnehmen will.
Das Empfangen von bytes mit dem pic klappt mittlerweile auch. Allerdings klappt es nur (pic läuft mit intosc 4mhz) wenn ich ins Register SPBREG 6 schreibe und in TXSTA, BRGH=0 setze (9600 Baud). Obwohl auf sprut.de steht dass diese einstellung zu unzulässiger Abweichung kommt (und somit zu Lesefehlern). Eigendlich müßte ich BRGH=0 und SPBRG=25 setzen. Aber mit den Einstellungen kommt nur bit-Salat an.
Kann dass der Frequenzabweichung des internen Oszillators liegen?
Weiteres Problem:
Ich schaffe es einfach nicht Daten mit dem PIC zu senden (obwohl das ja eigendlich einfacher sein soll als Empfangen).
An dieser seite hab ich mich gehalten:
http://sprut.de/electronic/pic/grund/rs232.htm
aber nicht erfolgreich was das Daten senden betrifft.
vielleicht sieht jemand den Fehler im Code oder kann mir Tipps geben.
ich benutze den Pegelwandler MAX232 um mit dem PC zu kommunizieren.
mit dem Oszi kann ich überprüfen ob sich an den pins was tut. besonders Pin 8 (TX)
im normalen I/O modus kann ich den pin ansteuern.
list p=16f628
;************************************
;*
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 (RA0) a
;* 1 (RA1) b
;* 2 (RA2) c
;* 3 (RA3) d
;* 4 (RA4) e
;* 5 (RA5) -
;* 6 (RA6) f
;* 7 (RA7) g
;* PORTB: 0
;* 1 (RX) rot vom Treiber
;* 2 (TX) blau zum Treiber
;* 3
;* 4
;* 5
;* 6
;* 7
;*
;*
;*
;*
;*
;*
#include <p16f628.inc>
__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
zeichen equ 0x20
org 0x00
; empfangenen wert aus RCREG lesen und an Port A ausgeben
; initialisieren
BSF STATUS, RP0 ; auf Bank 1 umschalten
CLRF TRISA ; PORTA auf Output
BCF STATUS, RP0 ; auf Bank 0 zurückschalten
BSF CMCON, CM0 ;Comparatoren ausschalten
BSF CMCON, CM1 ;damit PORTA
BSF CMCON, CM2 ;als IO genutzt werden kann
; USART initialisieren und Baudrate einstellen
MOVLW b'00100100'
MOVWF TXSTA
MOVLW b'10010000'
MOVWF RCSTA
BSF STATUS,RP0 ; Bank1
BCF STATUS,RP1 ; Bank1
MOVLW 6 ; Set Baud rate 9,6 kBPS bei 4 MHz
MOVWF SPBRG
BCF TXSTA, BRGH ; BRGH=0
BCF STATUS,RP0 ; Bank 0
clrf PORTA ;porta auf low schalten
RS232in
btfss PIR1,RCIF ; sind Daten da ?
goto RS232in ; nein, noch keine Daten da
movf RCREG, w ; RS232-Register auslesen
movwf zeichen
movlw 0x30 ; zahl in w setzen
subwf zeichen, w ;w von zeichen abziehen und in w speichern
movwf PORTA ; und in das register von PORTA schreiben
movwf TXREG ; Das Byte wieder zurück senden (was aber nicht funzt)
goto RS232in
end
ich wäre sehr dankbar wenn mir jemand helfen kann.
gruß Applegunner