PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16f628 - RS232 senden klappt nicht (gelöst)



Applegunner
28.01.2007, 20: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

PICture
28.01.2007, 21:31
Hallo Applegunner!

Ich habe mir Dein Code angeschaut und mir ist bloss eine unstimmigkeit mit dem Kommentar aufgefallen:

BCF TXSTA, BRGH ; BRGH=1

Vielleicht ist es ?

MfG

Applegunner
28.01.2007, 21:43
ne das ist es nicht
der kommentar ist nur ein Überbleibsel als ich noch BRGH=1 und SPBRG=25 hatte.

PICture
28.01.2007, 22:13
Dann würde ich sagen, dass es am Taktgenerator liegt. Der interne Oszillator ist sehr ungenau und Temperaturabhängig . Deswegen eignet er sich nicht für eine Kommunikation über serielle Schittstelle. Versuch es, bitte, mit entsprechendem für gewünschte Baudrate Quartz. Sonst könnte man ewig den Fehler suchen. :)

MfG

Applegunner
28.01.2007, 22:35
vielen dank schonmal für die vielen Antworten (bzw deine zwei *g*) in der kurzen Zeit.
Ok dann werd ich mir in den nächsten Tagen nen gescheiten quarz besorgen.

Das Problem mit dem Taktgenerator dürfte doch mit dem sendeproblem nichts zu tun haben (bis auf dass der Empfänger (PC), das byte evtl. nicht korrekt lesen kann).
Mit dem Oszilloskop sehe sich dass der Ausgangspegel am TX pin ständig auf 0V liegt und auch bei Sendeversuchen sich nichts regt. (im gegensatz zum RX)

gruß Apple

PICture
28.01.2007, 23:16
Das stimmt. Dann muss man versuchen zuerst das TX pin zur "Bewegung" zu bringen. Ich kenne den PIC16F628 nicht detaliert und muss ich noch genauer schauen.

Ich habe kurz das Datenblatt "studiert" und danach noch mal Dein Code angeschaut.

Diesmal habe ich schon (hoffentlich) den Fehler gefunden:

Das SPEN bit (7) in RCSTA muss gesetzt werden.

Wenn es wieder nicht ist, musst Du genau die alle bits von den Register TXSTA und RCSTA einzeln prüfen und entsprechen ändern.

Ausserdem müssen die bits 1 und 2 vom TRISB gesetzt werden, aber das macht schon wahrscheinlich der Reset.

MfG

phaidros
29.01.2007, 02:13
TXSTA liegt in Bank 1!
Du bist aber in Bank 0, wenn du das erste Mal versuchst, TXSTA zu setzen.

Gruß
Phaidros

Applegunner
29.01.2007, 17:41
ja das wars phaidros, vielen dank
obwohl ich die bänke mehr mals überprüft hab ist mir das nicht aufgefallen... tztz


@PICture
hiermit hab ich SPEN gesetzt:
MOVLW b'10010000'
MOVWF RCSTA

wenn ich den nicht gesetzt hätte könnte ich wohl auch nichts empfangen.

mfg
Applegunner

phaidros
29.01.2007, 22:58
Ist auch unlogisch, dass die beiden Control-Register in verschiedenen Bänken liegen. Nach der üblichen Anordnung würde man beide eher in Bank 1 vermuten. Na ja, bei den großen PICs (so ab 18F..) wird es besser. Da kann man auf das ganze RAM (meistens) ohne großes Umschalten zugreifen.

Gruß
Phaidros