; *************************************************************** ; Manip CW pour PIC 16F84 cw16f842.ASM venant de MANIPV12.ASM ; !! Penser … indiquer la version dans la fonction : Version ; Pour un 16C84 le paramŠtre MAXMEM4 doit valoir 2F ; Pour un 16F84 le paramŠtre MAXMEM4 doit valoir 4F ; ETAT : ; Ce fichier est libre pour une utilisation non commerciale ; pour tout autre application contacter : arlotto@univ-tln.fr ; ; 1.2 Version distribu‚e pour 16f84 ; 0.56 Interdiction des commandes /B en premier caractŠre pour ‚viter blocage ; 0.55 Possibilit‚ de commande dŠs le premier caractŠre d'une m‚moire ; 0.54 Fonction cmd /V : passage en mode VI depuis une m‚moire ; 0.53 Fonction cmd /M, /A, /N : mise … 1, … 0, ou inversion de RA2 (SC) ; 0.52 Mode balise : M1 peut contenir 59 caractŠres (entr‚e par BP1+BP2+BP3) ; Fonction tune /T5, /T1, /T2 tune pendant 5s, 10s ou 20s ; 0.51 Antiblocage de la fonction playCar, pour un d‚marrage plus franc ; de la lecture m‚moire l'arrˆt n'est possible ; qu'aprŠs le premier caractŠre ; 0.50 Correction du bug rev en mode MEMO ; 0.46 Variation de vitesse en lecture, interruption de M4 ; 'i' sur buzer uniquement ; 0.45 Pas d'interruption de la m‚moire 4 ni de variation de vitesse en lecture ; Remplacement des Macro TX et BUZ par des fonctions pour gagner de la place ; Joue 'f' si nb max de caractŠres atteint en m‚moire … la place de erreur ; 0.44 M1:30c;M2:16c;M3:12c;M4:11c + variation de vitesse en lecture Memoire ; Interruption possible de M4 ; 0.43 Correction Bug bouclage + /b"n" et /c : ; 0.42 Essai de commande de bouclage par / en d‚but de mot ; Faire attention car certains caractŠres bloquent la fonction PlayCar ; 0.41 S‚paration mot sur m‚moires EEPROM / arret lecture sur clef ou BP ; 0.40 Correction Bug 0.38 ; 0.38 Init EEPROM par POR+BP1, modif dans ETAT_MANIP2 ; Taille Memoire EEPROM fixe : M1(00,35),M2(36,49),M3(50,60) ; Appel de Version si init EE, D‚placement de Fonction_BP ; avant Point et Trait ; 0.37 Essai des m‚moire EEPROM (reste bug Buzzer/PTT en mode MEMO) ; 0.36 S‚paration mot par appui sur BP 2 appui cons‚cutif -> fin memo ; 0.33 =0.32 + Entr‚e m‚mo par apppui long Sortie par n'importe quel bp ; 0.32 non fait :Am‚lioration m‚moire 4 test de fin de RAM dispo ; 0.31 Corection du bug d'inversion du sens en memoire ; 0.30 DeuxiŠme essai d'entr‚e de caractŠres avec la clef + memoire 4 ; pour l'instant : BP1 entr‚e memoire4, BP4 joue m‚moire4 ; 0.22 Initialisation de la VI … 10 mots/min … la mise sous tension ; 0.21 R‚duction de TMAXTUNE … 20s , mise en place du mode Vitesse Impos‚e ; 0.20 Divergence par rapport … 17..19 qui sont des essais pour m‚moire ; Version finalis‚ pour F8DBO et F5MIY ; Plus de m‚moire, r‚duction du temps BP … 100ms ; Tmax de 25s en mode Tune et indication entr‚e en mode tune par T ; Correction bug tempo longue ; 0.16 Correction timing + contr“le anti blocage clef ; 0.15 Correction timing pour une meilleure imitation iamibic ; 0.14 Toggle BUZZER sur BP1+BP3 et mode TUNE sur BP3+BP4 ; 0.13 PTT … z‚ro pour les indications + modif hard 2.2k // EB du 2N3904 ; 0.12 Possibilit‚ d'appui simultan‚ sur les BP ; 0.11 Correction Bug sur mode Sleep ; 0.10 Mise en place de l'indication de version provisoirement sur BP2 ; 0.09 Mise en place de la fonction qui joue un caractŠre : PlayCar ; 0.08 Passage tempo Point/Trait … 2ms Variation non lin‚aire ; 0.07 Mise en place du rapport 1/3 fixe ; D‚finitions g‚n‚rales include "pic84.equ" ; EQUIVALENCES XTAL EQU .4 ;Valeur en MEGAHERTZ et en d‚cimal (.) ; du quartz utilis‚ ; DEFINITION DES PORTS ; Port_A RA4/RTCC RA3 RA2 RA1 RA0 ; Etat E E/S S E/S S ; Tris_A 1 1 0 1 0 ;01Ah ; Nom CPTM DIS SC RM SBUZ CPTM EQU 4 ; compteur DIS EQU 3 ; d‚charge de C SC EQU 2 ; sortie command‚e par /M /A /N RM EQU 1 ; r‚sistance … mesurer SBUZ EQU 0 ; Sortie buzer Tris_A EQU 1Ah ;au reset ; ; Port_B RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 ; Etat E E E E S E E E ; Nom BP4 BP3 BP2 BP1 PTT DAH DIT NC ; TRISB 1 1 1 1 0 1 1 1 ; BP4 EQU 7 ;BP4 = bouton poussoir nø4 BP3 EQU 6 ;BP3 = bouton poussoir nø3 BP2 EQU 5 ;BP2 = bouton poussoir nø2 BP1 EQU 4 ;BP1 = bouton poussoir nø1 PTT EQU 3 ;PTT = Sortie du manip vers PTT du TX DAH EQU 2 ;DAH = Entr‚e trait (point en reverse) DIT EQU 1 ;DIT = Entr‚e point (trait en reverse) NC EQU 0 ;INT Tris_B EQU 0F7h M_BP EQU 0F0h ;masque pour les quatres BP ; D‚fintions des ‚quivalences pour les tempos ; Registre d'‚tat 1 octet ; B7 B6 B5 B4 B3 B2 B1 B0 ; | XX | XX | T16B |START |ENCOU |ECHUE |DEPAS |ATTEN ; Compteur : 1 octet (ou 2 octet si T16B vaut 1) T16B EQU 5 ; indique si compteur sur 16 bits START EQU 4 ; mis … 1 au lancement ENCOU EQU 3 ; indique tempo en cours ECHUE EQU 2 ; indique tempo echue DEPAS EQU 1 ; indique temps d‚pass‚ ATTEN EQU 0 ; indique tempo en atten ; D‚finition de l'‚tat principal du manip ; B7 B6 B5 B4 B3 B2 B1 B0 ; | MBUZ | IAMB | IT2MS | POIN | MEMO | FONC | REV | TX TX EQU 0 ;1 TX / 0 RX REV EQU 1 ;1 mode reverse FONC EQU 2 ;1 fonction en cours (/) MEMO EQU 3 ;2 mode entr‚e de caractŠre en m‚moire POIN EQU 4 ;… 1 quand on fait un point … 0 sinon IT2MS EQU 5 ;indique qu'il faut executer l'IT … 2ms IAMB EQU 6 ;indique l'appui sur Point (res. Trait) pendant Trait (res. Point) MBUZ EQU 7 ;1 buzzer actif / 0 buzzer inactif ETAT_INIT EQU 80h ; buzzer actif, pas reverse ; D‚finition de l'‚tat secondaire du manip ; B7 B6 B5 B4 B3 B2 B1 B0 ; | BALI | MOTDIFF | M4 | DEBUT | ARRET | M1 | ENVI | VI VI EQU 0 ;indique le mode Vitesse Impos‚e (dit mode D‚butant) ENVI EQU 1 ;indique le mode r‚glage de VI M1 EQU 2 ;memoire 1 active (entr‚e ou lecture) NC ARRET EQU 3 ; arret lecture m‚moire DEBUT EQU 4 ; … 1 pour la premiŠre lettre d'une m‚moire EEPROM M4 EQU 5 ;memoire 4 active (entr‚e ou lecture) MOTDIF EQU 6 ;indique mot diff‚rent BALI EQU 7 ; indique le mode balise ETAT2_INIT EQU 00h ; pas de mode VI … priori et pas de m‚moire active ETAT2_RAZM EQU B'10000011' ; Masque pour RAZ indication memoire ;******************************************************************* ;* D‚finition des lettres morses (cf norme dans fonction PlayCar) ;* Sans s‚paration de mots (ajouter +MOT_DIFF si n‚cessaire) ;* B 76543210 CW_A EQU B'01111001' CW_B EQU B'01101000' CW_C EQU B'01101010' CW_D EQU B'01110100' CW_E EQU B'01111100' CW_F EQU B'01100010' CW_G EQU B'01110110' CW_H EQU B'01100000' CW_I EQU B'01111000' CW_J EQU B'01100111' CW_L EQU B'01100100' CW_M EQU B'01111011' CW_N EQU B'01111010' CW_O EQU B'01110111' CW_R EQU B'01110010' CW_T EQU B'01111101' CW_V EQU B'01100001' CW_W EQU B'01110011' CW_0 EQU B'01011111' CW_1 EQU B'01001111' CW_2 EQU B'01000111' CW_3 EQU B'01000011' CW_4 EQU B'01000001' CW_5 EQU B'01000000' CW_6 EQU B'01010000' CW_7 EQU B'01011000' CW_8 EQU B'01011100' CW_9 EQU B'01011110' CW_BARRE EQU B'01010010' CW_POINT EQU B'00010101' CW_ERREUR EQU B'00000000' MOT_DIFF EQU B'10000000' MEM_FIN EQU B'11111111' ;******************************************************************* ; D‚finition MACRO pour tempo ; LANCE : macro de lancement d'une tempo 8 bits LANCE MACRO ETAT_TMPN,CMPT_TMPN,TEMPS_TMPN clrf ETAT_TMPN ;arrŠte la tempo movlw TEMPS_TMPN ;charge le temps max movwf CMPT_TMPN ; dans le compteur bsf ETAT_TMPN,START ;et lance la tempo ENDM ; EMET : macro de lancement d'une tempo sp‚cifique aux points/traits/espaces EMET MACRO VAL_XXX clrf ETAT_TMP1 ;arrŠte la tempo principale movf VAL_XXX,w ;charge le temps courant movwf CMPT_TMP1 ; dans le compteur bsf ETAT_TMP1,START ;et lance la tempo ENDM ;******************************************************************* ; D‚finition MACRO pour PTT ON/OFF TXON MACRO CW ;paramŠtre CW factice movlw TRISB movwf FSR bcf 0,PTT ;PTT est une sortie ENDM TXOFF MACRO CW ;paramŠtre CW factice movlw TRISB movwf FSR bsf 0,PTT ;PTT est une entr‚e ENDM ;******************************************************************* ; D‚finition MACRO pour forcer BUZZER ON BUZ_ON MACRO CW ;paramŠtre CW factice movlw TRISA movwf FSR bcf 0,SBUZ ;SUBZ est une sortie ENDM ; D‚finition MACRO pour remettre le BUZZER ON/OFF selon MBUZ BUZ_MAJ MACRO CW ;paramŠtre CW factice movlw TRISA movwf FSR btfss ETAT_MANIP,MBUZ ;Mode buzzer actif ? bsf 0,SBUZ ;non SBUZ est une entr‚e btfsc ETAT_MANIP,MBUZ ;Mode buzzer actif ? bcf 0,SBUZ ;oui SBUZ est une sortie ENDM ;*************************************** ;* MACRO Pour la division 8/8 UDIV0808L macro ; Max Timing: 2+7*12+11 = 97 clks ; Min Timing: 2+7*11+10 = 89 clks ; PM: 13 DM: 4 MOVLW 8 MOVWF LOOPCOUNT LOOPU0808A RLF ACCB0,W RLF REMB0, F MOVF BARGB0,W SUBWF REMB0, F BTFSC STATUS,C GOTO UOK88A ADDWF REMB0, F BCF STATUS,C UOK88A RLF ACCB0, F DECFSZ LOOPCOUNT, F GOTO LOOPU0808A endm ; D‚finition des registres … usage g‚n‚ral org 0Ch ;origine de la RAM GP ETAT_MANIP RES 1 ; registre d'‚tat principal du manip ETAT_MANIP2 RES 1 ; registre d'‚tat secondaire ETAT_100MS RES 1 ; registre d'‚tat de la tempo 100 ms CMPT_100MS RES 1 ; compteur de la tempo 100ms ETAT_TMP1 RES 1 ; registre d'‚tat de la tempo principale CMPT_TMP1 RES 1 ; compteur de la tempo principale VAL_POINT RES 1 ; valeur courante du point en ms VAL_TRAIT RES 1 ; valeur courante du trait en ms VAL_ESPACE RES 1 ; valeur courante de l'espace en ms VAL_POINT_VI RES 1 ; valeur courante du point en mode VI VAL_TRAIT_VI RES 1 ; valeur courante du trait en mode VI VAL_ESPACE_VI RES 1 ; valeur courante de l'espace en mode VI TEMP_REG RES 1 ; registre temporaire (usage g‚n‚ral) TEMP_REG2 RES 1 ; registre temporaire (usage g‚n‚ral) ETAT_LONG RES 1 ; registre d'‚tat de la tempo longue CMPT_LONG RES 1 ; compteur de la tempo longue LOOPCOUNT RES 1 ; pour la division ACCB0 RES 1 ; dividende puis quotient REMB0 RES 1 ; reste BARGB0 RES 1 ; diviseur CMPT_SYMB RES 1 ; compteur du nb de Point ou Trait cons‚cutif MEM_TEMP RES 1 ; m‚moire temporaire MAX_MEM RES 1 ; svg de fin de m‚moire EEPROM MEM_PTR RES 1 ; pointeur m‚moire ; attention cette ligne doit se trouver en fin de m‚moire MEMOIRE_4 RES 1 ; caractŠres en m‚moire 4 jusqu'… la fin ; valeur max de la ram … modifier selon le type 16C ou 16F84 ;MAXMEM4 EQU 02Fh ; pour un 16C84 MAXMEM4 EQU 04Fh ; pour un 16F84 ; valeur des tempo POINT_INIT EQU .20 ;40ms valeur point … l'init TRAIT_INIT EQU .60 ;120ms valeur trait … l'init POINT_VI_PU EQU .30 ;60ms valeur du point de la VI en Power Up TRAIT_VI_PU EQU .90 ;180ms valeur du trait de la Vi en Power Up ESPACE_VI_PU EQU POINT_VI_PU ; espace = point ESPACE_INIT EQU POINT_INIT ; espace = point TEMPS_100MS EQU .100 ;100ms pour les tempos … 0.1s prŠs VAL_10S EQU .100 ;valeur de 10s TEMPS_BP EQU .100 ;100 ms pour appui sur les BP TMAXTUNE EQU .200 ;20s max en ‚mission continue ; vecteur de reset org PIC84 goto Start ;vecteur d'IT org 4h btfsc INTCON,RTIF ;si IT timer goto IT_1ms ; aller … routine correspondante btfsc INTCON,RBIF ;sinon si IT port B goto IT_PortB ; aller … routine correspondante btfsc INTCON,INTF ;sinon si IT clef goto IT_Clef ; aller … routine correspondante retfie ;sinon retour IT_Clef bcf INTCON,INTF bsf ETAT_MANIP2,ARRET ; indique arrˆt m‚moire retfie ; retour IT_PortB movf Port_B,w ; clear mismatch andlw M_BP ; on ne prend en compte xorlw M_BP ; l'it que s'il ne sont pas tous btfss STATUS,Z ; relƒch‚s bsf ETAT_MANIP2,ARRET ; indique arrˆt m‚moire bcf INTCON,RBIF ; raz indicateur retfie ; retour ;*************************************************************** ;it temps r‚el de p‚riode 1ms (pour 4Mhz) ; 1) si TX==1 {toggle de SBUZ } sinon SBUZ <-0 ; 2) Pour chaque tempo active faire ; Si Tempo ‚chue alors indiquer d‚pass‚ ; Sinon ; D‚cr‚menter Compteur ; Si Compteur == 0 alors indiquer ‚chue ; Fsi ; FinPour ; 3) Gestion de la tempo de l'IT 100ms ;*************************************************************** IT_1ms bcf INTCON,RTIF ;RAZ indicateur IT timer ; sortie buzzer … 500 hz quand TX = 1 btfss ETAT_MANIP,TX ;si on ‚met goto RazBuz btfsc Port_A,SBUZ ; alors SBUZ <- /SUBZ goto RazBuz bsf Port_A,SBUZ goto IT_Tempo ;sinon RazBuz bcf Port_A,SBUZ ; SBUZ <- 0 IT_Tempo btfss ETAT_MANIP,IT2MS ;faut-il faire l'IT 2ms ? goto IT_TempoSuite IT_Tempo2ms bcf ETAT_MANIP,IT2MS ;oui, alors raz IT2MS btfss ETAT_TMP1,START ; et gestion tempo … 2ms goto IT_2msSui0 decfsz CMPT_TMP1,1 goto IT_2msSui0 bsf ETAT_TMP1,ECHUE bcf ETAT_TMP1,START IT_2msSui0 nop ;pour autre tempo goto IT_Tempo100 IT_TempoSuite bsf ETAT_MANIP,IT2MS ;indiquer IT2MS pour prochain tour ; cr‚ation d'une IT 100ms … partir de l'it 1ms IT_Tempo100 btfss ETAT_100MS,START ; gestion d'une IT 100 ms ? goto IT_1msFin decfsz CMPT_100MS,1 IT_1msFin retfie ;retour goto IT_100ms ;**************************************************************** ;* IT … 100ms pour la gestion des tempos longues : 0.1s … 25.5s * ;* … 0.1 seconde prŠs * ;**************************************************************** IT_100ms movlw TEMPS_100MS ; recharge le compteur 100ms movwf CMPT_100MS IT_100Tmp btfss ETAT_LONG,START goto IT_100msSui0 decfsz CMPT_LONG,1 goto IT_100msSui0 bsf ETAT_LONG,ECHUE bcf ETAT_LONG,START IT_100msSui0 nop ;pour autre tempo retfie ;******************************************************************** ; Programme principal ;******************************************************************** ;******************************************************************** ; initialisation g‚n‚rale ; programmation du registre OPTION au reset ; pull up du port B /RBPU = 0 ; INTEDG falling edge donc 0 ; RTCC clock interne RTS= 0 ; RTE xx ; PSA = 0 prescaler sur RTCC ; on veut une it timer overflow toutes les ms donc /4 pour 4mhz ; donc PS2/PS1/PS0 = 0/0/1 OPT_RES EQU B'00000001' Start movlw Reg_Opt movwf FSR movlw OPT_RES movwf 0 clrf RTCC ;RAZ RTCC et Prescaler ; toutes les sorties … z‚ro au reset clrf Port_A clrf Port_B ; programmation des directions des ports movlw TRISA movwf FSR movlw Tris_A movwf 0 movlw TRISB movwf FSR movlw Tris_B movwf 0 ; m…j des valeurs par d‚faut movlw ETAT_INIT movwf ETAT_MANIP movlw ETAT2_INIT movwf ETAT_MANIP2 movlw POINT_INIT movwf VAL_POINT movlw TRAIT_INIT movwf VAL_TRAIT movlw ESPACE_INIT movwf VAL_ESPACE clrf CMPT_SYMB ; initialisation de la VI et de la m‚moire 4 seulement si mise sous tension btfss STATUS,PD goto Init_Suite movlw POINT_VI_PU movwf VAL_POINT_VI movlw TRAIT_VI_PU movwf VAL_TRAIT_VI movlw ESPACE_VI_PU movwf VAL_ESPACE_VI movlw MEM_FIN movwf MEMOIRE_4 btfss Port_B,BP1 ; si BP1 enfonc‚ … la mise sous tension call InitEE ; alors init EE ; autorisation de l'IT timer Init_Suite bcf Port_B,PTT bcf ETAT_MANIP,TX clrf INTCON ;s‚curit‚ !! bsf INTCON,RTIE ; autorisation globale des IT bsf INTCON,GIE ; lancement des tempo … 100ms LANCE ETAT_100MS,CMPT_100MS,TEMPS_100MS ; Attent que les BP soit relƒch‚ pour continuer BP_Att0 movf Port_B,w ; attent que tous les BP andlw M_BP ; soit relƒch‚s xorlw M_BP btfss STATUS,Z goto BP_Att0 ; pour continuer ;************************************************************ ; teste si entr‚e en mode ENVI r‚glage de la VI btfsc Port_B,DIT goto Mode_Normal btfsc Port_B,DAH goto Mode_Normal ; indique mode entr‚e de VI ; TXOFF CW call TxOff movlw CW_V call PlayCar call TxOn ; TXON CW bsf ETAT_MANIP2,ENVI goto Main ;************************************************************ ;* dire 73 sur le buzzer uniquement * Mode_Normal btfsc ETAT_MANIP2,MOTDIF ;MOTDIF indique provisoirement call Version ;init de l'EEPROM bcf ETAT_MANIP2,MOTDIF call Dit73 ;************************************************************ ; boucle principale * ;************************************************************ ; m…j vitesse Main call Vitesse ; trait ou point rrf Port_B,w ; Attention tient compte de la place !! andlw 03h ; on ne conserve que DIT et DAH addwf PC ; Faire selon DAH | DIT goto Iambic ; 0 0 goto Trait ; 0 1 goto Point ; 1 0 goto Fonction_BP ; 1 1 Main0 call Memoire btfsc ETAT_MANIP,MEMO ; si mode entr‚e memoire goto Main ; alors pas de mise en veille bcf INTCON,GIE ; reprise directe aprŠs sleep bsf INTCON,INTE ; r‚veil autoris‚ sur Clef (INT/RB0) Main_blo bcf INTCON,RTIE ; r‚veil interdit par IT 1ms bsf INTCON,RBIE ; r‚veil autoris‚ par BP1,2,3,4 bcf INTCON,GIE ; reprise aprŠs sleep (dupliqu‚e pour Main_blo) sleep ; mise en veille (reprise en ligne) clrf INTCON ; plus besoin d'IT Clef ni d'IT Port_B bsf INTCON,RTIE ; r‚autorisation IT 1ms bsf INTCON,GIE ; r‚autorisation IT globale clrf CMPT_SYMB ; alors raz nb de symbole cons‚cutif goto Main ;************************************************************** ;* Fonction_BP : traitement des boutons poussoirs * ;* Attention : ce n'est pas un sous programme (appel par goto)* ;************************************************************** Fonction_BP bcf ETAT_MANIP,POIN movf Port_B,1 ; clear mismatch if any movf Port_B,w ; lire Port_B andlw M_BP ; conserve que les BP xorlw M_BP btfsc STATUS,Z goto Main0 ; retour si tous relƒch‚s ;* un des BP est … 0 alors on regarde si on est en mode entr‚e de m‚moire btfss ETAT_MANIP,MEMO goto Fonction_BP01 ;* si on appui sur un BP en mode MEMO alors ;* si MOT diff‚rent == 1 alors FIN mode MEMO (et joue F) ;* sinon s‚paration MOT (et 1 BIPBIP) btfss ETAT_MANIP2,MOTDIF goto Fonc_MotDiff bcf ETAT_MANIP,MEMO movlw ETAT2_RAZM andwf ETAT_MANIP2,1 ; TXOFF CW ; BUZ_ON CW call TxOff movlw CW_F call PlayCar ; TXON CW ; BUZ_MAJ CW call TxOn goto BP_Att Fonc_MotDiff bsf ETAT_MANIP2,MOTDIF call TxOff movlw CW_I call PlayCar call TxOn goto BP_Att ;* pas de mode MEMO et un des BP est … 0 alors on attend TEMPS_BP Fonction_BP01 LANCE ETAT_TMP1,CMPT_TMP1,TEMPS_BP Fonction_BP0 btfss ETAT_TMP1,ECHUE goto Fonction_BP0 ;* puis on lit de nouveau Port_B swapf Port_B,w ; andlw 0Fh ; w <- 0 | 0 | 0 | 0 |BP4|BP3|BP2|BP1 addwf PC ; saut en fonction de w ; ;BP4 BP3 BP2 BP1 Fonction goto PIC84 ; 0 0 0 0 Reset goto Fonction_ER ; 0 0 0 1 Non Impl‚ment‚e goto Fonction_VE ; 0 0 1 0 Version goto Fonction_TU ; 0 0 1 1 Tune goto Fonction_ER ; 0 1 0 0 Non Impl‚ment‚e goto Fonction_ER ; 0 1 0 1 Non Impl‚ment‚e goto Fonction_RV ; 0 1 1 0 Reverse goto Fonction_M4 ; 0 1 1 1 Joue/Enregistre M‚moire 4 goto Fonction_BA ; 1 0 0 0 Entr‚e/sortie mode balise goto Fonction_VI ; 1 0 0 1 Vitesse Impos‚e goto Fonction_BZ ; 1 0 1 0 Buzzer ON/OFF goto Fonction_M3 ; 1 0 1 1 M‚moire 3 goto Fonction_ER ; 1 1 0 0 Non Impl‚ment‚e goto Fonction_M2 ; 1 1 0 1 M‚moire 2 goto Fonction_M1 ; 1 1 1 0 M‚moire 1 goto BP_Att ; 1 1 1 1 Appui < TEMPS_BP Fonction_VI call Mode_VI goto BP_Att Fonction_TU call Tune goto BP_Att Fonction_BZ call Buzzer goto BP_Att Fonction_ER call Erreur goto BP_Att Fonction_RV call Reverse goto BP_Att Fonction_VE call Version goto BP_Att Fonction_M1 call MemoireEE1 goto BP_Att Fonction_M2 call MemoireEE2 goto BP_Att Fonction_M3 call MemoireEE3 goto BP_Att Fonction_M4 call Memoire4 goto BP_Att Fonction_BA call Balise ; goto BP_Att BP_Att movf Port_B,w ; attent que tous les BP andlw M_BP ; soit relƒch‚s xorlw M_BP btfss STATUS,Z goto BP_Att goto Main0 ; pour retourner ;************************************************************** ;* Fait un point si pas reverse Point incfsz CMPT_SYMB ;compte nb point + trait goto Point1 ; si < 255 ok goto Main_blo ; sinon blocage et interdiction r‚veil par clef Point1 bsf Port_B,PTT ;PTT bsf ETAT_MANIP,TX ;indiquer TX bsf ETAT_MANIP,POIN ; on fait un point bcf ETAT_MANIP,IAMB ; pas de trait aprŠs a priori EMET VAL_POINT ; lancer tempo point btfsc ETAT_MANIP,REV ; si on est en reverse goto Point_rev bcf STATUS,C ; rlf MEM_TEMP ; indique point en memoire temporaire goto Att_finP Point_rev bsf STATUS,C rlf MEM_TEMP Att_finP btfss Port_B,DAH ;appui sur trait ? bsf ETAT_MANIP,IAMB ;si oui alors indiquer Iambic btfss ETAT_TMP1,ECHUE ;point fini ? goto Att_finP ;non, on attend bcf Port_B,PTT ;oui, PTT <- 0 bcf ETAT_MANIP,TX ;TX <- 0 EMET VAL_ESPACE ;lancer tempo espace Att_finP1 btfss Port_B,DAH ;appui sur trait ? bsf ETAT_MANIP,IAMB ;si oui alors indiquer Iambic btfss ETAT_TMP1,ECHUE ;espace fini ? goto Att_finP1 ;non, on attend btfsc ETAT_MANIP,IAMB ;oui, alors Iambic ? goto Iambic ;oui on va le faire goto Main ;non on retourne Trait incfsz CMPT_SYMB ;compte nb point + trait goto Trait1 ; si < 255 ok goto Main_blo ; sinon blocage et interdiction r‚veil par clef Trait1 bsf Port_B,PTT ; cf commentaire de Point bsf ETAT_MANIP,TX bcf ETAT_MANIP,POIN bcf ETAT_MANIP,IAMB EMET VAL_TRAIT btfsc ETAT_MANIP,REV ; si on est en reverse goto Trait_rev bsf STATUS,C ; rlf MEM_TEMP ; indique trait en memoire temporaire goto Att_finT Trait_rev bcf STATUS,C rlf MEM_TEMP ;indique trait en m‚moire temporaire Att_finT btfss Port_B,DIT bsf ETAT_MANIP,IAMB btfss ETAT_TMP1,ECHUE goto Att_finT bcf Port_B,PTT bcf ETAT_MANIP,TX EMET VAL_ESPACE Att_finT1 btfss Port_B,DIT bsf ETAT_MANIP,IAMB btfss ETAT_TMP1,ECHUE goto Att_finT1 btfsc ETAT_MANIP,IAMB goto Iambic goto Main Iambic btfss ETAT_MANIP,POIN ;vient-on de faire un point ? goto Point ;non, alors on fait un point. goto Trait ;oui, alors on fait un trait. ;************************************************************** ;* Vitesse : proc‚dure de mise … jour de la vitesse * ;* Arret de l'it RTCC * ;* svg de valeur de RTCC+N dans TEMP_REG (N … voir) * ;* Mettre port_A en HIZ (sauf SBUZ) * ;* Port_A <- 00110 (/DIS,RM,RC) * ;* OPTION <- 00101000 RTCC inc sur transition 0->1 de RA4 * ;* D‚charger la capa : * ;* Programmer DIS en sortie * ;* Mettre DIS … 0 * ;* Attendre environ 1ms * ;* Remettre DIS en HIZ * ;* Activer RM * ;* Mesurer le temps : incr‚menter cpt tant que rtcc==0 * ;* Svg de la valeur mesur‚e TM * ;* Mettre port_A en HIZ (sauf SBUZ) * ;* D‚charger la capa : * ;* Activer RC * ;* Mesurer le temps : incr‚menter cpt tant que rtcc==0 * ;* Svg de la valeur mesur‚e TC * ;* Mettre port_A en HIZ (sauf SBUZ) * ;* Calculer TC'=TC*RM/TM * ;* Valeur trait <- TC' * ;* Valeur point <- TC'/3 * ;* Valeur espace <- Valeur point * ;* Si REV alors inverser valeur trait et point * ;* Remettre OPTION … la valeur initiale * ;* RTCC <- TEMP_REG * ;* R‚autoriser l'it RTCC * ;************************************************************** ; Port_A RA4/RTCC RA3 RA2 RA1 RA0 ; Etat E S S S S ; Tris_A 1 1 0 1 0 ;01Ah ; Nom CPTM DIS SC RM SBUZ ;* Arret de l'it RTCC Vitesse btfsc ETAT_MANIP2,VI ;ne rien faire si mode VI retlw 1 ; btfsc ETAT_MANIP,MEMO ;ne rien faire si mode MEMO ; retlw 1 bcf INTCON,RTIE ;* svg de valeur de RTCC+N dans TEMP_REG (N … voir) ;* Mettre port_A en HIZ (sauf SBUZ et SC) movlw TRISA movwf FSR movlw Tris_A movwf 0 ;* Port_A <- 00X10 (/DIS,SC,RM,SBUZ) ; movlw B'00000110' ; movwf Port_A movf Port_A,w ; lire Port_A iorlw B'00000010' ; mettre RM … 1 andlw B'11100111' ; mettre CPTM et DIS … 0 movwf Port_A ; m…j Port_A ;* OPTION <- 00101000 RTCC inc sur transition 0->1 de RA4 * movlw Reg_Opt movwf FSR movlw B'00101000' movwf 0 ;* D‚charger la capa : * ;* Programmer DIS en sortie * ;* Mettre DIS … 0 * movlw TRISA movwf FSR bcf 0,DIS ;* Attendre environ 1ms (3w+2) +2 =769æs * movlw 0FFh movwf TEMP_REG V_loop1 decfsz TEMP_REG goto V_loop1 ;* Remettre DIS en HIZ * bsf 0,DIS ;* Activer RM * clrf TEMP_REG clrf RTCC bcf 0,RM ;* Mesurer le temps : incr‚menter cpt tant que rtcc==0 * V_time1 incf TEMP_REG btfss RTCC,0 goto V_time1 ;* Svg de la valeur mesur‚e TM * ;* Mettre port_A en HIZ (sauf SBUZ) * movlw Tris_A movwf 0 ;* D‚charger la capa : * ;* Activer RC * ;* Mesurer le temps : incr‚menter cpt tant que rtcc==0 * ;* Svg de la valeur mesur‚e TC * ;* Mettre port_A en HIZ (sauf SBUZ) * ;* Calculer TC'=TC*RM/TM * ;* Valeur trait <- TC' * ;* Valeur point <- TC'/3 * ;* Valeur espace <- Valeur point * movf TEMP_REG,w movwf VAL_TRAIT movf TEMP_REG,w movwf ACCB0 movlw 3 movwf BARGB0 call FXD0808U movf ACCB0,w movwf VAL_POINT movwf VAL_ESPACE ;* Si ENVI alors m…j de la VI btfss ETAT_MANIP2,ENVI goto Vit_suite0 movf VAL_TRAIT,w ; la VI est toujours movwf VAL_TRAIT_VI ; m‚moris‚e avec movf VAL_POINT,w ; POINT < TRAIT movwf VAL_POINT_VI ; le mode REV est pris movf VAL_ESPACE,w ; en compte dans Mode_VI movwf VAL_ESPACE_VI ;* Si REV alors inverser valeur trait et point * Vit_suite0 btfss ETAT_MANIP,REV goto Vit_Suite movf VAL_TRAIT,w movwf TEMP_REG ;TEMP_REG <- VAL_TRAIT movf VAL_POINT,w movwf VAL_TRAIT ;VAL_TRAIT <- VAL_POINT movf TEMP_REG,w movwf VAL_POINT ;VAL_POINT <- TEMP_REG ;* Remettre OPTION … la valeur initiale * Vit_Suite movlw Reg_Opt movwf FSR movlw OPT_RES movwf 0 clrf RTCC ;RAZ RTCC et Prescaler ;* Remettre le BUZER selon ‚tat initial BUZ_MAJ CW ;* RTCC <- TEMP_REG * ;* R‚autoriser l'it RTCC * bsf INTCON,RTIE retlw 0 ;************************************************************** ;* Tune : Passe en ‚mission et s'arrŠte si on touche … la clef* ;* ou si on appui sur un des BP ou aprŠs 20s * ;************************************************************** Tune LANCE ETAT_TMP1,CMPT_TMP1,.200 ; 200ms d'attente pour BP Tune_Att btfss ETAT_TMP1,ECHUE goto Tune_Att LANCE ETAT_LONG,CMPT_LONG,TMAXTUNE ; max 25 s en mode tune BUZ_ON CW movlw CW_T call PlayCar bsf Port_B,PTT Tune1 btfss Port_B,DIT goto Tune0 btfss Port_B,DAH goto Tune0 btfss Port_B,BP1 goto Tune0 btfss Port_B,BP2 goto Tune0 btfss Port_B,BP3 goto Tune0 btfss Port_B,BP4 goto Tune0 btfsc ETAT_LONG,ECHUE goto Tune0Err goto Tune1 Tune0Err TXOFF CW movlw CW_ERREUR ; indique ERREUR car temps d‚pass‚ call PlayCar Tune0 bcf Port_B,PTT call TxOn ; BUZ_MAJ CW ; TXON CW retlw 0 ;************************************************************* ;* Reverse : inverse point et trait * ;* Echange la valeur des tempos point et trait * ;* Toggle de REV dans ETAT_MANIP * ;************************************************************* Reverse call TxOff ; TXOFF CW ; BUZ_ON CW movlw CW_R call PlayCar movlw CW_V call PlayCar call TxOn ; TXON CW ; BUZ_MAJ CW movf VAL_TRAIT,w movwf TEMP_REG ;TEMP_REG <- VAL_TRAIT movf VAL_POINT,w movwf VAL_TRAIT ;VAL_TRAIT <- VAL_POINT movf TEMP_REG,w movwf VAL_POINT ;VAL_POINT <- TEMP_REG btfsc ETAT_MANIP,REV ; inversion de REV goto Reverse0 bsf ETAT_MANIP,REV retlw 0 Reverse0 bcf ETAT_MANIP,REV retlw 0 ;************************************************************* ;* Mode Vitesse Impos‚e * ;************************************************************* Mode_VI btfss ETAT_MANIP2,ENVI ;si entr‚e de vitesse impos‚e goto Mode_VI0 bcf ETAT_MANIP2,ENVI ;alors, fin entr‚e de vitesse impos‚e ; BUZ_ON CW ; TXOFF CW call TxOff movlw CW_V ; joue V call PlayCar LANCE ETAT_LONG,CMPT_LONG,.5 Mode_VI1 btfss ETAT_LONG,ECHUE ; attend 1/2 seconde goto Mode_VI1 goto PIC84 ; et Reset Mode_VI0 btfss ETAT_MANIP2,VI ;si mode VI d‚j… Actif goto Mode_VI2 bcf ETAT_MANIP2,VI ; alors mode VI inactif call Vitesse ; passage … la vitesse du Potar btfsc ETAT_MANIP,FONC ; retour sans jouer N si retlw 0 ; appel par un m‚moire call TxOff movlw CW_N ; joue N goto Seq_Gene ; gain de place !!! ; call PlayCar ; call TxOn ; retlw 0 ; et retour Mode_VI2 bsf ETAT_MANIP2,VI ; sinon indiquer mode VI actif movf VAL_TRAIT_VI,w movwf VAL_TRAIT movf VAL_POINT_VI,w movwf VAL_POINT ; vitesse <- vitesse VI movf VAL_ESPACE_VI,w movwf VAL_ESPACE ;* Si REV alors inverser valeur trait et point * btfss ETAT_MANIP,REV goto Mode_VI3 movf VAL_TRAIT,w movwf TEMP_REG ;TEMP_REG <- VAL_TRAIT movf VAL_POINT,w movwf VAL_TRAIT ;VAL_TRAIT <- VAL_POINT movf TEMP_REG,w movwf VAL_POINT ;VAL_POINT <- TEMP_REG Mode_VI3 btfsc ETAT_MANIP,FONC retlw 0 ; retour sans jouer D si appel par m‚moire call TxOff movlw CW_D ; joue D goto Seq_Gene ; gain de place !!! ; call PlayCar ; call TxOn ; retlw 0 ; et retour ;************************************************************* ;* Buzzer : toggle buzzer actif/inactif * ;************************************************************* Buzzer btfsc ETAT_MANIP,MBUZ ; inversion de MBUZ goto Buzzer0 bsf ETAT_MANIP,MBUZ goto Buzzer1 Buzzer0 bcf ETAT_MANIP,MBUZ Buzzer1 call TxOff ;BUZ_ON CW ;active le buzzer ; TXOFF CW ;pas d'‚mission movlw CW_M goto Seq_Gene ; gain de place !!! ; call PlayCar ;joue 'M' ; call TxOn ; TXON CW ;‚mission autoris‚e ; BUZ_MAJ CW ;met le buzzer selon MBUZ retlw 0 ;********************************************************************************************** ; 8/8 Bit Unsigned Fixed Point Divide 8/8 -> 08.08 ; Input: 8 bit unsigned fixed point dividend in AARGB0 ; 8 bit unsigned fixed point divisor in BARGB0 ; Use: CALL FXD0808U ; Output: 8 bit unsigned fixed point quotient in AARGB0 ; 8 bit unsigned fixed point remainder in REMB0 ; Result: AARG, REM <-- AARG / BARG ; Max Timing: 1+97+2 = 100 clks ; Min Timing: 1+89+2 = 92 clks ; PM: 1+13+1 = 15 DM: 4 FXD0808U CLRF REMB0 UDIV0808L RETLW 0x00 ;*************************************************************************** ;* Fonction : PlayPoint : emet un point … la vitesse courante ; suivi d'un espace (emet un trait en REV) ;*************************************************************************** PlayPoint bsf Port_B,PTT ;Tx bsf ETAT_MANIP,TX bsf ETAT_MANIP,POIN EMET VAL_POINT PlayPoint0 btfss ETAT_TMP1,ECHUE goto PlayPoint0 bcf Port_B,PTT bcf ETAT_MANIP,TX call PlayEspace retlw 0 ;*************************************************************************** ;* Fonction : PlayTrait : emet un trait … la vitesse courante ; suivi d'un espace (emet un point en REV) ;*************************************************************************** PlayTrait bsf Port_B,PTT ;Tx bsf ETAT_MANIP,TX bcf ETAT_MANIP,POIN EMET VAL_TRAIT PlayTrait0 btfss ETAT_TMP1,ECHUE goto PlayTrait0 bcf Port_B,PTT bcf ETAT_MANIP,TX call PlayEspace retlw 0 ;*************************************************************************** ;* Fonction : PlayEspace : Attend la dur‚e d'un espace … la vitesse courante ;*************************************************************************** PlayEspace EMET VAL_ESPACE PlayEspace0 btfss ETAT_TMP1,ECHUE goto PlayEspace0 retlw 0 ;*************************************************************************** ;* Fonction : PlayCar : Joue un caractŠre Morse Max :6 moments * ;* Puis attend la s‚paration MOT (3espace) ou LETTRE (2espace) * ;* Description d'un caractŠre : Exemple 'D' * * ; B7 B6 B5 B4 B3 B2 B1 B0 * ; | MOT | 1 | 1 | 1 | 0 | 1 | 0 | 0 * ; MOT indique qu'il faut jouer une s‚paration de mot aprŠs le caractŠre * ;* B6,B5,B4 non significatif parce qu'… 1 * ;* B3 … 0 pour indiquer que B2 est significatif * ;* B2,B1,B0 … 1 pour trait … 0 pour point donc -.. = K * ;* B2 premier moment, B0 dernier moment * ;* Exemple lettre min 'E' * ; B7 B6 B5 B4 B3 B2 B1 B0 * ; | MOT | 1 | 1 | 1 | 1 | 1 | 0 | 0 * ;* Exemple lettre max ''' Apostrophe * ; B7 B6 B5 B4 B3 B2 B1 B0 * ; | MOT | 0 | 0 | 1 | 1 | 1 | 1 | 0 * ; Exemple '/' * ; B7 B6 B5 B4 B3 B2 B1 B0 * ; | MOT | 1 | 0 | 1 | 0 | 0 | 1 | 0 * ;* * ;* Utilisation : mot … jouer dans w (fin si W==0FFH) * ;* Retourne 1 si fin 0 sinon * ;* RAM : 3 registres : TEMP_REG, TEMP_REG2 et LOOPCOUNT * ;*************************************************************************** MOT EQU 7 PlayCar movwf TEMP_REG ;sauvegarde du caractŠre … jouer movwf TEMP_REG2 xorlw 0FFh ;teste fin btfsc STATUS,Z retlw 1 ;retour avec 1 si fin movlw 7 movwf LOOPCOUNT ;LOOPCOUNT <- 7 rlf TEMP_REG,1 ;Cy <- MOT PlayCar0 decfsz LOOPCOUNT ; par s‚curit‚, goto PlayCar01 ; on retourne si LOOPCOUNT vaut 0 retlw 1 ; (c'est … dire :il n'a pas de 0) PlayCar01 rlf TEMP_REG,1 ;Cy <- B7 btfsc STATUS,C ;Recherche du premier '0' goto PlayCar0 btfsc ETAT_MANIP,REV ; si reverse comf TEMP_REG ; alors inversion point/trait PlayCar3 rlf TEMP_REG,1 ;Cy <- Trait ou Point btfss STATUS,C goto PlayCar1 call PlayTrait ;Cy == 1 donc Trait goto PlayCar2 PlayCar1 call PlayPoint ;Cy == 0 donc Point PlayCar2 decfsz LOOPCOUNT ;dernier ? goto PlayCar3 ;non, alors prochain moment call PlayEspace ;oui, alors espace de s‚paration lettre btfss TEMP_REG2,MOT retlw 0 ;retour si mˆme mot Play_Esp_Mot call PlayEspace ;3 espaces supl‚mentaires si MOT diff call PlayEspace call PlayEspace retlw 0 ;************************************************************************ ;* Erreur : Joue un signe d'erreur … la vitesse courante * ;************************************************************************ Erreur call TxOff movlw CW_ERREUR Seq_Gene call PlayCar ; cette s‚quence call TxOn ; ce repŠte souvent retlw 0 ; elle est utilis‚ par goto Seq_Gene ;********************************************************************** ;* Fonctions de mise en route et arrˆt du buzzer * ;********************************************************************** TxOff TXOFF CW BUZ_ON CW retlw 0 TxOn TXON CW BUZ_MAJ CW retlw 0 ;********************************************************************** ;* Memoire : cette fonction effectue la m‚morisation des caractŠres * ;* dans la m‚moire dont le bit est positionn‚ dans ETAT_MANIP2 et * ;* lorsque MEMO est … 1 dans ETAT_MANIP * ;* Pour l'instant M4 uniquement * ;* Entr‚e : MEM_TEMP,CMPT_SYMB * ;* Sortie : ;********************************************************************** Memoire btfss ETAT_MANIP,MEMO ; si pas entr‚e de memoire retlw 0 ; ne rien faire Mem_conv movlw 0FEh ; sinon subwf MEM_TEMP,w ; on attend que MEM_TEMP != 0FEh btfsc STATUS,Z retlw 0 ; retourne si MEM_TEMP == 0FEh ; ici on a tap‚ sur la clef btfss ETAT_MANIP2,M4 ;est-ce la m‚moire 4 ? goto MemoireEE ; Enregistrement de la m‚moire RAM 4 movf MEM_PTR,w movwf FSR ; FSR pointe memoire courante bcf MEM_TEMP,7 ; RAZ du bit mot diff‚rent movf MEM_TEMP,w movwf 0 ; mem courante <- MEM_TEMP btfss ETAT_MANIP2,MOTDIF ; Si MOT Diff‚rent goto Memoire0 decf FSR ; on pointe la case pr‚cedente bsf 0,7 ; on indique mot diff‚rent incf FSR ; on repointe la case actuelle bcf ETAT_MANIP2,MOTDIF ; RAZ mot diff‚rent Memoire0 incf FSR ; Fsi; on pointe la case suivante movlw MEM_FIN movwf 0 ; et on y indique fin de memoire movlw 0feh ; recharge MEM_TEMP … la valeur movwf MEM_TEMP ; initiale clrf CMPT_SYMB ;RAZ compteur de symbole incf MEM_PTR ; passage case suivante movlw MAXMEM4 ; et teste fin subwf MEM_PTR,w ;w <- MEM_PTR - MAXMEM4 Memoire1 btfss STATUS,Z retlw 0 ;retour car fin non atteinte bcf ETAT_MANIP,MEMO ; MEMO <- 0 bcf ETAT_MANIP2,M4 ; M4 <- 0 movlw CW_F ; joue 'f' call PlayCar ; car fin atteinte ; call Erreur retlw 1 ; retour avec fin atteinte ; enregistrement des m‚moires EEPROM MemoireEE bcf MEM_TEMP,7 ; raz du bit mot diff‚rent movf MEM_TEMP,w call WriteEE ; ‚criture en EEPROM btfsc ETAT_MANIP2,MOTDIF ; Si MOT Diff‚rent call Mem_EE_dif ; appeler fonction sp‚ciale incf MEM_PTR movlw MEM_FIN ;indique fin … la case suivante call WriteEE movlw 0feh ; recharge MEM_TEMP … la valeur movwf MEM_TEMP ; initiale clrf CMPT_SYMB ;RAZ compteur de symbole bcf ETAT_MANIP2,DEBUT ; plus le d‚but movf MAX_MEM,w subwf MEM_PTR,w goto Memoire1 ;‚conomie m‚moire !! Mem_EE_dif bcf ETAT_MANIP2,MOTDIF btfsc ETAT_MANIP2,DEBUT ; si d‚but ne rien faire retlw 0 decf MEM_PTR ;sinon call ReadEE ; lire adresse pr‚c‚dente bsf EEDATA,7 ; indiquer mot diff‚rent movf EEDATA,w call WriteEE ; r‚‚crire incf MEM_PTR ; m…j pointeur retlw 0 ;retour ;********************************************************************** ;* Memoire4 : cette fonction joue la memoire 4 jusqu'… rencontrer le * ;* signe MEM_FIN ou place le manip en mode MEMO * ;* * ;********************************************************************** Memoire4 LANCE ETAT_LONG,CMPT_LONG,.10 ; lance tempo de 1s ; bcf ETAT_MANIP2,ARRET Memoire40 btfsc ETAT_LONG,ECHUE ; si tempo ‚chue goto Memoire42 ; alors entr‚e M4 btfsc Port_B,BP4 ; sinon si BP4 relach‚ goto Memoire41 ; jouer M4 goto Memoire40 ; sinon retester tempo ; entr‚e Memoire 4 Memoire42 bsf ETAT_MANIP,MEMO ; entr‚e Memoire MEMO <- 1 bsf ETAT_MANIP2,M4 ; M4 <- 1 movlw MEMOIRE_4 movwf MEM_PTR ; init pointeur memoire movlw 0FEh movwf MEM_TEMP ; init memoire temporaire call TxOff ; TXOFF CW ; BUZ_ON CW movlw CW_4 goto Seq_Gene ; pour gagner place ; call PlayCar ; indique entr‚e M4 ; TXON CW ; BUZ_MAJ CW ; call TxOn ; retlw 0 ; pas d'‚mission et Buz ON ; joue Memoire 4 Memoire41 nop bcf ETAT_MANIP2,ARRET ; bsf INTCON,INTE ;autorise IT clef ; bsf INTCON,RBIE ;autorise IT BP movlw MEMOIRE_4 ; joue memoire 4 movwf FSR ; f0 pointe MEMOIRE_4 Memoire4_lp movf 0,w ; w <- f0 call PlayCar ; joue w et retourne 1 si fin sublw 1 ; w <- 1-w btfsc STATUS,Z goto Memoire4_fin ; fin si w==1 btfsc ETAT_MANIP2,ARRET goto Memoire4_fin movf Port_B,w ; lit Port_B andlw 0F6h ; raz PTT et RB0 xorlw 0F6h btfss STATUS,Z goto Memoire4_fin ; arret si une entr‚e … 0 incf FSR ; FSR++ f0 pointe case suivante goto Memoire4_lp ; joue prochain caractŠre Memoire4_fin nop ; bcf INTCON,INTE ; bcf INTCON,RBIE retlw 0 ;************************************************************************ ;* Fonction : BipBip : Fait BipBip dans le buzzer … la vitesse courante * ;************************************************************************ ;BipBip TXOFF CW ; BUZ_ON CW ; movlw CW_I ; call PlayCar ; TXON CW ; BUZ_MAJ CW ; retlw 0 ;************************************************************************ ;* Fonction : Version : Joue la version du manip … la vitesse courante * ;************************************************************************ Version call TxOff ; TXOFF CW ; BUZ_ON CW movlw CW_F call PlayCar movlw CW_5 call PlayCar movlw CW_O call PlayCar movlw CW_W call PlayCar movlw CW_L+MOT_DIFF call PlayCar movlw CW_V call PlayCar movlw CW_1 call PlayCar movlw CW_POINT call PlayCar movlw CW_2 ; call PlayCar ; movlw CW_4 call PlayCar ; TXON CW ; BUZ_MAJ CW call TxOn retlw 0 ;* Dit73 est une fonction pour r‚duire le code avant Fonction_BP Dit73 call TxOff ; TXOFF CW movlw CW_7 call PlayCar movlw CW_3 call PlayCar call TxOn ; TXON CW retlw 0 ;************************************************************** ;* Entr‚e/sortie du mode balise * ;************************************************************** Balise call TxOff btfsc ETAT_MANIP2,BALI ;mode balise actif ? goto Balise0 bsf ETAT_MANIP2,BALI ;non, alors balise <- actif movlw CW_B ; jouer "B" goto BaliseFin Balise0 bcf ETAT_MANIP2,BALI ;oui, alors balise <- inactif movlw CW_N ; jouer "N" BaliseFin call PlayCar call TxOn retlw 0 ; retour ;************************************************************** ;* WriteEE : ‚crit w … la l'adresse EEPROM contenue ds MEM_PTR* ;* MEM_PTR n'est pas modifi‚ , w est modifi‚ ;************************************************************** WriteEE movwf EEDATA ; movf MEM_PTR,w movwf EEADR bcf INTCON,GIE ; interdiction IT bsf STATUS,RP0 ; adressage direct de 80h … FFh bcf EECON1,EEIF ; raz ‚criture termin‚e bsf EECON1,WREN ; autorisation ‚criture EE movlw 055h ; s‚quence d'‚criture movwf EECON2 movlw 0AAh movwf EECON2 bsf EECON1,WR ; d‚marre ‚criture EEPROM WriteEE0 btfss EECON1,EEIF ; attend fin ‚criture goto WriteEE0 bcf STATUS,RP0 ; adressage direct en page 0 bsf INTCON,GIE ; autorisation IT retlw 0 ;**************************************************************** ;* ReadEE : lit dans EEDATA l'adresse EEPROM contenue ds MEM_PTR* ;* MEM_PTR n'est pas modifi‚ ;**************************************************************** ReadEE movf MEM_PTR,w movwf EEADR bsf STATUS,RP0 ; adressage direct de 80h … FFh bsf EECON1,RD ; ordre de lecture bcf STATUS,RP0 ; adressage direct en page 0 retlw 0 ;************************************************************* ;* InitEE : appel‚e si BP1 est enfonc‚ … la mise sous tension* ;* EE61=00,EE62=36,EE63=50,EE00=E35=EE49=EE60=MEM_FIN * ;************************************************************* ;D‚finition M‚moire : DEB_M1 EQU .0 ;d‚but des m‚moires DEB_M2 EQU .31 ; M1 30 caractŠres, M2 16 caractŠres, M3 12 caractŠres DEB_M3 EQU .48 MAX_M1 EQU .30 ;Fin des m‚moires MAX_M2 EQU .47 MAX_M3 EQU .60 PTR_M1 EQU .61 ; Mini FAT PTR_M2 EQU .62 PTR_M3 EQU .63 MAX_M1_B EQU MAX_M3 ; fin de M1 en mode balise InitEE movlw PTR_M1 ; init du pointeur de M1 movwf MEM_PTR ;adresse movlw DEB_M1 ;valeur call WriteEE ;‚criture movlw DEB_M1 ;init de la fin de M1 movwf MEM_PTR ;pointe le d‚but de M1 movlw CW_1 ;indique Version dans M1 call WriteEE ; incf MEM_PTR movlw CW_2 call WriteEE incf MEM_PTR movlw MEM_FIN ;y indique MEM_FIN call WriteEE movlw PTR_M2 ; init du pointeur de M2 movwf MEM_PTR ;adresse movlw DEB_M2 ;valeur call WriteEE ;‚criture movlw DEB_M2 ; init de la fin de M2 movwf MEM_PTR ;pointe le d‚but de M2 movlw MEM_FIN ;y indique MEM_FIN call WriteEE movlw PTR_M3 ; init du pointeur de M3 movwf MEM_PTR ;adresse movlw DEB_M3 ;valeur call WriteEE ;‚criture movlw DEB_M3 ; init de la fin de M3 movwf MEM_PTR ;pointe le d‚but de M3 movlw MEM_FIN ;y indique MEM_FIN call WriteEE bsf ETAT_MANIP2,MOTDIF ; indique init EEPROM retlw 0 ;******************************************************* ;* MemoireEE : Joue ou enregistre les M‚moires EEPROM * ;* selon le point d'entr‚e * ;* utilise MAX_MEM * ;******************************************************* MemoireEE1 movlw PTR_M1 ;lit le pointeur de M1 movwf MEM_PTR call ReadEE movf EEDATA,w movwf MEM_PTR ;et maj MEM_PTR movlw MAX_M1 btfsc ETAT_MANIP2,BALI ; met max balise si mode balise movlw MAX_M1_B movwf MAX_MEM ;et maj valeur Max movlw CW_1 movwf MEM_TEMP goto Mem_EE_Att MemoireEE2 movlw PTR_M2 ;lit le pointeur de M2 movwf MEM_PTR call ReadEE movf EEDATA,w movwf MEM_PTR ;et maj MEM_PTR movlw MAX_M2 ; movwf MAX_MEM ;et maj valeur Max movlw CW_2 movwf MEM_TEMP goto Mem_EE_Att MemoireEE3 movlw PTR_M3 ;lit le pointeur de M3 movwf MEM_PTR call ReadEE movf EEDATA,w movwf MEM_PTR ;et maj MEM_PTR movlw MAX_M3 ; movwf MAX_MEM ;et maj valeur Max movlw CW_3 movwf MEM_TEMP Mem_EE_Att LANCE ETAT_LONG,CMPT_LONG,.10 ; lance tempo de 1s Mem_EE_Att0 btfsc ETAT_LONG,ECHUE ; si tempo ‚chue goto Mem_EE_En ; alors entr‚e Memoire movf Port_B,w ; sinon andlw M_BP ; si BP relƒch‚s xorlw M_BP btfsc STATUS,Z goto Mem_EE_Play ; jouer Memoire EE goto Mem_EE_Att0 ; sinon retester tempo Mem_EE_En bsf ETAT_MANIP,MEMO ; entr‚e Memoire MEMO <- 1 TXOFF CW BUZ_ON CW movf MEM_TEMP,w call PlayCar ; indique entr‚e M nø(MEM_TEMP) TXON CW BUZ_MAJ CW movlw 0FEh movwf MEM_TEMP ; init memoire temporaire bsf ETAT_MANIP2,DEBUT ; indiquer le d‚but retlw 0 Mem_EE_Play bcf ETAT_MANIP2,ARRET bsf ETAT_MANIP2,DEBUT ; indique premier caractŠre lu bsf ETAT_MANIP,FONC ;indique qu'on ex‚cute une fonction clrf MAX_MEM ;MAX_MEM utilis‚ pour m‚moriser nb de caractŠres Mem_EE_Play0 call ReadEE ; EEDATA <- EE[MEMPTR] movlw CW_BARRE ; si '/' alors subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd ; interpr‚tation des commandes bcf ETAT_MANIP2,DEBUT ; raz 1er car movf EEDATA,w Mem_EE_Play1 call PlayCar ; joue w et retourne 1 si fin sublw 1 ; w <- 1-w btfsc STATUS,Z goto Mem_EE_Fin ;fin lecture si 1 bsf INTCON,INTE ;autorise IT clef bsf INTCON,RBIE ;autorise IT BP btfsc ETAT_MANIP2,ARRET goto Mem_EE_Fin incf MEM_PTR ; pointe case suivante incf MAX_MEM ; m…j nb de caractŠres jou‚s call Vitesse ; m…j vitesse goto Mem_EE_Play0 ; joue prochain caractŠre Mem_EE_Fin bcf INTCON,INTE bcf INTCON,RBIE bcf ETAT_MANIP,FONC retlw 0 Mem_Cmd decf MEM_PTR ; pointer case pr‚c‚dente call ReadEE ; lire lettre pr‚cedente incf MEM_PTR ; repointe case courante btfsc EEDATA,7 ; si bit 7 == 0 goto Mem_Cmd_0 btfsc ETAT_MANIP2,DEBUT ; si "/" au premier caractŠre goto Mem_Cmd_0 ; c'est une commande movlw CW_BARRE ; jouer Barre de fraction goto Mem_EE_Play1 ; sinon il s'agit d'une commande ; D‚codage des commandes Mem_Cmd_0 incf MEM_PTR ; lire la commande incf MAX_MEM call ReadEE btfsc ETAT_MANIP2,DEBUT ; cmd /B interdite au d‚but !! goto Mem_Cmd_Call movlw CW_B ; si 'B' alors subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_Call ; (sinon on regarde si cmd call) incf MEM_PTR ; on regarde le temps incf MAX_MEM call ReadEE movlw CW_0 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B0 movlw CW_1 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B1 movlw CW_2 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B2 movlw CW_3 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B3 movlw CW_5 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B5 movlw CW_8 subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_B8 movlw CW_L subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_BL movlw CW_M subwf EEDATA,w btfsc STATUS,Z goto Mem_Cmd_BM goto Mem_Cmd_Err Mem_Cmd_B1 movlw .10 ; B1 = 1s goto Mem_Cmd_ttp Mem_Cmd_B2 movlw .20 ; B2 = 2s goto Mem_Cmd_ttp Mem_Cmd_B3 movlw .30 ; B3 = 3s goto Mem_Cmd_ttp Mem_Cmd_B5 movlw .50 ; B5 = 5s goto Mem_Cmd_ttp Mem_Cmd_B8 movlw .80 ; B8 = 8s goto Mem_Cmd_ttp Mem_Cmd_BL movlw .120 ; BL = 12s goto Mem_Cmd_ttp Mem_Cmd_BM movlw .250 ; BM = 25s goto Mem_Cmd_ttp Mem_Cmd_ttp clrf ETAT_LONG ; d‚marrage tempo movwf CMPT_LONG bsf ETAT_LONG,START Mem_Cmd_Att btfsc ETAT_MANIP2,ARRET goto Mem_EE_Fin btfss ETAT_LONG,ECHUE goto Mem_Cmd_Att Mem_Cmd_B0 movf MAX_MEM,w ; B0 bouclage imm‚diat subwf MEM_PTR,1 goto Mem_EE_Play Mem_Cmd_Call bcf ETAT_MANIP2,DEBUT ; raz indication 1er car movlw CW_C ; si 'C' alors bcf EEDATA,7 ; bit de mot_diff sans importance subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_Tun ; (sinon on regarde si c'est tune) call Memoire41 ; joue M4 btfsc ETAT_MANIP2,ARRET ; teste si fin demand‚e pendant goto Mem_EE_Fin ; lecture memoire 4 Mem_Car_Next bsf INTCON,RTIE ; r‚autorise IT bsf INTCON,RBIE call Play_Esp_Mot ; attend temps espace mot incf MAX_MEM ; pointe caractŠre suivant incf MEM_PTR goto Mem_EE_Play0 ; puis joue caractŠre suivant Mem_Cmd_Tun movlw CW_T ; si 'T' alors bcf EEDATA,7 ; bit de mot_diff sans importance subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_M ; on regarde si c'est 'M' incf MEM_PTR ; on regarde le temps incf MAX_MEM call ReadEE movlw CW_5 bcf EEDATA,7 ;bit de mot_diff sans importance subwf EEDATA,w btfsc STATUS,Z goto Mem_Tun_T5 movlw CW_1 subwf EEDATA,w btfsc STATUS,Z goto Mem_Tun_T1 movlw CW_2 subwf EEDATA,w btfsc STATUS,Z goto Mem_Tun_T2 goto Mem_Cmd_Err Mem_Tun_T5 movlw .50 ; T5 = 5s goto Mem_Tun_ttp Mem_Tun_T1 movlw .100 ; T1 = 10s goto Mem_Tun_ttp Mem_Tun_T2 movlw .200 ; T2 = 20s goto Mem_Tun_ttp Mem_Tun_ttp clrf ETAT_LONG ; d‚marrage tempo movwf CMPT_LONG bsf ETAT_LONG,START Mem_Tun_Att btfsc ETAT_MANIP2,ARRET goto Mem_EE_Fin0 bsf Port_B,PTT ; ‚mission bsf ETAT_MANIP,TX btfss ETAT_LONG,ECHUE goto Mem_Tun_Att bcf Port_B,PTT ; fin ‚mission bcf ETAT_MANIP,TX goto Mem_Car_Next ; passe au caractŠre suivant Mem_EE_Fin0 bcf Port_B,PTT ; ou fin bcf ETAT_MANIP,TX goto Mem_EE_Fin Mem_Cmd_M movlw CW_M ; si 'M' alors subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_A ;sinon on regarde si c'est 'A' bsf Port_A,SC ; mise … 1 de la sortie command‚e goto Mem_Car_Next ; et passe au caractŠre suivant Mem_Cmd_A movlw CW_A ; si 'A' alors subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_N ;sinon on regarde si c'est 'N' bcf Port_A,SC ; mise … 0 de la sortie command‚e goto Mem_Car_Next ; et passe au caractŠre suivant Mem_Cmd_N movlw CW_N ; si 'N' alors subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_V btfss Port_A,SC ; inversion de la sortie command‚e goto Mem_Cmd_N0 bcf Port_A,SC ; mise … 0 de la sortie command‚e goto Mem_Car_Next ; et passe au caractŠre suivant Mem_Cmd_N0 bsf Port_A,SC goto Mem_Car_Next ; et passe au caractŠre suivant Mem_Cmd_V movlw CW_V ; si 'V' alors subwf EEDATA,w btfss STATUS,Z goto Mem_Cmd_Err ; sinon c'est une erreur ! call Mode_VI0 ; sortir/quitter mode VI goto Mem_Car_Next ;et caractŠre suivant ; Traitement des commandes non reconnues Mem_Cmd_Err call Erreur goto Mem_EE_Fin ; Fin du code END