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:
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"..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
Sieht jemand einen fehler? wäre erfreut wenn ein alter PIC-Hase mal einen blick drauf wirft![]()
Gruß Jango







Zitieren

Lesezeichen