- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: PIC16f628 - RS232 senden klappt nicht (gelöst)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Ort
    Emmendingen
    Alter
    39
    Beiträge
    5

    PIC16f628 - RS232 senden klappt nicht (gelöst)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.

    Code:
    	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

  2. #2
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Ort
    Emmendingen
    Alter
    39
    Beiträge
    5
    ne das ist es nicht
    der kommentar ist nur ein Überbleibsel als ich noch BRGH=1 und SPBRG=25 hatte.

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Ort
    Emmendingen
    Alter
    39
    Beiträge
    5
    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

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    TXSTA liegt in Bank 1!
    Du bist aber in Bank 0, wenn du das erste Mal versuchst, TXSTA zu setzen.

    Gruß
    Phaidros

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    28.01.2007
    Ort
    Emmendingen
    Alter
    39
    Beiträge
    5
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test