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