Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Bonjour tout le monde.

J'ai récupéré le programme d'un baromètre, seulement je ne sais pas en qu'elle language il est écris ( désolé je ne mis conné pas trop ).

Si quelqu'un arrive a le comprendre, je voudrais savoir si il y aurait un moyen de le modifier pour qu'il sauvegarde l'altitude, lorsqu'on l'arete, sinon il faut la rerentrer chaque fois qu'on le rallume.

 

Voila le programme :

 

;**************************************************************

;* GS 4/2005 *

;* B A R O / A L T I M E T R E V 2 *

;* *

;**************************************************************

;* FUSES : CPoff , WDToff , LVPoff , Clock 8 Mhz *

;**************************************************************

; This is the version 2 file with the on/off button tied

; to the MCLR pin, instead to the RA2...

 

LIST r=dec

 

__CONFIG B'11111100110010'

 

INCLUDE "P16F876.INC"

 

INCLUDE "MATH16.INC"

 

;DECLARATION DES VARIABLES

INCLUDE "BARO.INC"

 

;Zone datas bargraph en bank1

#Define BAR_DATA 0A0h

#Define ALT_DATA 0B2h

#Define DNV_DATA 0C4h

 

;PINS I/O - AFFICHEUR LCD

#Define ENABLE PORTB,4 ; B0-B3 datas

#Define RS PORTB,5

#Define LCDPOW PORTB,7 ; commande alim LCD

 

;PINS I/O - CAPTEUR BARO MS3354

#Define MCLK PORTC,2

#Define SCLK PORTC,4

#Define DOUT PORTC,5

#Define DIN PORTC,3

 

#Define TX PORTA,0

#Define RX PORTA,1

 

#Define BUZZER PORTC,6 ; beep juste sur clavier

 

#Define K_SELECT PORTA,3

#Define K_VALID PORTA,4

 

;CONSTANTES GLOBALES DU SYSTEME

#Define F_SECH 128 ; pour avoir une (incr a 255)

 

#Define MIN_BARO 10 ;30 ; 30 mins entre acqu baro

 

#Define MCLKMASK 16 ; pour xor out

 

#Define S9600 64 ; temp bit emission !!!

#Define R9600_2 24 ; ' ' recep. !!!

 

;Positions du bargraph ecran (ddram)

#Define BARG_UP 0 +12

#Define BARG_LOW 64+12

 

;FLAGS

#Define CARRY16 FLAGS,0

#Define FKEY FLAGS,1

#Define FLAG_0 FLAGS,2 ; ote premiers '0' si =0

#Define F_AQU FLAGS,4

#Define READY FLAGS,5 ; =1 moyenne mesure complete

#Define C5MSB FLAGS,7

 

;Le registre CCPR1L est inchange en cas de reveil de sleep

; ou de mclr reset, il sert de flag si allume ou pas

 

;Pr‚fixes des commandes du MS5534

#Define B_AQUD1 10100000B

#Define B_AQUD2 10010000B

 

#Define B_RDW1 01010100B

#Define B_RDW3 01100100B

#Define B_RDW2 01011000B

#Define B_RDW4 01101000B

 

;+++++++++++++++ RESET GENERAL ++++++++++++++++++++++

 

org 0x0000

goto start

 

; org 8

; goto start

 

org 4 ;10

;++++++++ INTERRUPTION DU TIMER 1 ++++++++++++++++++++

INT_ISR movwf W_SAVE ; sauve W

swapf STATUS,0 ; sauve STATUS

clrf STATUS

movwf SR_SAVE

 

tmr1_it bcf PIR1,TMR1IF ; raz tmr it flag

movlw F_SECH ;

movwf TMR1H ; raz compteurs

 

;une seconde est passee...

no_aqubg incf SECONDE,1 ; incr les secondes

movf SECONDE,0

sublw 59

btfsc STATUS,C

goto f_it

 

;une minute est passee...

clrf SECONDE

incf MINUTE,1 ; incr les minutes

movf MINUTE,0

sublw 59

btfsc STATUS,C

goto f_it

 

;une heure est passee...

bsf F_AQU ; Lance data aqu pour bargraph

 

clrf MINUTE

incf HEURE,1 ; incr les heures

movf HEURE,0

sublw 23

btfss STATUS,C

clrf HEURE ; un jour passe !

 

f_it swapf SR_SAVE,0 ; remet STATUS

movwf STATUS

swapf W_SAVE,1

swapf W_SAVE,0 ; Remet W

retfie

 

 

;------------ PROGRAMME PRINCIPAL ----------------------

start bsf STATUS,RP0

movlw 11111110B ;

movwf TRISA ;

movlw 00000000b ; conf les I/O

movwf TRISB ;

movlw 10100011b ;

movwf TRISC

movlw 01000000B ; 0

movwf OPTION_REG

movlw 6

movwf ADCON1

bcf STATUS,RP0

 

;Raz les its

clrf INTCON

clrf PIR1

clrf PIR2

 

bsf BUZZER ; pas de buzz

 

clrf FLAGS ; raz les flags

 

;Init Timer1

movlw 00001110B ; conf TIMER1 int clock

movwf T1CON ; avec prescaler 1:8

clrf PIR1

clrf PIR2

 

;Raz les 3 tampons datas bargraphs

movlw BAR_DATA

movwf FSR

movlw 3*18

movwf TPO1

razmem movlw 10

movwf INDF ; clrf

incf FSR,1

decfsz TPO1,1

goto razmem

 

;Init en timer0 & 1 its

bsf STATUS,RP0

movlw 00000001B ; Timer 1 it

movwf PIE1

bcf STATUS,RP0

 

;Lance le PWM a 33 khz pour MCLK

OSC_ON bsf STATUS,RP0

movlw 14

movwf PR2 ; clock fosc / 4 = 4 mhz

bcf STATUS,RP0

movlw 2

movwf CCPR1L ; duty cycle 50/50

movlw 00000101B

movwf T2CON

movlw 00101100B ; PWM mode

movwf CCP1CON

 

;Init complete de l'heure et du pointeur barometre

movlw F_SECH ;

movwf TMR1H ; & raz les ctrs

movlw 12

movwf HEURE

clrf MINUTE

clrf SECONDE

bsf T1CON,TMR1ON ; lance comptage heure

movlw MIN_BARO ; Raz ctr du barometre

movwf BARO_CTR

 

movlw BAR_DATA ; raz les ptr bargraph baro

movwf BAR_PTR ; (next val to write)

movlw ALT_DATA ; & bargraph alti

movwf ALT_PTR ;

movlw DNV_DATA ; & deniv

movwf DNV_PTR ;

 

clrf D_ALTH ; raz delta

clrf D_ALTL ; altimetre

 

clrf D_DENIVH ; raz delta

clrf D_DENIVL ; denivelee

 

movlw 027h

movwf PRESSREF_H ; init 1013.2*10

movlw 094h ; comme press ref

movwf PRESSREF_L

 

 

call ON_OFF ; alterne ON<-->Off

 

call INITLCD ; Init le LCD

 

movlw 040h ; Ecran d'acceuil

call SETPTRLCD ;

movlw M_COPYR

call MSGBOX

movlw 4

call SETPTRLCD

movlw M_VSOFT

call MSGBOX

call TEMPOLL

 

;Lance It du timer 1

bsf INTCON,PEIE ; TMR1 it enable

bsf INTCON,GIE ; global it

 

;---------- Debut Mode Barometre ---------------------

BAROMET call FX

movlw 2

call SETPTRLCD

movlw M_MBARO

call MSGBOX

call TEMPOLL

call CLS

 

;Debut de la boucle principale

debut btfss READY ; si READY=0

bsf F_AQU ; force aquisition

 

call KEY2TEST ; test si Set Heure

btfsc FKEY

goto SET_TIME

 

;Mesure la pression

call MOYENNE ; mesures + moyenne

 

call KEYVAL ; test si -> Altimetre

btfsc STATUS,C

goto ALTIM

 

;Gestion du Bargraph

btfss F_AQU ; test flag si new val

goto nosavbar

 

bcf F_AQU ; il y a une new

movf PR_SUMH,0 ; data a stocker

movwf TPO1

movf PR_SUML,0

movwf TPO2

 

movf BAR_PTR,0 ; ptr zone datas

movwf GR_PTR

movlw BAR_DATA ; debut zone datas

movwf GR_MIN

call BARSTORE ; store la valeur

movf GR_PTR,0 ; prend new ptr

movwf BAR_PTR

 

nosavbar movlw BAR_DATA ; debut zone datas

movwf GR_MIN

movf BAR_PTR,0 ; ptr zone datas

movwf GR_PTR

call BARGRAPH ; dessin bargraph juste !

 

;Aff la pression

call IDNMEA ; '$WI'

 

call SEND

movlw 'p'

call SEND

movf PRESS_H,0

movwf PR_SUMH

call SEND

movf PRESS_L,0

movwf PR_SUML

call SEND

 

movlw 1

call SETPTRLCD

call AFFPRESS ; aff la pression

 

;Affiche Heure / Temperature

call AFFTIMDEG

goto debut

 

 

;------------- Mode Altimetre ------------------------------

ALTIM call FX

movlw 2

call SETPTRLCD

movlw M_MALTI

call MSGBOX

call TEMPOLL

call CLS

 

debut2 call KEYVAL ; test si -> baro

btfsc STATUS,C

goto DENIV

 

;Mesure la pression

call MOYENNE ; mesures + moyenne

movf PRESS_H,0

movwf TPO1

movf PRESS_L,0

movwf TPO2

 

;Calcul de l'altitude (dure 5 mS)

bcf INTCON,GIE

movlw 08h

movwf PCLATH

call ALTIT ; result = PR_SUMH.L = AARGB2.3

clrf PCLATH

bsf INTCON,GIE

 

movf AARGB2,0

movwf PR_SUMH

movf AARGB3,0

movwf PR_SUML

 

movf D_ALTL,0 ; ajoute la

addwf PR_SUML,1 ; compensation

btfsc STATUS,C ; en altit

incf PR_SUMH,1

movf D_ALTH,0

addwf PR_SUMH,1

 

;Gestion du Bargraph

btfss F_AQU ; test flag si new val

goto nosavalt

bcf F_AQU

 

movf PR_SUML,0 ; data a stocker

movwf TPO2

movf PR_SUMH,0

movwf TPO1

movf ALT_PTR,0 ; ptr zone datas

movwf GR_PTR

movlw ALT_DATA ; debut zone datas

movwf GR_MIN

call BARSTORE ; store new val

movf GR_PTR,0 ; prend new ptr

movwf ALT_PTR

 

nosavalt movlw ALT_DATA ; debut zone datas

movwf GR_MIN

movf ALT_PTR,0 ; ptr zone datas

movwf GR_PTR

call BARGRAPH ; dessin juste

 

;Envoie sur port com

call IDNMEA ; '$WI'

movlw 'a' ; altitude port com

call SEND

 

affalt movf PR_SUMH,0

call SEND

movf PR_SUML,0

call SEND

 

;Aff l'altitude

movlw 0

call SETPTRLCD

movlw 'A'

call SENDCHRLCD

movlw 'l'

call SENDCHRLCD

movlw 't'

call SENDCHRLCD

movlw '='

call SENDCHRLCD

 

movf PR_SUMH,0 ; test si alt negative

andlw 128

btfsc STATUS,Z

goto altposit

movlw '-'

call SENDCHRLCD

comf PR_SUMH,1 ; complement

comf PR_SUML,1 ; a

incf PR_SUML,1 ; deux

btfsc STATUS,Z

incf PR_SUMH,1

 

altposit call AFFALTIT ; affiche altit dans PR_SUMH.L

 

call KEY2TEST ; test si Set Altit

btfsc FKEY

goto SET_ALT

 

;Affiche la Heure / Temp.

call AFFTIMDEG

goto debut2

 

;------------- Mode Denivelee-metre ------------------------------

DENIV call FX

movlw 2

call SETPTRLCD

movlw M_DENIV

call MSGBOX

call TEMPOLL

call CLS

 

debut3 call KEYVAL ; test si -> baro

btfsc STATUS,C

goto TEMPDEG

 

;Mesure la pression

call MOYENNE ; mesures + moyenne

movf PRESS_H,0

movwf TPO1

movf PRESS_L,0

movwf TPO2

 

;Calcul de l'altitude (dure 5 mS)

bcf INTCON,GIE

movlw 08h

movwf PCLATH

call ALTIT ; result = PR_SUMH.L = AARGB2.3

clrf PCLATH

bsf INTCON,GIE

 

movf AARGB2,0

movwf PR_SUMH

movf AARGB3,0

movwf PR_SUML

 

movf D_DENIVL,0 ; ajoute la

addwf PR_SUML,1 ; compensation

btfsc STATUS,C ; en altit

incf PR_SUMH,1

movf D_DENIVH,0

addwf PR_SUMH,1

 

;Gestion du Bargraph

btfss F_AQU ; test flag si new val

goto nosavalt2

bcf F_AQU

 

movf PR_SUML,0 ; data a stocker

movwf TPO2

movf PR_SUMH,0

movwf TPO1

movf DNV_PTR,0 ; ptr zone datas

movwf GR_PTR

movlw DNV_DATA ; debut zone datas

movwf GR_MIN

call BARSTORE ; store new val

movf GR_PTR,0 ; prend new ptr

movwf DNV_PTR

 

nosavalt2 movlw DNV_DATA ; debut zone datas

movwf GR_MIN

movf DNV_PTR,0 ; ptr zone datas

movwf GR_PTR

call BARGRAPH ; dessin juste

 

;Envoie sur port com

call IDNMEA ; '$WI'

movlw 'd' ; altitude port com

call SEND

 

movf PR_SUMH,0

call SEND

movf PR_SUML,0

call SEND

 

;Aff la denivelee

movlw 0

call SETPTRLCD

movlw 'd'

call SENDCHRLCD

movlw '='

call SENDCHRLCD

 

movf PR_SUMH,0 ; test si alt negative

andlw 128

btfsc STATUS,Z

goto denposit

movlw '-'

call SENDCHRLCD

comf PR_SUMH,1 ; complement

comf PR_SUML,1 ; a

incf PR_SUML,1 ; deux

btfsc STATUS,Z

incf PR_SUMH,1

goto afdenv

 

denposit movlw '+'

call SENDCHRLCD

 

afdenv call AFFALTIT ; affiche altit dans PR_SUMH.L

call KEY2TEST ; test si Set Altit

btfsc FKEY

goto SET_DENIV

 

;Affiche la Heure / Temp.

call AFFTIMDEG

goto debut3

;------------------------------------------------------------

 

TEMPDEG call FX

movlw 2

call SETPTRLCD

movlw M_TEMPDEG

call MSGBOX

call TEMPOLL

call CLS

 

debut4 call KEYVAL ; test si -> baro

btfsc STATUS,C

goto BAROMET

 

call AFFTEMPDEG

call AFFTDEG

goto debut4

 

 

 

;Envoie retour chariot et Prefixe NMEA

IDNMEA movlw 13

call SEND

movlw 10

call SEND

 

movlw '$'

call SEND

 

movlw 'W'

call SEND

movlw 'I'

call SEND

return

;-----------------------------------------------------------

;Gere la mise en ou hors tension du systeme

; sort : - en sleep mode eteint avec FLAGON = 0

; - tout re-allume avec FLAGON = 1

;Gere la mise en ou hors tension du systeme

; sort : - en sleep mode eteint avec FLAGON = 0

; - tout re-allume avec FLAGON = 1

ON_OFF movlw 1

xorwf CCPR2L,1

 

btfss CCPR2L,0

goto met_on

 

call CLS

movlw 6

call SETPTRLCD

movlw M_OFF

call MSGBOX

call TEMPOL

 

met_off bsf LCDPOW

bsf STATUS,RP0 ;BANK1

movlw 11111111b ; conf les I/O

movwf TRISB ;

movlw 11111111b ;

movwf TRISC

bcf STATUS,RP0 ;BANK0

 

sleep ; met en mode veille

goto start

 

met_on bsf STATUS,RP0

movlw 00000000b ; conf les I/O

movwf TRISB ;

movlw 10100011b ;

movwf TRISC

bcf STATUS,RP0

bcf LCDPOW ; Allume le LCD

return

;----------------------------------------------------------

;Aff la pression en abcde.f en hpa

AFFPRESS btfsc READY

goto aff_bok

 

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

goto aff_n

 

aff_bok call DECTODIG

movf TPO1,0

call SENDCHRLCD

movf TPO2,0

call SENDCHRLCD

movf TPO3,0

call SENDCHRLCD

movf TPO4,0

call SENDCHRLCD

movlw ','

call SENDCHRLCD

movf TPO5,0

call SENDCHRLCD

 

aff_n movlw ' '

call SENDCHRLCD

movlw 'h'

call SENDCHRLCD

movlw 'P'

call SENDCHRLCD

movlw 'a'

call SENDCHRLCD

return

;----------------------------------------------------------

;Affiche Temperature/HEURE

AFFTEMPDEG movlw 000h

call SETPTRLCD

;btfss STATUS,Z

call SENDCHRLCD

movlw 'I'

call SENDCHRLCD

movlw 'l'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

movlw 'f'

call SENDCHRLCD

movlw 'a'

call SENDCHRLCD

movlw 'i'

call SENDCHRLCD

movlw 't'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

movlw ':'

goto aff_deg

return

 

AFFTDEG movlw 040h

call SETPTRLCD

call SENDCHRLCD

movlw 'I'

call SENDCHRLCD

movlw 'l'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

movlw 'e'

call SENDCHRLCD

movlw 's'

call SENDCHRLCD

movlw 't'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

movlw ':'

call AFFHEURE ; aff heures

movlw ':' ; & minutes

call SENDCHRLCD

call AFFMINUTE

movlw ':' ; & secondes

call SENDCHRLCD

call AFFSECONDE

return

 

;Affiche la Degres / Temperature

AFFTIMDEG movlw 041h

call SETPTRLCD

 

movf SECONDE,0 ; 2sec/4 aff degres/heure

andlw 10

btfss STATUS,Z

goto aff_deg

 

call AFFHEURE ; aff heures

movlw ':' ; & minutes

call SENDCHRLCD

call AFFMINUTE

movlw ':' ; & secondes

call SENDCHRLCD

call AFFSECONDE

return

 

aff_deg call IDNMEA ; '$WI'

movlw 't' ; temperature port com

call SEND

 

movf TEMP_H,0 ; aff la temperature

movwf PR_SUMH

call SEND

movf TEMP_L,0

movwf PR_SUML

call SEND

 

btfsc TEMP_H,7

goto temp_neg

;temperature positive (cas normal)

call DECTODIG

 

movlw ' '

call SENDCHRLCD

 

afftemp movf TPO3,0

call SENDCHRLCD

movf TPO4,0

call SENDCHRLCD

movlw ','

call SENDCHRLCD

movf TPO5,0

call SENDCHRLCD

movlw 0DFh ; 'ø'

call SENDCHRLCD

movlw 'C'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

return

 

;Temperature negative (cas rare)

temp_neg comf TEMP_H,0 ; aff la temperature

movwf PR_SUMH

comf TEMP_L,0

movwf PR_SUML

 

call DECTODIG

movlw '-'

call SENDCHRLCD

goto afftemp

;------------------------------------------------------------

;Fait le menu reglage heure .

SET_TIME call CLS

movlw M_REGLERH ; "Regler Time ?"

call MSGBOX

call ANTIREB

 

call YESNO

btfss FKEY

goto BAROMET

 

call CLS

movlw M_REGLERH

call MSGBOX

movlw 10

call SETPTRLCD

movlw M_HEURES

call MSGBOX

 

;debut reglage Heures (HEURE)

inch call KEYSEL

btfss STATUS,C

goto noinch

incf HEURE,1 ; incr heure

movf HEURE,0 ; bloque a 24h

xorlw 24

btfsc STATUS,Z

clrf HEURE

 

noinch movlw 042h

call SETPTRLCD

call AFFHEURE ; aff Heures

movlw ':'

call SENDCHRLCD

call AFFMINUTE

call TEMPOC

 

call KEYVAL

btfss STATUS,C

goto inch

call ANTIREB

 

movlw 10

call SETPTRLCD

movlw M_MINS

call MSGBOX

 

;Regle les minutes

incm call KEYSEL

btfss STATUS,C

goto noincm

incf MINUTE,1 ; inc minutes

movf MINUTE,0 ; bloque a 60

xorlw 60

btfsc STATUS,Z

clrf MINUTE

 

noincm movlw 042h

call SETPTRLCD

call AFFHEURE ; aff min

movlw ':'

call SENDCHRLCD

call AFFMINUTE

call TEMPOC

 

call KEYVAL

btfss STATUS,C

goto incm

call ANTIREB

 

clrf SECONDE ;

movlw F_SECH ; raz secondes

movwf TMR1H ;

goto BAROMET

;------------------------------------------------------------

;Menu raz de la denivelee

SET_DENIV call CLS

movlw M_RAZDENIV ; "Raz deniv ?"

call MSGBOX

call ANTIREB

 

call YESNO

btfss FKEY

goto DENIV

 

comf AARGB3,1 ; dAlt = - altit

incf AARGB3,1 ;

btfsc STATUS,Z ;

decf AARGB2,1

comf AARGB2,0

movwf D_DENIVH

 

movf AARGB3,0

movwf D_DENIVL

goto DENIV

;------------------------------------------------------------

;Menu de reglage de l'altitude de reference

SET_ALT call CLS

movlw M_SETALTIT ; "Regler Alt Ref?"

call MSGBOX

call ANTIREB

 

call YESNO

btfsc FKEY

goto alt_abs

 

call CLS

movlw M_SETPRESS ; "Regler Press ref ?"

call MSGBOX

call ANTIREB

 

call YESNO

btfss FKEY

goto ALTIM

 

;**** Regle l'altimetre par pression QNH ****

alt_prabs call CLS

movlw M_SETPRESS

call MSGBOX

 

razp1 movlw 026h

movwf C1H ; demarre a 990mB

movlw 0ACh

movwf C1L

 

incp1 call KEYSEL

btfss STATUS,C

goto noincp1

incf C1L,1 ; ajoute 0.1mB

btfsc STATUS,Z

incf C1H,1

movf C1H,0 ; bloque a 1030mB

xorlw 028h

btfsc STATUS,Z

goto razp1

 

noincp1 movlw 040h

call SETPTRLCD

movf C1H,0

movwf PR_SUMH

movf C1L,0

movwf PR_SUML

call AFFPRESS ; decompose PR_SUMH.L

call TEMPOCC

 

call KEYVAL

btfss STATUS,C

goto incp1

call ANTIREB

 

movf C1H,0

movwf PRESSREF_H

movf C1L,0 ; sauve pressref

movwf PRESSREF_L ; et raz

clrf D_ALTH ; le delta alt

clrf D_ALTL

goto ALTIM

 

 

;**** Regle l'altitude par altitude connue ****

alt_abs call CLS

movlw M_SETALTIT

call MSGBOX

bsf FLAG_0 ; aff les 0

 

;debut reglage altitude reference (C1H.L)

raz0m movlw 13

call SETPTRLCD ; affich pas de 100m

movlw M_100M

call MSGBOX

 

clrf C1H

clrf C1L

 

;Regle par pas de 100m

inc100 call KEYSEL

btfss STATUS,C

goto noinc100

movlw 100 ; ajoute 100m

addwf C1L,1

btfsc STATUS,C

incf C1H,1

movf C1H,0 ; bloque a 9000m

xorlw 024h

btfsc STATUS,Z

goto raz0m

 

noinc100 movlw 040h

call SETPTRLCD

movf C1H,0

movwf PR_SUMH

movf C1L,0

movwf PR_SUML

call AFFALTIT ; decompose PR_SUMH.L

call TEMPOC

 

call KEYVAL

btfss STATUS,C

goto inc100

 

call ANTIREB

 

movlw 13

call SETPTRLCD ; affich pas de 10 m

movlw M_10M

call MSGBOX

 

;Regle par pas de 10 m

inc10 call KEYSEL

btfss STATUS,C

goto noinc10

movlw 10 ; ajoute 10m

addwf C1L,1

btfsc STATUS,C

incf C1H,1

movf C1H,0 ; bloque a 9000m

xorlw 024h

btfsc STATUS,Z

clrf C1H

 

noinc10 movlw 040h

call SETPTRLCD

movf C1H,0

movwf PR_SUMH

movf C1L,0

movwf PR_SUML

call AFFALTIT ; decompose PR_SUMH.L

call TEMPOC

 

call KEYVAL

btfss STATUS,C

goto inc10

call ANTIREB

 

movlw 13

call SETPTRLCD ; affich pas de 1 m

movlw M_1M

call MSGBOX

 

;Regle par pas de 1 m

inc1 call KEYSEL

btfss STATUS,C

goto noinc1

movlw 1 ; ajoute 10m

addwf C1L,1

btfsc STATUS,C

incf C1H,1

movf C1H,0 ; bloque a 9000 m

xorlw 024h

btfsc STATUS,Z

clrf C1H

 

noinc1 movlw 040h

call SETPTRLCD

movf C1H,0

movwf PR_SUMH

movf C1L,0

movwf PR_SUML

call AFFALTIT ; decompose PR_SUMH.L

call TEMPOC

 

call KEYVAL

btfss STATUS,C

goto inc1

 

call ANTIREB

 

comf AARGB3,1 ; last altit = - altit

incf AARGB3,1 ;

btfsc STATUS,Z

decf AARGB2,1

comf AARGB2,1

 

movf AARGB3,0 ; calc le delta

addwf C1L,1 ; en altitude

btfsc STATUS,C ; dans D_ALT

incf C1H,1 ;

movf AARGB2,0 ; et raz pressref

addwf C1H,0 ; a 1013.2 mB

movwf D_ALTH

movf C1L,0

movwf D_ALTL

 

movlw 027h

movwf PRESSREF_H ;

movlw 094h ; raz a Pref = 1013mb

movwf PRESSREF_L ;

 

bcf FLAG_0 ; cache pas les '0'

goto ALTIM

;------------------------------------------------------------

;Affiche l'altitude

AFFALTIT movlw ' '

call SENDCHRLCD

 

btfsc READY

goto aff_aok

 

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

movlw '-'

call SENDCHRLCD

goto aff_m

 

aff_aok call DECTODIG ; decompose PR_SUMH.L

 

movf TPO1,0

xorlw ' '

btfsc STATUS,Z

goto aff_2c

movf TPO1,0

call SENDCHRLCD

 

aff_2c movf TPO2,0

xorlw ' '

btfsc STATUS,Z

goto aff_3c

movf TPO2,0

call SENDCHRLCD

 

aff_3c movf TPO3,0

xorlw ' '

btfsc STATUS,Z

goto aff_4c

movf TPO3,0

call SENDCHRLCD

 

aff_4c movf TPO4,0

xorlw ' '

btfsc STATUS,Z

goto aff_5c

movf TPO4,0

call SENDCHRLCD

 

aff_5c movf TPO5,0

call SENDCHRLCD

 

aff_m movlw 'm'

call SENDCHRLCD

movlw ' '

call SENDCHRLCD

 

return

;----------------------------------------------------------

;Stocke la valeur TPO1,2 dans [GR_MIN...GR_MIN+15] en bank1

;et pointee par GR_PTR qui est incr. GR_PTR.

BARSTORE movf GR_PTR,0 ; prend le ptr

movwf FSR

bcf STATUS,C

rrf TPO1,1 ; divise / 2

rrf TPO2,1

 

movf TPO2,0 ; sto LSB first

movwf INDF

incf FSR,1

movf TPO1,0 ; sto MSB second

movwf INDF

incf FSR,1

 

movf GR_MIN,0

addlw 16

xorwf FSR,0

btfss STATUS,Z

goto norazptr

bsf READY ; 1ø tour datas ok

movf GR_MIN,0 ; raz ptr

movwf FSR ; de la zone

 

norazptr movf FSR,0 ; save new val ptr

movwf GR_PTR

return

;----------------------------------------------------------

;Represente sur 8 barres de 1 (min) a 16 pas (max)

; (1 point de haut = 8m ou 0.8 mBar)

;Datas 8 * 16bits pointees par GR_MIN

BARGRAPH movlw 0Bh

call SETPTRLCD ; met les

movlw 7 ; ordonees

call SENDCHRLCD

movlw 04Bh

call SETPTRLCD

movlw 7

call SENDCHRLCD

 

clrf C3H ; raz somme

clrf C3L ;

 

;Fait la moyenne des datas dans C3H.L

movf GR_MIN,0

movwf FSR

movlw 8

movwf C1H

clrf C1L ; raz extra carry

 

_moyl1 movf INDF,0

addwf C3L,1

btfsc STATUS,C

incf C3H,1

incf FSR,1

movf INDF,0

addwf C3H,1

btfsc STATUS,C

incf C1L,1 ; inc carry si > ffffh

 

incf FSR,1

decfsz C1H,1

goto _moyl1

 

;div la moyenne par 8

rrf C1L,1 ; prend extra carry

 

rrf C3H,1

rrf C3L,1

bcf STATUS,C

rrf C3H,1

rrf C3L,1

bcf STATUS,C

rrf C3H,1

rrf C3L,1

;fait moy = - moy

comf C3L,1

comf C3H,1

incf C3L,1

btfsc STATUS,Z

incf C3H,1

 

movlw BARG_LOW+7 ; init lcd bas/droite

movwf C2L ; C2L = save posit Lcd

call SETPTRLCD

 

movf GR_PTR,0

movwf FSR

decf FSR,1

decf FSR,1

movlw 8

movwf C1H ; C1H = n loops

 

showbar movlw 2 ; test si roll

subwf GR_MIN,0

xorwf FSR,0

btfss STATUS,Z

goto noroll

movf GR_MIN,0

addlw 14

movwf FSR

 

noroll movf INDF,0 ; lit lsb first

movwf C4L

incf FSR,1

movf INDF,0

movwf C4H

decf FSR,1

decf FSR,1

decf FSR,1

 

movf C3L,0 ; fait VAL - moy

addwf C4L,1

btfsc STATUS,C

incf C4H,1

movf C3H,0

addwf C4H,1

 

movf C4H,0 ; test si ecart > 256

andlw 128

btfsc STATUS,Z

goto deltapos

movf C4H,0 ; ecart negatif

xorlw 0ffh

btfss STATUS,Z

goto blocmin

comf C4L,0 ; c4h posit

andlw 128

btfsc STATUS,Z

goto nosat

blocmin clrf C4L ; bloque au min

goto nosat

 

deltapos movf C4H,0 ; difference positive

btfsc STATUS,Z

goto nosat2

movlw 127

movwf C4L ; bloque au max

goto nosat

 

nosat2 movf C4L,0 ; test lsb delta

andlw 128

btfsc STATUS,Z

goto nosat

movlw 127

movwf C4L ; bloque au max

 

nosat call SHOWVAL ; trace la val C4L

 

decfsz C1H,1

goto showbar

 

return

;----------------------------------------------------------

;Dessine la valeur C4L sur les deux lignes

SHOWVAL movlw 127

addwf C4L,1

 

bcf STATUS,C

rrf C4L,1

bcf STATUS,C ; divise par 16

rrf C4L,1

bcf STATUS,C

rrf C4L,1

bcf STATUS,C

rrf C4L,0

 

andlw 15

movwf C4L

 

andlw 8

btfsc STATUS,Z

goto lowline

 

;Dessine la valeur C4L de >7 a 15

movlw 0ffh ; carre noir en bas

call sendcarr

movlw 040h

subwf C2L,0 ; sur ligne haute

call SETPTRLCD

movf C4L,0

andlw 7 ; fait le carre

call sendcarr ; mince du haut

goto recul

 

lowline movf C4L,0

andlw 7 ; fait le carre

call sendcarr ; mince du haut

movlw 040h

subwf C2L,0

call SETPTRLCD

movlw 32 ; carre blanc en haut

call sendcarr

 

recul movlw 1

subwf C2L,0 ; recule

movwf C2L ;

call SETPTRLCD

return

 

sendcarr movwf TPO1 ; remplace le chr7 par ff

xorlw 7 ; et affiche

btfss STATUS,Z ;

goto fsdcarr

movlw 0ffh

movwf TPO1

fsdcarr movf TPO1,0

call SENDCHRLCD

return

;-------------------------------------------------------

;Fait 4 mesures completes Press+Temp -> PRESS_H/L

MOYENNE movlw 4 ; 4 loops

movwf BARO_MOY

clrf PR_SUML

clrf PR_SUMH

clrf PR_SUMHH

 

no_zer call PRESSTEMP ; mesure P & Temp

 

movf ACCCL,0

addwf PR_SUML,1 ;

btfsc STATUS,C ; additionne

incf PR_SUMH,1 ; dans PR_SUM

movf ACCCH,0 ;

addwf PR_SUMH,1

btfsc STATUS,C

incf PR_SUMHH,1

 

decfsz BARO_MOY,1

goto no_zer

 

bcf STATUS,C

rrf PR_SUMHH,1

rrf PR_SUMH,1 ; divise par 4

rrf PR_SUML,1

bcf STATUS,C

rrf PR_SUMHH,1

rrf PR_SUMH,1

rrf PR_SUML,1

 

;Moyenne avec last valeur

movlw 3

movwf C1H

somm3 movf PRESS_L,0

addwf PR_SUML,1 ;

btfsc STATUS,C ; additionne

incf PR_SUMH,1 ; 3 * old value

movf PRESS_H,0 ;

addwf PR_SUMH,1

decfsz C1H,1

goto somm3

 

bcf STATUS,C

rrf PR_SUMH,1

rrf PR_SUML,1

bcf STATUS,C ; divise

rrf PR_SUMH,1 ;

rrf PR_SUML,0 ; par 4

movwf PRESS_L

 

movf PR_SUMH,0

movwf PRESS_H

return

;------------------------------------------------------------

;Raz et fait mesures et calculs complets de temp & press

;Renvoie : TEMPH.L = Temp & ACCCH.L = Press

PRESSTEMP call RESET_SEQ

 

;Lit et stocke les W1...W4

movlw 7

movwf TPO1 ; Lecture de W1

movlw B_RDW1

call CMDBARO

call RDBARO

 

bcf C5MSB

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

btfsc STATUS,C

bsf C5MSB ; sauve le C5 msb

movf TPO1,0

movwf C1H

movf TPO2,0

movwf C1L

 

movlw 7 ; Lecture de W2

movwf TPO1

movlw B_RDW2

call CMDBARO

call RDBARO

 

movf TPO2,0

andlw 00111111B

addlw 50

movwf C6L ; Store C6+50

 

bcf STATUS,C

btfsc C5MSB

bsf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,0

andlw 11111000B

movwf C5L

movf TPO1,0

movwf C5H ; Store C5 * 8

 

movlw 4Fh ; x + 20224

addwf C5H,1 ; UT1 est dans C5H/L

 

movlw 7

movwf TPO1 ; Lecture de W3

movlw B_RDW3

call CMDBARO

call RDBARO ; data lues dans TPO1,2

 

movf TPO2,0

movwf C3H ; sauve 1/2 C3

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

movf TPO2,0

movwf C4L

movf TPO1,0

movwf C4H ; Store C4

movlw 2

subwf C4H,1 ; C4 = C4 - 512

 

movlw 7

movwf TPO1 ; Lecture de W4

movlw B_RDW4

call CMDBARO

call RDBARO ; data lues dans TPO1,2

 

movf C3H,0

movwf TPO3

clrf C2L

rrf TPO3,1 ; prend les b6,b7 de C2

rrf C2L,1

rrf TPO3,1

rrf C2L,1

movf TPO2,0

andlw 00111111B

iorwf C2L,1 ; merge & store C2L

 

movf TPO3,0

andlw 00001111B ; store C2H

movwf C2H

 

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

bcf STATUS,C

rrf TPO1,1

rrf TPO2,1

movf TPO2,0

movwf C3L

movf TPO1,0

movwf C3H ; Store C3

 

;debut du calcul de Temperature

call RESET_SEQ ; reset avant conv

 

movlw 7 ; Lecture de D2

movwf TPO1

movlw B_AQUD2

call CMDBARO

call TEMPO9600 ; tempo mini 0.1mS

wait_dout2 btfsc DOUT

goto wait_dout2

call RDBARO ; data lues dans TPO1,2

 

;Test de securite si temp < -10øC bloque a -10ø !!!

movlw 050h

subwf TPO1,0

btfsc STATUS,C

goto nosat10

movlw 050h ; bloque a -10øC

movwf TPO1

 

nosat10 comf C5L,1 ; UT1 = - UT1

incf C5L,1 ;

btfsc STATUS,Z ; = ACCBH/L

decf C5H,1

comf C5H,1

 

bcf STATUS,C

movf TPO2,0

addwf C5L,1

btfsc STATUS,C

incf C5H,1

movf TPO1,0

addwf C5H,1 ; C5H.L = dT (= D2 - UT1)

btfsc STATUS,C

goto d2suput1

;

;------ Cas ou Temp<20øC , complemente et recomplemente --------

;

comf C5H,1 ; complemente dT

comf C5L,1

 

movf C5L,0

movwf ACCAL

movf C5H,0

movwf ACCAH

 

movf C6L,0

movwf ACCBL

clrf ACCBH

call MUL1616 ; ACCBC=ACCA*ACCB = dT*(C6+50)

 

bcf STATUS,C

rrf ACCBL,1

rrf ACCCH,1 ; fait que 2 shift

rrf ACCCL,1 ; pour 2^10

bcf STATUS,C

rrf ACCBL,1

rrf ACCCH,1

rrf ACCCL,1

 

comf ACCBL,1

comf ACCCH,1 ; recomplemente

comf ACCCL,1

 

movlw 200 ; Temp = 200 + ...

addwf ACCCH,1

btfsc STATUS,C

incf ACCBL,1

 

movf ACCBL,0

movwf TEMP_H ; Store TEMP

movf ACCCH,0

movwf TEMP_L

 

;fait : OFF = C2*4 + (C4-512)*dT)/2^12

movf C5L,0

movwf ACCAL

movf C5H,0

movwf ACCAH

movf C4L,0

movwf ACCBL

movf C4H,0

movwf ACCBH

call MUL1616 ; ACCBC=ACCA*ACCB = dT*(C4-512)

 

movlw 12 ; pour 2^12

call R_SHIFT

 

finoff0 bcf STATUS,C

rlf C2L,1

rlf C2H,1 ; fait C2 * 4

bcf STATUS,C

rlf C2L,1

rlf C2H,1

movf ACCCL,0 ; C2=OFF=C2+(...)/2^12

addwf C2L,1

btfsc STATUS,C

finoff incf C2H,1

 

;Fait : SENS = C1 + (C3*dT)/2^10 +24576

movf C5L,0

movwf ACCAL

movf C5H,0 ; ici C5 inverses

movwf ACCAH

movf C3L,0

movwf ACCBL

movf C3H,0

movwf ACCBH

call MUL1616 ; ACCB.C= dT * C3

 

movlw 10 ; pour / 2^10

call R_SHIFT

 

comf ACCCL,1 ; recomplemente

comf ACCCH,1

goto fin20deg

 

;

;----- Cas ou temp > 20øC , le dT etait deja bien >0 ----------

;

d2suput1 movf C5L,0

movwf ACCAL

movf C5H,0

movwf ACCAH

 

movf C6L,0

movwf ACCBL

clrf ACCBH

call MUL1616 ; ACCBC=ACCA*ACCB = dT*(C6+50)

 

bcf STATUS,C

rrf ACCBL,1

rrf ACCCH,1 ; fait que 2 shift

rrf ACCCL,1 ; pour 2^10

bcf STATUS,C

rrf ACCBL,1

rrf ACCCH,1

rrf ACCCL,1

 

movlw 200 ; Temp = 200 + ...

addwf ACCCH,1

btfsc STATUS,C

incf ACCBL,1

 

movf ACCBL,0

movwf TEMP_H ; Store TEMP

movf ACCCH,0

fintemp movwf TEMP_L

 

;Debut calcul Pression

;fait : OFF = C2*4 + (C4-512)*dT)/2^12

movf C5L,0

movwf ACCAL

movf C5H,0

movwf ACCAH

movf C4L,0

movwf ACCBL

movf C4H,0

movwf ACCBH

call MUL1616 ; ACCBC=ACCA*ACCB = dT*(C4-512)

 

movlw 12 ; pour 2^12

call R_SHIFT

 

bcf STATUS,C

rlf C2L,1

rlf C2H,1 ; fait C2 * 4

bcf STATUS,C

rlf C2L,1

rlf C2H,1

movf ACCCL,0 ; C2=OFF=C2+(...)/2^12

addwf C2L,1

btfsc STATUS,C

incf C2H,1

 

;Fait : SENS = C1 + (C3*dT)/2^10 +24576

movf C5L,0

movwf ACCAL

movf C5H,0

movwf ACCAH

movf C3L,0

movwf ACCBL

movf C3H,0

movwf ACCBH

call MUL1616 ; ACCB.C= dT * C3

movlw 10 ; pour / 2^10

call R_SHIFT

 

fin20deg movf ACCCL,0

addwf C1L,1 ; C1 + (C3*dT)/2^10

btfsc STATUS,C

incf C1H,1

movf ACCCH,0

addwf C1H,1

movlw 96 ; + 24576

addwf C1H,1 ; C1 = SENS (environ 50000)

finsens

 

;Fait : X=(SENS*(D1-7168))/2^14 - OFF

call RESET_SEQ ; reset avant conv

 

movlw 7 ; Lecture de D1

movwf TPO1

movlw B_AQUD1

call CMDBARO

 

movlw 042h

movwf TPO1 ; msb

movlw 068h

movwf TPO2 ; lsb

 

 

call TEMPO9600 ; tempo mini 0.1 mS

wait_dout1 btfsc DOUT

goto wait_dout1

call RDBARO

 

movlw 28

subwf TPO1,1 ; D1 - 7168

 

movf C1L,0

movwf ACCAL

movf C1H,0

movwf ACCAH

movf TPO2,0

movwf ACCBL

movf TPO1,0

movwf ACCBH

call MUL1616 ;ACCB.C= (D1-7168) * SENS

 

movlw 14

call R_SHIFT ; fait / 2^14

 

comf C2L,1 ; fait ACCCH.L - OFF(C2)

incf C2L,1 ; commence par C2 = - C2

btfsc STATUS,Z

decf C2H,1

comf C2H,1

 

bcf STATUS,C ; puis additionne

movf ACCCL,0

addwf C2L,1

btfsc STATUS,C

incf C2H,1

movf ACCCH,0

finx addwf C2H,1 ; C2H.L = (sens*...)-OFF = X

 

movf C2H,0 ; fait X * 25

movwf ACCAH

movf C2L,0

movwf ACCAL

movlw 5

movwf ACCBL

clrf ACCBH

call MUL1616 ; ACCB.C= 5 * X

 

movlw 4

call R_SHIFT ; = (X*5)/2^4

 

movlw 0C4h ; ACC += 2500

addwf ACCCL,1

btfsc STATUS,C

incf ACCCH,1

movlw 9

addwf ACCCH,1 ; PRESS*10 dans ACCCH.L

 

finpress return

;--------------------------------------------------------

;Shifte W fois ACCB.C vers la droite pour diviser

;Use : TPO6

R_SHIFT movwf TPO6

rrfloop2 bcf STATUS,C

rrf ACCBH,1

rrf ACCBL,1

rrf ACCCH,1

rrf ACCCL,1

decfsz TPO6,1

goto rrfloop2

return

;-------------------------------------------------------

AFFHEURE movf HEURE,0

movwf PR_SUML

clrf PR_SUMH

call DECTODIG

movf TPO4,0

call SENDCHRLCD

movf TPO5,0

call SENDCHRLCD

return

 

AFFMINUTE movf MINUTE,0

movwf PR_SUML

clrf PR_SUMH

call DECTODIG

movf TPO4,0

call SENDCHRLCD

movf TPO5,0

call SENDCHRLCD

return

 

AFFSECONDE movf SECONDE,0

movwf PR_SUML

clrf PR_SUMH

call DECTODIG

movf TPO4,0

Posté(e) (modifié)

Un assembleur (ASM, Motorola ?), direct compilable language machine ...

 

Exemple : Instruction " Movwf " (MOVe W to File)

 

S'cusez, tout oublié le reste, ce n'est pas d'hier et même ton code ne doit pas être récent ! :P

Modifié par O.Fournier
Posté(e)

Bon,

à moins de cadors à venir dans ce domaine fais une recherche Google sur les sites des adeptes fous qui existent encore (même en France) sur les assembleurs ...

 

Moi j'ai jeté l'éponge il y a ... plus de vingt ans. Dommage j'aimais bien mais dans la vie faut faire des choix ...

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...