| Versions |
 |
|
| Author |
Topic  |
|
klemie
France
2 Posts |
Posted - 21 mars 2007 : 11:29:29
|
Bonjour,
je travaille sur un projet de système embarqué dans lequel je dois mesurer la position de l'appareil, via GSGGA. Est-ce que quelqu'un peut me donner un petit coup de pouce pour la programmation (C) bas niveau entre mon microcontrôleur (PIC16F4685, port série) et mon GPS (EM-406, protocole NMEA)? Je crois qu'il faut communiquer en ASCII mais je vois pas trop la tête du code... J'avoue que je suis un peu perdue!
Merci d'avance,
Klemie
|
|
|
Ads
|
|
|
vmatias
France
385 Posts |
Posted - 23 mars 2007 : 23:36:38
|
Regarde ici : http://www.ke4nyv.com/gpslcd.htm c'est en ASM mais ça doit te donner une idée. Il y a pas mal d'exemples pour un 16f84/16F628/16F876 Ou une recherche avec Google "NMEA monitor 16F876"
Tu dois pourvoir y trouver inspiration. |
 |
|
|
klemie
France
2 Posts |
Posted - 29 mars 2007 : 11:30:25
|
voilà où j'en suis. J'attends de recevoir les écrans pour tester. Je crois que j'ai fait une belle programmation de débutant mais *en théorie* ça doit fonctionner... Je me suis beaucoup inspirée d'ici -> http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=24076 J'ai cependant encore une question:
le nombre de caractères entre les virgules de la trame GGA est variable?
char i=-1; //variable globale bit test_GGA=0; bit ordre_depart=0; unsigned char nom[3]; //nom de la trame unsigned char heure[9] ; //heure unsigned char latitude[10]; //latitude unsigned char indicNS; //indicateur N/S unsigned char longitude[10]; //longitude unsigned char indicEO; //indicateur E/O unsigned char fiabilite; //indic de fiabilité unsigned char altitude[5]; //altitude
void SWserial_Shift_R_Data() { if(SWserial_Count & 0x0F == 0x08)// bit de stop: arrêter la lecture { Swserial_Status.0 = 0; // pas de lecture en cours; SWserial_count &= 0xF0; // RAZ compteur lecture t0con.TIMER0ON = 0; // Désactivation du timer intcon.INT0IE = 1; // Autoriser à nouveau les interruptions Rx
lecture_GGA(SWserial_RX_Byte); //on traite SWserial_RX_Byte avant la prochaine réception } else { SWserial_RX_Byte.7 = SW_RX; // Placement du bit dans SWserial_RX_Byte SWserial_RX_Byte >>= 1; // Décalage d'un bit à droite SWserial_Count++; // Incrément du compteur lecture } }
void lecture_GGA(char SWserial_RX_Byte){
if (SWserial_RX_Byte=='$'){ i=-1; ordre_depart=1; }
if (ordre_depart){
i++;
charRead=SWserial_RX_Byte;
switch(i){
/* Enregistrement du nom de la trame*/
case 3: nom[0]=charRead; break;
case 4: nom[1]=charRead; break;
case 5:
nom[2]=charRead; break; }
if (nom[0]=’G’ && nom[1]=’G’ && nom[2]=’A’ ){ test_GGA=1; } else{ ordre_depart=0; }
if (test_GGA){ switch (i){
/* Enregistrement de l'heure*/
case 7: if (charRead==','){// si virgule, on passe i=16; // au bloc suivant } else{ heure[0]=charRead; } break;
case 8: if (charRead==','){ i=16; } else{ heure[1]=charRead; } break;
case 9: if (charRead==','){ i=16; } else{ heure[2]=charRead; } break;
case 10: if (charRead==','){ i=16; } else{ heure[3]=charRead; } break;
case 11: if (charRead==','){ i=16; } else{ heure[4]=charRead; } break;
case 12: if (charRead==','){ i=16; } else{ heure[5]=charRead; } break;
case 13: if (charRead==','){ i=16; } else{ heure[6]=charRead; } break;
case 14: if (charRead==','){ i=16; } else{ heure[7]=charRead; } break;
case 15: if (charRead==','){ i=16; } else{ heure =charRead; } break;
/* Enregistrement de la latitude*/
case 17: if (charRead==','){ i=27; } else{ latitude[0]=charRead; } break;
case 18: if (charRead==','){ i=27; } else{ latitude[1]=charRead; }
break; case 19: if (charRead==','){ i=27; } else{ latitude[2]=charRead; }
break;
case 20: if (charRead==','){ i=27; } else{ latitude[3]=charRead; }
break;
case 21: if (charRead==','){ i=27; } else{ latitude[4]=charRead; }
break;
case 22: if (charRead==','){ i=27; } else{ latitude[5]=charRead; }
break;
case 23: if (charRead==','){ i=27; } else{ latitude[6]=charRead; }
break;
case 24: if (charRead==','){ i=27; } else{ latitude[7]=charRead; }
break;
case 25: if (charRead==','){ i=27; } else{ latitude =charRead; }
break;
case 26: if (charRead==','){ i=27; } else{ latitude[9]=charRead; }
break;
/* Enregistrement de l’indicateur N/S*/
case 28: if (charRead==','){ i=29; } else{ indicNS=charRead; } break;
/* Enregistrement de la longitude*/
case 30: if (charRead==','){ i=40; } else{ longitude[0]=charRead; } break;
case 31: if (charRead==','){ i=40; } else{ longitude[1]=charRead; } break;
case 32: if (charRead==','){ i=40; } else{ longitude[2]=charRead; } break;
case 33: if (charRead==','){ i=40; } else{ longitude[3]=charRead; } break;
case 34: if (charRead==','){ i=40; } else{ longitude[4]=charRead; }
break;
case 35: if (charRead==','){ i=40; } else{ longitude[5]=charRead; } break;
case 36: if (charRead==','){ i=40; } else{ longitude[6]=charRead; } break;
case 37: if (charRead==','){ i=40; } else{ longitude[7]=charRead; } break;
case 38: if (charRead==','){ i=40; } else{ longitude =charRead; } break;
case 39: if (charRead==','){ i=40; } else{ longitude[9]=charRead; } break;
/* Enregistrement de l’indicateur E/O*/
case 41: if (charRead==','){ i=42; } else { indicEO=charRead; } break;
/* Enregistrement de la fiabilité*/
case 43: if (charRead==','){ i=44; } else { fiabilite=charRead; } break;
/* nombre de satellites (non enregistré)*/
case 45: if (charRead==','){ i=47; } case 46: if (charRead==','){ i=47; }
/* dilution horizontale (non enregistrée)*/
case 48: if (charRead==','){ i=53; } case 49: if (charRead==','){ i=53; } case 50: if (charRead==','){ i=53; } case 51: if (charRead==','){ i=53; } case 52: if (charRead==','){ i=53; }
/* Enregistrement de l’altitude*/
case 54: if (charRead==','){ i=60; } else { altitude[0]=charRead; } break;
case 55: if (charRead==','){ i=60; } else { altitude[1]=charRead; }; break;
case 56: if (charRead==','){ i=60; } else { altitude[2]=charRead; } break;
case 57: if (charRead==','){ i=60; } else { altitude[3]=charRead; } break;
case 58: if (charRead==','){ i=60; } else { altitude[4]=charRead; } break;
case 59: if (charRead==','){ i=60; } else { altitude[5]=charRead; } break;
case 61: ordre_depart=0; test_GGA=0; break;
}
/* On n'a pas besoin des dernières informations de la trame */
} }
voilou! |
 |
|
|
vmatias
France
385 Posts |
Posted - 04 avr. 2007 : 09:47:23
|
quote: Originally posted by klemie
[....] le nombre de caractères entre les virgules de la trame GGA est variable? [...]
La réponse est Yes!!
|
 |
|
|
kiko66
32 Posts |
Posted - 10 avr. 2007 : 14:29:03
|
| Salut vmatias, es-tu joignable en mp? Je n'y arrive pas. |
 |
|
|
vmatias
France
385 Posts |
Posted - 11 avr. 2007 : 11:49:04
|
quote: Originally posted by kiko66
Salut vmatias, es-tu joignable en mp? Je n'y arrive pas.
La réponse est toujours "Yes!" |
 |
|
|
kiko66
32 Posts |
Posted - 11 avr. 2007 : 14:58:29
|
| Excuse me mister vmatias mais quand je clique sur ton profil, j'accède à une page qui me dit que le lien email n'est pas renseigné. Peux-tu m'envoyer un message en mp par lequel je pourrai te répondre. Thanks a lot. |
 |
|
|
redbull68
5 Posts |
Posted - 19 avr. 2007 : 14:02:59
|
bonjour
petite question je peux te deranger en MP vmatias ? si ca te derange pas ? Merci |
 |
|
|
Kiftax
France
7 Posts |
Posted - 21 mai 2007 : 22:17:54
|
quote: Originally posted by vmatias
Regarde ici : http://www.ke4nyv.com/gpslcd.htm c'est en ASM mais ça doit te donner une idée. Il y a pas mal d'exemples pour un 16f84/16F628/16F876 Ou une recherche avec Google "NMEA monitor 16F876"
Tu dois pourvoir y trouver inspiration.
Je suis curieux de voir le code ASM, mais je ne trouve pas le lien pour le télécharger. En fin de page, l'auteur annonce qu'il mettra "bientôt" en ligne le fichier mais.... Si quelqu'un l'a encore sur son pc, ça m'intéresse. Merci. |
 |
|
|
vmatias
France
385 Posts |
Posted - 22 mai 2007 : 15:15:02
|
En voilà un : Bonne lecture
; GPS Display for a serial NMEA interface ; Filename: gps.asm ; Name: Jeff Brown ; Email: brownj (at) a c k . c a ; Copyright 2005 ; Version 1.0 ; ; ********** ********** ; * *** * ; LCD RS A2 ** 1 18 ** A1 Switch1 ; * * ; LCD RW A3 ** 2 17 ** A0 Switch0 ; * * ; LCD E A4 ** 3 16 ** Xin Clock ; * * ; NC A5\MCLR ** 4 15 ** A6 Status LED ; * * ; GND VSS ** 5 14 ** VDD ; * * ; NC B0 ** 6 13 ** B7 LCD Data 3 ; * * ; Serial RX B1 ** 7 12 ** B6 LCD Data 2 ; * * ; NC B2 ** 8 11 ** B5 LCD Data 1 ; * * ; Backlight B3 ** 9 10 ** B4 LCD Data 0 ; * PIC16F628 * ; *********************** ; ; ; LIST P=16F628 ; include "P16F628.INC" __CONFIG 0x3F0B
LIST P=16F628a include <P16F628a.inc> errorlevel -302 ; Suppress "not in bank 0" message errorlevel -202 ; Suppress "Argument not in range" message ;; CONSTANTS SPBRG_VAL EQU .12 ;4.8Kbaud @ 4MHz LED EQU 6
RS EQU 2 RW EQU 3 E EQU 4
LCD_CMD EQU PORTA LCD_DTA EQU PORTB
org 0x00 goto MAIN
org 0x04 goto INT
;;;;;;;;;;; Variables cblock 0x20 tmp counter gpsstatus eeprom wreg_temp status_temp pclath_temp D0 D1 D2 lcd_tmp t_time :6 t_lat :0x0a t_lon :0x0b t_speed :4 t_date :6 end_global_vars:0 endc
if end_global_vars > 0x80 ; is 0x80 correct? error "Global variable space overrun" endif
;;;;;;;;;;; END OF VARIABLES ledon macro BCF PORTA,LED endm clearscreen macro ; LCD Clear screen movlw 0x01 call send_cmd movlw 0x02 call send_cmd endm commaseek macro call RX_CHAR xorlw ',' btfss STATUS,Z goto $-3 endm ledoff macro BSF PORTA,LED endm
m_estrobe macro bsf LCD_CMD,E call delay bcf LCD_CMD,E call delay endm
; *********************************************** ; Programme principal MAIN clrf PORTA clrf PORTB bsf STATUS,RP0 ; Bank 1 movlw 0x00 ; Disable switches for now ; movlw b'00000011' ; A0 and A1 inputs for the switches movwf TRISA movlw b'00000010' ; All Outputs movwf TRISB bcf STATUS,RP0 ; Bank 0 call INIT ; Initialize Serial port & stuff
; Turn Cursor Off movlw b'00001100' ;Display ON, Cursor OFF call send_cmd
; Show splash screen clearscreen ; movlw b'10000000' ; call send_cmd movlw e_jeff ; call sendstring ; movlw 0xc0 ; call send_cmd ; movlw e_pic ; call sendstring ; nop call long_delay call long_delay
goto speed ; goto time ; goto latlon
; Time and Frame Display time clearscreen movlw e_time ; Display Time call sendstring ;
movlw b'11000000' call send_cmd movlw 'F' call send_char movlw 'r' call send_char movlw 'a' call send_char movlw 'm' call send_char movlw 'e' call send_char movlw ':' call send_char movlw ' ' call send_char innertime call UPDATE movlw b'10000111' call send_cmd movf t_time,w call send_char movf t_time+1,w call send_char movlw ':' call send_char movf t_time+2,w call send_char movf t_time+3,w call send_char movlw ':' call send_char movf t_time+4,w call send_char movf t_time+5,w call send_char
movlw b'11000111' call send_cmd movf counter,w call send_hex
movlw ',' call send_char movlw ' ' call send_char
movf gpsstatus,w xorlw 'A' BTFSS STATUS,Z movf gpsstatus,w call send_char goto innertime
; -------------------- ; Latitude & Longitude ; -------------------- latlon clearscreen movlw e_lat call sendstring movlw b'11000000' call send_cmd movlw e_lon call sendstring innerlatlon call UPDATE ; Latitude movlw b'10000101' ; Position call send_cmd movf t_lat,w call send_char movf t_lat+1,w call send_char movlw b'11011111' ; degree symbol call send_char movf t_lat+2,w call send_char movf t_lat+3,w call send_char movf t_lat+4,w call send_char movf t_lat+5,w call send_char movf t_lat+6,w call send_char movf t_lat+7,w call send_char movf t_lat+8,w call send_char movf t_lat+9,w call send_char
; Longitude movlw b'11000101' call send_cmd movf t_lon+1,w call send_char movf t_lon+2,w call send_char movlw b'11011111' ; degree symbol call send_char movf t_lon+3,w call send_char movf t_lon+4,w call send_char movf t_lon+5,w call send_char movf t_lon+6,w call send_char movf t_lon+7,w call send_char movf t_lon+8,w call send_char movf t_lon+9,w call send_char movf t_lon+0x0a,w call send_char goto innerlatlon ; Speed speed clearscreen movlw e_speed call sendstring innerspeed call UPDATE movf gpsstatus,w xorlw 'A' BTFSS STATUS,Z goto spd_stat
call SPD_UPDATE movlw b'10000111' call send_cmd movf t_speed,w call send_char movf t_speed+1,w call send_char movf t_speed+2,w call send_char movf t_speed+3,w call send_char spd_stat movlw b'11001111' call send_cmd movf gpsstatus,w xorlw 'A' BTFSS STATUS,Z movf gpsstatus,w call send_char goto innerspeed nop sleep nop
UPDATE ; EXAMPLE: $GPRMC,224502,A,4300.8876,N,07915.6879,W,0.026,233.1,010205,11.0,W*48 ; PARSED: $__RMC_HHMMSS_A ; '_' is skipped. ; Can I write a simulator subroutine? bsf RCSTA,CREN ; Enable continuous receive NLINE call RX_CHAR ; Get Character from serial xorlw '$' ; Is Start of line? btfss STATUS,Z goto NLINE call RX_CHAR ; Won't check, Should be 'G' call RX_CHAR ; Won't check, Should be 'P' call RX_CHAR ; I want a 'R' xorlw 'R' btfss STATUS,Z goto NLINE call RX_CHAR ; I want a 'M' xorlw 'M' btfss STATUS,Z goto NLINE call RX_CHAR ; I want a 'C' xorlw 'C' btfss STATUS,Z goto NLINE ; If we made it this far, it's the proper line $GPRMC... call RX_CHAR ; Won't check, assuming ',' ; Time call RX_CHAR ; Hour*10 movwf t_time call RX_CHAR ; Hour movwf t_time+1 call RX_CHAR ; Minute*10 movwf t_time+2 call RX_CHAR ; Minute movwf t_time+3 call RX_CHAR ; Second*10 movwf t_time+4 call RX_CHAR ; Second movwf t_time+5 call RX_CHAR ; Won't check, assuming ',' call RX_CHAR ; GPS Status Flag movwf gpsstatus call RX_CHAR ; Won't check, assuming ',' ; Latitude call RX_CHAR ; Latitude*10 movwf t_lat call RX_CHAR ; Latitude movwf t_lat+1 call RX_CHAR movwf t_lat+2 call RX_CHAR movwf t_lat+3 call RX_CHAR movwf t_lat+4 call RX_CHAR movwf t_lat+5 call RX_CHAR movwf t_lat+6 call RX_CHAR movwf t_lat+7 call RX_CHAR movwf t_lat+8 call RX_CHAR ; Won't check, assuming ',' call RX_CHAR movwf t_lat+9 ; North or South call RX_CHAR ; Won't check, assuming ',' ; Longitude call RX_CHAR movwf t_lon call RX_CHAR movwf t_lon+1 call RX_CHAR movwf t_lon+2 call RX_CHAR movwf t_lon+3 call RX_CHAR movwf t_lon+4 call RX_CHAR movwf t_lon+5 call RX_CHAR movwf t_lon+6 call RX_CHAR movwf t_lon+7 call RX_CHAR movwf t_lon+8 call RX_CHAR movwf t_lon+9 call RX_CHAR ; Won't check, assuming ',' call RX_CHAR movwf t_lon+0x0A ; East or West call RX_CHAR ; Won't check, assuming ',' ; Speed in Knots call RX_CHAR movwf t_speed call RX_CHAR movwf t_speed+1 call RX_CHAR movwf t_speed+2 call RX_CHAR movwf t_speed+3 call RX_CHAR movwf t_speed+4 call RX_CHAR ; Won't check, assuming ',' call RX_CHAR ; Skipping call RX_CHAR ; Skipping call RX_CHAR ; Skipping call RX_CHAR ; Skipping call RX_CHAR ; Skipping call RX_CHAR ; Won't check, assuming ',' ; Date call RX_CHAR movwf t_date call RX_CHAR movwf t_date+1 call RX_CHAR movwf t_date+2 call RX_CHAR movwf t_date+3 call RX_CHAR movwf t_date+4 call RX_CHAR movwf t_date+5 ; call RX_CHAR ; Won't check, assuming ',' ;Magnetic Variation ;Checksum incf counter,f ; Count each line processed, rollover ok. bcf RCSTA,CREN ; Disable continuous receive return ; Done processing for now ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SPD_UPDATE ; EXAMPLE: $GPVTG,254.3,T,265.4,M,0.156,N,0.288,K*4B ; PARSED: $__VTG ; '_' is skipped. ; Can I write a simulator subroutine? bsf RCSTA,CREN ; Enable continuous receive SPD_NLINE call RX_CHAR ; Get Character from serial xorlw '$' ; Is Start of line? btfss STATUS,Z goto SPD_NLINE call RX_CHAR ; Won't check, Should be 'G' call RX_CHAR ; Won't check, Should be 'P' call RX_CHAR ; I want a 'V' xorlw 'V' btfss STATUS,Z goto SPD_NLINE call RX_CHAR ; I want a 'T' xorlw 'T' btfss STATUS,Z goto SPD_NLINE call RX_CHAR ; I want a 'G' xorlw 'G' btfss STATUS,Z goto SPD_NLINE ; If we made it this far, it's the proper line $GPVTG... commaseek commaseek commaseek commaseek commaseek commaseek commaseek ; Speed in KM/H call RX_CHAR movwf t_speed call RX_CHAR movwf t_speed+1 call RX_CHAR movwf t_speed+2 call RX_CHAR movwf t_speed+3
incf counter,f ; Count each line processed, rollover ok. bcf RCSTA,CREN ; Disable continuous receive return
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RX_CHAR ; Receive Char btfss PIR1, RCIF ; Wait for a character to be goto $-1 ; received movf RCREG,w ; Get the byte Received bcf PIR1,RCIF ; Reset the RX byte Interrupt request flag return
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sendstring ; Send a string from the EEPROM movwf eeprom sslp movf eeprom,W incf eeprom,F ; - - - Block of code to read from EEPROM (Pg. 90) bsf STATUS, RP0 ; Select Bank 1 movwf EEADR bsf EECON1,RD movf EEDATA,W bcf STATUS, RP0 ; Select Bank 0 ; - - - - BTFSC STATUS,Z ; If 0x00 was returned, exit return call send_char ; Send character to LCD screen goto sslp return ; Sanity check Return. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INIT ;; Init Serial Port bsf STATUS, RP0 ; Select Bank 1 movlw SPBRG_VAL ; Set Data Rate movwf SPBRG bcf TXSTA, SYNC ; Want Asynch Comm BCF TXSTA,BRGH ; Low Speed Clock bcf TXSTA,RX9 ; Eight bits to receive bcf STATUS, RP0 ; Select Bank 0 ; bsf RCSTA,CREN ; Enable continuous receive bsf RCSTA,SPEN ; Enable Serial Port clrf counter movlw '/' movwf gpsstatus
; LCD_INIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BCF LCD_CMD,E ;LCD_DTA BCF LCD_CMD,RS ;LCD_CMD,E,RS,RW BCF LCD_CMD,RW call delay ; delay MOVLW b'00110000' MOVWF LCD_DTA call LCD_E call LCD_E call LCD_E
MOVLW b'00100000' MOVWF LCD_DTA call LCD_E call LCD_E
MOVLW b'10000000' MOVWF LCD_DTA call LCD_E
MOVLW b'00000000' MOVWF LCD_DTA call LCD_E
MOVLW b'10000000' MOVWF LCD_DTA call LCD_E
MOVLW b'00000000' MOVWF LCD_DTA call LCD_E
MOVLW b'00010000' MOVWF LCD_DTA call LCD_E
MOVLW b'00000000' MOVWF LCD_DTA call LCD_E
MOVLW b'01100000' MOVWF LCD_DTA call LCD_E
MOVLW b'00000000' MOVWF LCD_DTA call LCD_E
MOVLW b'11100000' MOVWF LCD_DTA call LCD_E
; CGRAM Chars ;'00001110' ;'00010001' ;'00011111' ;'00011011' ;'00011111' ; GPS Lock icon movlw 0x40 call send_cmd movlw b'00001110' call send_char movlw b'00010001' call send_char call send_char movlw b'00011111' call send_char movlw b'00011011' call send_char call send_char movlw b'00011111' call send_char clrw call send_char
;; Done Init return
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LCD_E ; Strobe Enable Bit m_estrobe return ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ send_cmd movwf lcd_tmp ; Move char to tmp movlw 0x0F ; Mask off the high nibble andwf LCD_DTA,f ; Clear the LCD bus movf lcd_tmp,w ; Move tmp char to W andlw 0xF0 ; Mask off the low nibble iorwf LCD_DTA,f ; Move high nibble to LCD bus m_estrobe ; Strobe E movlw 0x0F ; Mask off the high nibble andwf LCD_DTA,f ; Clear the LCD bus swapf lcd_tmp,w ; Move tmp char to W and swap nibbles andlw 0xF0 ; Mask off the low nibble iorwf LCD_DTA,f ; Move high nibble to LCD bus m_estrobe ; Strobe E movf lcd_tmp,w return
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ send_char movwf lcd_tmp ; Move char to tmp movlw 0x0F ; Mask off the high nibble andwf LCD_DTA,f ; Clear the LCD bus movf lcd_tmp,w ; Move tmp char to W andlw 0xF0 ; Mask off the low nibble iorwf LCD_DTA,f ; Move high nibble to LCD bus call Char_strobe movlw 0x0F ; Mask off the high nibble andwf LCD_DTA,f ; Clear the LCD bus swapf lcd_tmp,w ; Move tmp char to W and swap nibbles andlw 0xF0 ; Mask off the low nibble iorwf LCD_DTA,f ; Move high nibble to LCD bus call Char_strobe movf lcd_tmp,w return ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Char_strobe ; Strobe E and check the busy flag movlw b'00010100' ; Set RS and E movwf LCD_CMD ; nop nop nop movlw b'00000100' ; Set RS high, unset E movwf LCD_CMD nop nop nop ; Get ready to read the busy flag movlw 0x0 ; Zero portB for using MPSIM movwf LCD_DTA ; bsf STATUS,RP0 ; Bank 1 movlw b'11110010' ; High nibble input, low nibble output movwf TRISB bcf STATUS,RP0 ; Bank 0 ; High Nibble of Port B is now inputs movlw b'00011000' ; Set E and RW movwf LCD_CMD movlw 0x0 movf LCD_DTA,f wait nop nop btfsc LCD_DTA,7 ; Check the busy flag goto wait ;; DEBUG ; LCD is ready clrf LCD_CMD ; Put the LCD bus back to outputs bsf STATUS,RP0 ; Bank 1 movlw b'00000010' ; All Outputs (Except RX) movwf TRISB bcf STATUS,RP0 ; Bank 0 ; Put the LCD bus back to outputs ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Strobe E and check the busy flag return ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ send_hex movwf tmp movlw '0' call send_char movlw 'x' call send_char
swapf tmp,w andlw 0x0F sublw 0x09 swapf tmp,w andlw 0x0F btfss STATUS,C addlw 0x07 addlw '0' call send_char
movf tmp,w andlw 0x0F sublw 0x09 movf tmp,w andlw 0x0F btfss STATUS,C addlw 0x07 addlw '0' goto send_char ; why call and return just below when we can goto? return ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INT ; Interupt Call movwf wreg_temp movf STATUS,W clrf STATUS movwf status_temp movf PCLATH,W movwf pclath_temp clrf PCLATH ;; Start ISR Here nop nop ;; End ISR Here clrf STATUS movf pclath_temp,W movwf PCLATH movf status_temp,W movwf STATUS swapf wreg_temp,F swapf wreg_temp,W retfie ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ long_delay movlw 0x90 movwf D0 inln2 call delay decfsz D0,f goto inln2 return
delay movlw 0x0f movwf D1 inloop decfsz D1,F goto adelay return adelay movlw 0xFF movwf D2 inloop2 nop decfsz D2,F goto inloop2 goto inloop ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ org 0x02100 ; EEPROM DATA e_lat de "LAT: ",0 e_lon de "LON: ",0 e_time de " Time: ",0 e_speed de "Speed: ---- Km/h",0 e_sgerr de "Error: No Signal",0 e_srerr de "Error: No Serial",0 e_pic de " PicGPS v1.0",0 e_jeff de " Jeff Brown",0 e_email de "brownj@ack.ca",0 de "",0 END |
 |
|
|
Kiftax
France
7 Posts |
Posted - 22 mai 2007 : 22:03:45
|
Merci ! Petite question : ya pas moyen de mettre les codes en fichiers téléchargeables sur ce forum ?(j'ai vu des forums avec l'architecture similaire où ça se faisait très bien) ça serait plus propre pour le parcours du forum parce que cette discussion commence à être "longue" à dérouler ^^ |
 |
|
|
vmatias
France
385 Posts |
Posted - 23 mai 2007 : 15:43:31
|
+1 
quote: Originally posted by Kiftax
Merci ! Petite question : ya pas moyen de mettre les codes en fichiers téléchargeables sur ce forum ?(j'ai vu des forums avec l'architecture similaire où ça se faisait très bien) ça serait plus propre pour le parcours du forum parce que cette discussion commence à être "longue" à dérouler ^^
|
 |
|
|
vmatias
France
385 Posts |
Posted - 23 mai 2007 : 15:46:07
|
Si ta as besoin d'aide .... je suis là 
|
 |
|
|
KHEOPS1982
Belgium
5 Posts |
Posted - 17 avr. 2008 : 18:53:23
|
Salut Kiftax,
Ton code en C que tu as mis plus haut, il fonctionne ? T'as transmission série c'est pour un pic disposant d'un UART ? Je suis en train d'interfacer un module GPS avec un pic 16F84A et je suis en train de voir pour coder.
Merci |
 |
|
|
vmatias
France
385 Posts |
Posted - 24 avr. 2008 : 15:06:53
|
Salut KHEOPS1982 Pour un 84A je préférè l'assembleur, il est plus compact. Et pourquoi tu ne prends pas un 16F628 ? . Il n'a pas besoin d'un Quartz externe . Il a une vrai UART . Il a plus de I/O
|
 |
|
|
KHEOPS1982
Belgium
5 Posts |
Posted - 26 avr. 2008 : 15:08:36
|
Salut,
J'ai changé de PIC j'ai pris un 16F877A et je programme en C via mikroC. Mais je ne trouve pas comment décoder les trames arrivant sur le port série. Peux-tu m'aiguiller ?
Merci |
 |
|
Topic  |
|
|
|
| This page was generated in 0,72 seconds. |
 |
|