;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; NOM: "Klx" - Date: 13/09/2007 - Version: Klx1-5-1 - Circuit: Veroboard ; Auteur: Pat'Ruff' d'après le Youbitonmatic de PSi ; ; ********* ATTENTION : version pour 12F629 **************** ; (utilisateurs de 12F675 : modifiez les lignes 9, 10 et 23) LIST p=PIC12F629 ; Définition de processeur #include ; Définitions des constantes errorlevel -302 __CONFIG _CPD_OFF & _BODEN_OFF & _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ; oscillateur interne 4M ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; Declarations de variables specifiques CBLOCK 0x020 ; Début de la zone des variables CPT_256 : 1 ; Compteurs pour la durée de chaque son SAV_TMR1H : 1 ; Sauvegarde valeur TMR1 poids fort SAV_TMR1L : 1 ; Sauvegarde valeur TMR1 poids faible Delai_H : 1 ; Poids forts du delai Delai_L : 1 ; Poids faibles du delai ENDC ; Fin de la zone des variables #include ; Paramétrage standard pour PIC629: ensemble ; des paramètres (registres) pour une utilisation standard ; (pas de convertisseur, ni comparateur...) ; contient ; également des morceaux de programme standard ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; Parametres specifiques BANK1 clrf TRISIO ; Port en sortie bsf TRISIO,5 ; sauf 5 pour déclenchement bsf TRISIO,4 ; et 4 pour déclenchement clrf WPU ; Pas de résistances de rappel sauf bsf WPU,5 ; résistance de rappel sur le port 5 bsf WPU,4 ; résistance de rappel sur le port 4 ; Registre controle interruptions INTCON BANK0 et 1 clrf INTCON bsf INTCON,GIE ; Interruptions activées en permanence bsf INTCON,PEIE ; Autorise interruption périphériques ; (notamment timer 1) ; Registre interruptions périphériques clrf PIE1 bsf PIE1,TMR1IE ; Autorise les interruptions Timer1 BANK0 bcf GPIO,1 ; Sortie à 0 ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; Boucle principale ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; L'entrée 5 correspond au fil vert, et à la touche F1 (par défaut) ; de la centrale DCC. ; L'entrée 4 correspond au fil violet, et à la touche F2. ; Par défaut, à la mise sous tension, les deux entrées sont à 0. ; Des sons "longs" sont programmés sur la touche F1, donc entrée 5. ; Des sons "courts" sont programmés sur la touche F2, donc entrée 4. ; Les test à 1 des entrées sont fiables car l'état "0" n'est pas bruité. ; Les test à 0 demandent une confirmation après 100 ms pour se protéger ; des parasites: fausses détections quand le "1" n'est pas stable, ; à cause des micro-coupures sur la voie ou... ; Pour chaque touche, il y a 4 sons différents: suivant la transition ; 0=>1 ou 1=>0, et suivant l'état de l'autre touche 0 ou 1, donc ; au total 8 sons différents en jouant sur F1 et F2. Etat54a00 ; Les entrées 5 & 4 sont à 0 btfsc GPIO,5 ; Test entrée 5 à 1 ? goto Test4a1 ; Non ; Oui call SON_Tii ; appel des sons call SON_Tii call SON_Taa call SON_Taa call SON_Taa call SON_Taa call SON_Tii goto Etat54a10 Test4a1 btfsc GPIO,4 ; Test entrée 4 à 1 ? goto Etat54a00 ; Non ; Oui call SON_Tii ; appel des sons call SON_Taa goto Etat54a01 Etat54a10 ; Entrée 5 à 1, entré 4 à 0 btfss GPIO,5 ; Test entrée 5 à 0 ? goto Test4a1bis ; Non call Delai_Confirmation ; Oui btfss GPIO,5 ; Bis: Test entrée 5 à 0 ? goto Test4a1bis ; Non ; Oui call SON_Tii ; appel des sons call SON_Taa call SON_Tii call SON_Taa call SON_Taa call SON_Taa call SON_Taa goto Etat54a00 Test4a1bis btfsc GPIO,4 ; Test entrée 4 à 1 ? goto Etat54a10 ; Non ; Oui call SON_Taa ; appel des sons call SON_Tii goto Etat54a11 Etat54a01 ; Entrée 5 à 0, entré 4 à 1 btfsc GPIO,5 ; Test entrée 5 à 1 ? goto Test4a0 ; Non ; Oui call SON_Taa ; appel des sons call SON_Taa call SON_Tii call SON_Taa call SON_Taa call SON_Taa call SON_Taa call SON_Taa call SON_Tii goto Etat54a11 Test4a0 btfss GPIO,4 ; Test entrée 4 à 0 ? goto Etat54a01 ; Non call Delai_Confirmation ; Oui btfss GPIO,4 ; Bis: Test entrée 4 à 0 ? goto Etat54a01 ; Non ; Oui call SON_Taa ; appel des sons goto Etat54a00 Etat54a11 ; Les entrées 5 & 4 sont à 1 btfss GPIO,5 ; Test entrée 5 à 0 ? goto Test4a0bis ; Non call Delai_Confirmation ; Oui btfss GPIO,5 ; Bis: Test entrée 5 à 0 ? goto Test4a0bis ; Non ; Oui call SON_Taa ; appel des sons call SON_Taa call SON_Tii call SON_Tii call SON_Tii call SON_Tii call SON_Tii call SON_Tii call SON_Taa goto Etat54a01 Test4a0bis btfss GPIO,4 ; Test entrée 4 à 0 ? goto Etat54a11 ; Non call Delai_Confirmation ; Oui btfss GPIO,4 ; Bis: Test entrée 4 à 0 ? goto Etat54a11 ; Non ; Oui call SON_Tii ; appel des sons goto Etat54a10 ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; SOUS-PROGRAMMES ; Délai de confirmation état 1 Delai_Confirmation ; De 100 ms movlw d'200' ; 200 fois movwf Delai_H ; Sauvegarde Boucle_100mS ; Boucle de 100 ms (200 * 500 µs) movlw d'250' ; 250 fois movwf Delai_L ; Sauvegarde Boucle_500uS ; Boucle de 500 µs (250 * 2 µs) decfsz Delai_L,f ; Décrément, test à 0 goto Boucle_500uS ; Cas non 0 ; sinon, on passe à la suite decfsz Delai_H,f ; Décrément, test à 0 goto Boucle_100mS ; Cas non 0 return ; Sinon, c'est fini... ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; son Tii, 660 Hz SON_Tii movlw d'253' ; Valeur poids fort du timer movwf SAV_TMR1H ; Sauvegarde movwf TMR1H ; Chargement timer poids fort movlw d'27' ; Valeur poids faible du timer movwf SAV_TMR1L ; Sauvegarde movwf TMR1L ; Chargement timer poids faible bsf T1CON, TMR1ON ; Lancement du timer movlw d'255' ; Chargement compteur durée movwf CPT_256 boucle_Tii btfsc T1CON, TMR1ON ; Test fin durée (=timer arreté) goto boucle_Tii ; Attente fin durée return ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; son Taa, 370 Hz SON_Taa movlw d'250' movwf SAV_TMR1H movwf TMR1H movlw d'201' movwf SAV_TMR1L movwf TMR1L bsf T1CON, TMR1ON movlw d'255' movwf CPT_256 boucle_Taa btfsc T1CON, TMR1ON goto boucle_Taa return ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; Interruption TMR1 appelée à chaque interruption TMR1 inttimer1 bcf T1CON, TMR1ON ; Arret timer movfw SAV_TMR1H ; Chargement timer poids fort movwf TMR1H movfw SAV_TMR1L ; Chargement timer poids faible movwf TMR1L movlw b'00000010' ; Inversion sortie xorwf GPIO,f decfsz CPT_256,f ; Décrément compteur durée bsf T1CON, TMR1ON ; Relancer timer return ;÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ ; Interruption TMR0 appelée à chaque interruption TMR0 inttimer0 return END