- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 9 von 9

Thema: UART am PIC16F689

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.04.2008
    Beiträge
    81

    UART am PIC16F689

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute,

    ich will mein GPS-modul an meinen PIC anschließen um die Daten auszulesen. Kommunikation läuft über UART(RS232) 8-N-1 mit 4800 Baud

    vorab: dsa Modul funktioniert. wenn ichs an den Pc anschliesse über einen MAX232 schreibt er mir fleißig meinen Putty voll.

    mein Problem: Ich emfange einfach keine gültigen Zeichen. ich habe eine ISR in der ich mir bei einem Empfangs-interrupt das empfange Zeichen aufm Display anzeigen lasse. nach dem reset zeigt er immer ein Leerzeichen an und löst keine weiteren interrupts aus. ein Framingerror findet dabei statt.

    hier mein code:
    Code:
    			list		p=16f689			; benutze prozessor pic16f689
    #include	<p16f689.inc>		; verwende die standard definitionen
    ; ------------------------------------------------------------------------
    			__CONFIG	_CP_OFF & _PWRTE_ON & _WDT_OFF &  _XT_OSC	; voreinstellungen fuer fuses
    ;------------------------------------------------------------------------
    
    #define 	LCD_D		PORTC
    #define		LCD_E 		PORTC,5
    #define		LCD_RS 		PORTC,4
    
    Dat			equ		30h
    Dat2		equ			31h
    i			equ		20h
    pause		equ		22h
    
    			org		0x00
    			goto		main
    
    			org		0x04
    			btfss		PIR1,RCIF
    			retfie
    			movfw	RCREG
    			call		_lcd_char
    			retfie
    ;---------------------------------
    main		
    			call		_init
    			call		_lcd_init
    
    			movlw		'O'
    			call		_lcd_char
    			movlw		'K'
    			call		_lcd_char
    			
    			call		_wait2
    
    			bsf		INTCON,GIE
    stop		
    			bcf		PORTC,7
    			btfsc		RCSTA,FERR
    			bsf		PORTC,7
    
    			goto		stop
    
    
    
    _init										;Bank 0
    			movfw	RCREG
    			clrf		PORTC
    			movlw	b'10010000'	
    			movwf	RCSTA
    			bsf		INTCON,PEIE
    			bsf		STATUS,RP0			;Bank 1
    			movlw	b'00000000'
    			movwf	TRISC
    			bsf		PIE1,RCIE
    			movlw	d'64'
    			movwf	SPBRG
    			movlw	0x20
    			movwf	TXSTA
    			bsf		STATUS,RP1			;Bank 3
    			bcf		STATUS,RP0			;Bank 2
    			clrf		ANSELH
    			clrf		ANSEL
    			bcf		STATUS,RP1
    
    			clrf		PIR1
    			clrf		PIR2
    			return
    
    ;-------------------ab hier uninterressant----------------------------
    ; LCD-4 BIT Modus
    ;{
    _lcd_char	bsf			LCD_RS
    			goto		_lcd_out
    _lcd_cmd	bcf			LCD_RS
    			goto		_lcd_out
    _lcd_pos	addlw		0x80
    			movwf		LCD_D
    			bcf			LCD_RS
    			goto		_lcd_out
    _lcd_out	
    			movwf		Dat
    			movlw		b'11110000'
    			andwf		LCD_D,F
    			swapf		Dat,W
    			andlw		b'00001111'			
    			iorwf		LCD_D,F
    			call		_lcd_enter
    			movlw		b'11110000'
    			andwf		LCD_D,F
    			movlw		b'00001111'
    			andwf		Dat,W
    			iorwf		LCD_D,F
    			call		_lcd_enter
    			return
    
    
    _lcd_hex	
    			movwf		23h
    			swapf		23h,W
    			movwf		23h
    			andlw		0x0F			
    			movwf		Dat2
    			sublw		d'9'
    			movlw		0x30
    			btfss		STATUS,C
    			movlw		0x37
    			addwf		Dat2,W
    			call		_lcd_char
    			swapf		23h,0
    			andlw		0x0F			
    			movwf		Dat2
    			sublw		d'9'
    			movlw		0x30
    			btfss		STATUS,C
    			movlw		0x37
    			addwf		Dat2,W
    			call		_lcd_char
    			return
    ;-------------------------------------------------------------------
    _lcd_enter  bsf         LCD_E        	    	; LCD.E = 1
    		    movlw       0x1F				    ; lcd-controller zu langsam
                movwf       pause				    ; deshalb ..
    	  		decfsz      pause,F				    ; .. mal ..
                goto        $-1				         ; zeitverz. wg. 4MHz quarz			
                bcf         LCD_E        			; LCD.E = 0
                return                       		; zurueck
    ; ------------------------------------------------------------------------
    _lcd_init  
    
                movlw       0x28		      		; functon set: LCD-D. mit
    			call		_lcd_cmd
                movlw       b'00001111'      		; display on/off = ein
    			call		_lcd_cmd					; enter instruction
                movlw       b'00000001'      		; display on/off = ein
    			call		_lcd_cmd					; enter instruction
    			call		_wait
                movlw       b'00000110'      		; enty mode set
    			call		_lcd_cmd
                return                           	; zurueck zum aufrufer
    ;}
    
    _wait;{
    			movlw		d'255'
    			movwf		pause
    			nop
    			nop
    			nop
    			nop
    			decfsz		pause,F
    			goto		$-5
    			return
    ;}
    
    _wait2;{
    			movlw		d'255'
    			movwf		i
    			call		_wait
    			decfsz		i
    			goto		$-2
    			return
    ;}
    			end
    der untere Teil mit wait-schleifen und lcd-ansteuerung kann man ignorieren, da es läuft. kann alles aufm LCD ausgeben was ich will... Kern sind die ISR und "_init"..

    Sieht jemand einen fehler? wäre erfreut wenn ein alter PIC-Hase mal einen blick drauf wirft

    Gruß Jango

  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 Jango1987!

    Schon als erste ist die ISR fehlerhaft, weil sie für mich keine ISR ist. Ich würde dir als "Strafe", selber eigene Fehler zu suchen empfehlen, dann lernst du sicher mehr. Als Wissensquelle empfehle ich dir https://www.roboternetz.de/wissen/in.../PIC_Assembler .

    Sollte irgendwas nicht klar sein, melde dich, bitte, mit konkreten Problemen.

    MfG

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Hallo Jango

    oder schau mal hier...
    http://sprut.de/electronic/pic/grund/rs232.htm

    Unter "Daten Empfangen" -> "Interrupt" kannst Du dann auch Deine Routine fast 1 zu 1 überprüfen.


    Gruß André

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.04.2008
    Beiträge
    81
    @ André: danke für deine Antwort...

    habe natürlich schon bei sprut geguckt, bevor ich den tread erstellt hab. habs 10 mal überprüft aber irgendwie gehts nicht.

    bei sprut besteht die ISR ja auch nur aus
    Code:
        movfw   RCREG            ; RS232-Register auslesen
        movwf   Zeichen          ; und in den Speicher nach 'Zeichen' schreiben
        bcf     PIR1,RCIF        ; interrupt-Flag löschen

    Mehr fehlerpotential hat die Configurierung der Hardware, vermute dort meinen fehler...Ich häng irgendwie in einer falle oÄ.

    Gruß Jango

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Hallo Jango,

    da steht bei Sprut aber schon deutlich mehr, als ich beim kurzen überfliegen bei Dir sehen konnte.

    Schau mal:
    Code:
        org  4                   ; Interrupt beginnt immer bei Adresse 4
    int
        movwf   w_temp           ; w und STATUS retten
        swapf   STATUS,w
        movwf   status_temp
    
    ;RS232-Empfänger-Interrupt?
        btfss   PIR1,RCIF
        goto    intEnde          ; Interrupt kam von wo anders
    
        movfw   RCREG            ; RS232-Register auslesen
        movwf   Zeichen          ; und in den Speicher nach 'Zeichen' schreiben
        bcf     PIR1,RCIF        ; interrupt-Flag löschen
    
    intEnde                      ; gerettete w und STATUS wieder zurückschreiben
        swapf   status_temp,w
        movwf   STATUS
        swapf   w_temp,f
        swapf   w_temp,w
        retfie
    Mal unabhängig das Du nichts sicherst (Register/Statusbyte) würde ich auch sagen, das Du das Interupt Flag nicht löscht. Dann wird natürlich auch kein neuer ausgelöst...
    Wenn ich es übersehen haben sollte...

    Initalisierung und den Rest habe ich mir jetzt noch gar nicht angeschaut...


    Gruß André

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    30.04.2008
    Beiträge
    81
    So, habe nun entgegen meine Überzeugung den Sprut-Code 1:1 kopiert, die ports angepasst und die LCD-geschichte hinzugefügt ->> geht immernoch nicht. alles wie vorher mit dem eingenen Code..

    hat jemand das UART schonmal Hardwaremäßig zum laufen gebracht bei nem PIC16?

    Gruß Jango

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.04.2008
    Beiträge
    81
    Yeah, es funktioniert!!!! komisch.. hab die Baudrate eingestellt als hätt ich 4Mhz als Fosc.
    dabei hab ich n 20Mhz Quarz dran.

    naja.. solangs geht, ist's mir wurscht.

    gruß Jango \/

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Zitat Zitat von Jango1987
    Yeah, es funktioniert!!!! komisch.. hab die Baudrate eingestellt als hätt ich 4Mhz als Fosc.
    dabei hab ich n 20Mhz Quarz dran.

    naja.. solangs geht, ist's mir wurscht.

    gruß Jango \/

    Hallo Jango

    da hast Du Dich aber gleich mehrfach geirrt?

    Mal unabhängig von "_XT_OSC"
    und falscher UART Initialisierung, hast Du Dich auch gleich noch im Kommentar vertan.


    Gruß André

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.04.2008
    Beiträge
    81
    @André der oben stehendeCode ist längst nicht aktuell.. hab doch den von Sprut genommen...

    wie auch immer.. problem ist keins mehr, also ist der Tread wohl fertig.

    Gruß Jango

Berechtigungen

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

LiFePO4 Speicher Test