PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART am PIC16F689



Jango1987
02.05.2010, 19:50
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:

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 O:)

Gruß Jango

PICture
02.05.2010, 20:56
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/index.php/PIC_Assembler .

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

MfG

Andre_S
03.05.2010, 09:59
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é

Jango1987
04.05.2010, 16:09
@ 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

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

Andre_S
04.05.2010, 16:42
Hallo Jango,

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

Schau mal:

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... :oops:

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


Gruß André

Jango1987
06.05.2010, 14:14
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

Jango1987
06.05.2010, 17:59
Yeah, es funktioniert!!!! komisch.. hab die Baudrate eingestellt als hätt ich 4Mhz als Fosc. :-s
dabei hab ich n 20Mhz Quarz dran.

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

gruß Jango \:D/

Andre_S
06.05.2010, 18:33
Yeah, es funktioniert!!!! komisch.. hab die Baudrate eingestellt als hätt ich 4Mhz als Fosc. :-s
dabei hab ich n 20Mhz Quarz dran.

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

gruß Jango \:D/


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é

Jango1987
07.05.2010, 17:02
@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