PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Empfangsprobleme (PIC 16F627)



Jörn Arne
20.08.2006, 14:28
Hallo!

Ich möchte an den PIC 16F627 Daten vom PC aus senden und umgekehrt.
Das Senden klappt..
Nur das Empfangen krieg ich irgendwie nicht richtig hin.

Ein Zeichen soll über "polling" eingelesen werden:



RS232in
btfss PIR1,RCIF ; sind Daten da ?
goto RS232in ; nein, noch keine Daten da
movfw RCREG ; RS232-Register auslesen
movwf controlByte ; und nach 'controlByte' schreiben


Allein da scheiterts schon...

Initialisiert habe ich die RS232 mit folgendem Code:



controlByte equ 0x20


org 0x00
goto reset
;----------------------------------------------------------------

;interrupt
org 0x04

retfie
;-----------------------------------------------------------------
reset

clrf controlByte

;bank 1
bsf STATUS, RP0
;init rs
movlw d'25' ;baud 9600
movwf SPBRG

movlw b'00100100' ;transmit enable, high baud
movwf TXSTA

movlw b'00000000' ;alle Ports als Ausgang
movwf TRISB
movwf TRISA

bcf STATUS, RP0

;bank 0
;init rs
movlw b'10010000' ;enables rs, continuos reception
movwf RCSTA

bcf INTCON,GIE ;generell Interrupts sperren

goto main


Scheinbar wird das RCIF flag nie gesetzt

Der PIC wird an einem 4 MHZ Schwinger betrieben und zwischen PC und PIC sitzt ein MAX232 (Schaltung mit anderen Controllern getestet)

Ein Beispiel von Sprut.de habe ich auch schon ausprobiert, hat leider nicht funktioniert.


Für Hilfen und Tips wäre ich dankbar

Gruß

Jörn Arne

PICture
21.08.2006, 00:22
Hallo Jörn Arne!

Mir ist nur eingefallen, dass Du alle Portpins als Ausgänge initialisiert hast. Muss der RX Pin nicht als Eingang initialisiert werden ?

MfG

kalledom
21.08.2006, 00:40
In dem Link http://www.domnick-elektronik.de/picasm.htm wird die SIO eines PIC16F877 mit 9600 Baud in Assembler genutzt. Vielleicht kannst Du dort was 'abkupfern'.
Der Empfang erfolgt per Interrupt; die empfangenen Bytes werden in einem Ringpuffer abgelegt und 'irgendwann' mal ausgewertet.
Das Senden erfolgt von einem 1ms-Interrupt aus, indem jeweils überprüft wird, ob etwas zum Versenden im Ringpuffer liegt und ob der Sendepuffer frei ist.

Jörn Arne
21.08.2006, 10:29
Hallo!

Vielen Dank für eure Antworten, es scheint als hätte es wirklich am TRISB Register gelegen! Ich dachte zu erst, dass die Portfunktion die TRISB Registereinstellung umgeht.

Das Beispiel schau ich mir auch mal an, kann man bestimmt was lernen.

Also noch mal Danke!

Gruß
Jörn Arne