Google
  Web www.gpspassion.com


GpsPasSion LIVE!
www.flickr.com
This is a Flickr badge showing public photos from GpsPasSion Live !. Make your own badge here.

www.NaviBlog.com



Versions

Links/Liens




Portal/Portail
Rechercher

- -

Polls/Sondages
Sondage
Pour vous guider sur la Route :
GPS Mobile (SEM)
GPS Intégré
Smartphone
Autre
Voter  -  Résultat des votes
Votes : 1929




Club GpsPasSion
Soutenez le site!

USA: (US$)
EUROPE: (€)
Guide Paypal


GpsPasSion Forums
Home | Profile | Register/Enregist. | Active Topics | Search/Recherche | FAQ
Username:
Password:
Save Password
Forgot your Password?

 All Forums
 Programmation GPS et Logiciels en "Beta"
 C++
 Connexion PIC - GPS
 New Topic  Reply/Répondre
 Printer Friendly
Next Page
Author Previous Topic Topic Next Topic
Page: of 2

klemie

France
2 Posts

Posted - 21 mars 2007 :  11:29:29  Show Profile  Reply with Quote
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  Show Profile  Reply with Quote
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.
Go to Top of Page

klemie

France
2 Posts

Posted - 29 mars 2007 :  11:30:25  Show Profile  Reply with Quote
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!
Go to Top of Page

vmatias

France
385 Posts

Posted - 04 avr. 2007 :  09:47:23  Show Profile  Reply with Quote
quote:
Originally posted by klemie


[....]
le nombre de caractères entre les virgules de la trame GGA est variable?
[...]



La réponse est Yes!!
Go to Top of Page

kiko66

32 Posts

Posted - 10 avr. 2007 :  14:29:03  Show Profile  Reply with Quote
Salut vmatias, es-tu joignable en mp? Je n'y arrive pas.
Go to Top of Page

vmatias

France
385 Posts

Posted - 11 avr. 2007 :  11:49:04  Show Profile  Reply with Quote
quote:
Originally posted by kiko66

Salut vmatias, es-tu joignable en mp? Je n'y arrive pas.



La réponse est toujours "Yes!"
Go to Top of Page

kiko66

32 Posts

Posted - 11 avr. 2007 :  14:58:29  Show Profile  Reply with Quote
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.
Go to Top of Page

redbull68

5 Posts

Posted - 19 avr. 2007 :  14:02:59  Show Profile  Reply with Quote
bonjour

petite question je peux te deranger en MP vmatias ? si ca te derange pas ? Merci
Go to Top of Page

Kiftax

France
7 Posts

Posted - 21 mai 2007 :  22:17:54  Show Profile  Reply with Quote
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.
Go to Top of Page

vmatias

France
385 Posts

Posted - 22 mai 2007 :  15:15:02  Show Profile  Reply with Quote
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
Go to Top of Page

Kiftax

France
7 Posts

Posted - 22 mai 2007 :  22:03:45  Show Profile  Reply with Quote
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 ^^
Go to Top of Page

vmatias

France
385 Posts

Posted - 23 mai 2007 :  15:43:31  Show Profile  Reply with Quote
+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 ^^

Go to Top of Page

vmatias

France
385 Posts

Posted - 23 mai 2007 :  15:46:07  Show Profile  Reply with Quote
Si ta as besoin d'aide .... je suis là
Go to Top of Page

KHEOPS1982

Belgium
5 Posts

Posted - 17 avr. 2008 :  18:53:23  Show Profile  Visit KHEOPS1982's Homepage  Reply with Quote
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
Go to Top of Page

vmatias

France
385 Posts

Posted - 24 avr. 2008 :  15:06:53  Show Profile  Reply with Quote
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
Go to Top of Page

KHEOPS1982

Belgium
5 Posts

Posted - 26 avr. 2008 :  15:08:36  Show Profile  Visit KHEOPS1982's Homepage  Reply with Quote
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
Go to Top of Page
Page: of 2 Previous Topic Topic Next Topic  
Next Page
 New Topic  Reply/Répondre
 Printer Friendly
Jump To:
GpsPasSion Forums © 2002-2014_GpsPasSion/Manzanite Go To Top Of Page
This page was generated in 0,84 seconds. Powered By: Snitz Forums 2000 Version 3.4.05