;************************************************************************************************ ; Les commentaires disponibles sur ce programme n'ont pas été écris par l'auteur du programme. * ; Peu importe qui a écrit ces comentaires, vous êtes autorisés à vous en attribuer l'écriture * ; et à diffuser ce fichier comme bon vous semble (enfin presque). La seule chose que je vous * ; demande pour distribuer ce fichier c'est de laisser cette entête. * ; L'auteur des commentaires ne vous encourage pas à utiliser ce programme à des fins illégales. * ; Merci d'avoir lu ces quelques lignes et n'hésitez pas à compléter les commentaires qui * ; manquent ou à modifier ceux que vous pensez pouvoir rendre plus explicites. * ;************************************************************************************************ ;CODE SOURCE ASSEMBLEUR POUR LA PIC ; ; (C) JOSEPHINA ;-) LIST p=16F84A #include ORG 0x0000 ;Point d'entrée du programme -> on va à Label_0001 GOTO Label_0001 ORG 0x0004 ;************************************************************************ ; ROUTINE D'INTERRUPTION EXECUTEE A LA FIN D'UN RESET DE LA T2G * ;************************************************************************ BTFSS 0x30,00 GOTO Label_0002 GOTO Label_0003 Label_0002 BTFSC 0x2C,00 GOTO Label_0004 BSF 0x30,00 Label_0004 BTFSS PORTB,01 ;tant que l'horloge de la T2G est à 0 GOTO Label_0004 ;on va à Label_0004 CALL Label_0005 ;sinon on appelle la routine Label_0005 Label_0006 BTFSC PORTB,01 ;si l'horloge de la T2G est à 1 GOTO Label_0006 ;on va à Label_006 BCF INTCON,INTF ;on remet à 0 le bit de flag de l'int RB0 RETFIE ;*********************************************************** ; TEST DE L'ETAT DU MONTAGE: DOIT-IL FONCTIONNER ? * ;*********************************************************** Label_0001 MOVLW 0x20 ;on pointe l'adresse 0x20 de l'EEPROM (juste après les données recopiées de la T2G) MOVWF EEADR BSF STATUS,RP0 ;sélection de la banque 1 BSF EECON1,00 ;indique qu'on veut accèder à l'EEPROM en lecture BCF STATUS,RP0 ;sélection de la banque 0 Label_0007 BTFSC EEDATA,00 ;on teste le bit 0 des données lues en EEPROM. Si il est à 1, l'émulateur est désactivé GOTO Label_0007 ;donc on boucle à l'infini sur Label_0007 sinon, on continue l'exécution du prog ;***************************************************************** ; PHASE D'INITIALISATION (ENTREES/SORTIES + INTERRUPTIONS) * ;***************************************************************** CLRF 0x31 ;on efface une variable en RAM Label_000C BSF STATUS,RP0 ;sélection de la banque 1 MOVLW 0xC0 ;configuration de diverses options: MOVWF OPTION_REG ;résistances de tirage actives sur le port B ;int sur RB0 quand on passe de l'état 0 à l'état 1 ;le timer0 fonctionne avec l'horloge interne du PIC ;watchdog désactivé ;prédiviseur du timer0 à 512µs MOVLW 0x90 ;configuration des interruptions MOVWF INTCON ;les int sont autorisées ;int de fin d'écriture en EEPROM désactivée ;int du timer0 désactivée ;int RB0 activée ;int RB4 à RB7 désactivée MOVLW 0x18 ;configuration du portA: MOVWF TRISA ;PA3 et PA4 en entrée ;PA0, PA1, PA2, PA5, PA6 PA7 en sortie MOVLW 0xA7 ;configuration du portB: MOVWF TRISB ;PB0, PB1, PB2, PB5, PB7 en entrée ;PB3, PB4, PA6 en sortie ;*********************************************************** ; ???? * ;*********************************************************** BCF STATUS,RP0 ;sélection de la banque 0 CLRF PORTB ;sorties du portB à 0 BSF PORTB,04 ;on éteint le LED CLRF PORTA ;sorties du portA à 0 CLRF 0x30 ;on efface une variable en RAM BTFSC 0x31,00 ;si le bit 0 de la variable est à 1, GOTO Label_0008 ;on va copier le contenu de l'EEPROM dans la RAM BTFSC PORTA,04 ;si le BP est enfoncé, on va à Label_0009 GOTO Label_0009 BCF PORTB,04 ;on allume la LED BCF INTCON,GIE ;on masque les interruptions Label_000B BTFSC PORTA,04 ;si le BP est enfoncé, on va à Label_000A GOTO Label_000A MOVF PORTB,W ;on recopie le contenu du portB MOVWF PORTA ;sur le portA MOVF PORTA,W ;on recopie le contenu du portA MOVWF PORTB ;sur le portB (bizarre, ca sert à rien vu qu'on vient de faire l'inverse, portA=portB) GOTO Label_000B ;*********************************************************** ; ???? * ;*********************************************************** Label_000A BSF 0x31,00 GOTO Label_000C ;*********************************************************** ; ???? * ;*********************************************************** Label_0009 BCF PORTB,04 ;PB4 à 0 MOVLW 0xFF MOVWF 0x2C ;on met 0xFF à la variable située à l'adresse 0x2C Label_000E MOVLW 0xFF MOVWF 0x2D ;on met 0xFF à la variable située à l'adresse 0x2D Label_000D DECFSZ 0x2D,f GOTO Label_000D DECFSZ 0x2C,f GOTO Label_000E BSF PORTB,04 MOVLW 0xFF MOVWF 0x2C Label_0010 MOVLW 0xFF MOVWF 0x2D Label_000F DECFSZ 0x2D,f GOTO Label_000F DECFSZ 0x2C,f GOTO Label_0010 BTFSS PORTA,04 GOTO Label_0011 GOTO Label_0009 ;******************************************************************* ; ROUTINE DE DESACTIVATION DE L'EMULATEUR EN CAS D'URGENCE * ;******************************************************************* Label_0011 MOVLW 0xFF MOVWF EEDATA ;la valeur à écrire en EEPROM sera 0xFF MOVLW 0x20 MOVWF EEADR ;la valeur sera écrite à l'adresse 0x20 BCF INTCON,GIE ;on désactive toutes le interruptions BSF STATUS,RP0 ;sélection de la banque 1 BSF EECON1,02 ;on autorise les accès en écriture sur l'EEPROM BCF EECON1,04 ;on efface le bit de flag qui sera mis à 1 quand l'écriture dans l'EEPROM sera finie MOVLW 0x55 ;\ MOVWF EECON2 ; \envoi de commandes au PIC. Nécessaire avant un accès en lecture à l'EEPROM MOVLW 0xAA ; /(je sais pas exactement à quoi ca sert donc si vous savez ...) MOVWF EECON2 ;/ BSF EECON1,01 ;démarrage du cycle d'écriture BCF EECON1,02 ;on bloque les accès en écriture sur l'EEPROM BSF INTCON,GIE ;on réactive les interruptions Label_0012 BTFSS EECON1,04 ;tant que l'écriture en EEPROM n'est pas finie, GOTO Label_0012 ;on boucle sur Label_0012 BCF EECON1,04 ;on désactive les interruptions BCF STATUS,RP0 ;sélection de la banque 0 Label_0013 BCF PORTB,04 ;RB4 passe à 0 GOTO Label_0013 ;*********************************************************** ; ???? * ;*********************************************************** Label_0018 BSF PORTB,03 DECFSZ 0x2D,f GOTO Label_0014 INCF 0x2C,f MOVF 0x2C,W MOVWF FSR MOVF INDF,W MOVWF 0x2E RLF 0x2E,f MOVLW 0x08 MOVWF 0x2D GOTO Label_0015 ;*********************************************************** ; ???? * ;*********************************************************** Label_0014 RLF 0x2E,f Label_0015 BTFSS PORTB,02 GOTO Label_0016 BTFSC PORTB,01 GOTO Label_0015 BTFSS STATUS,C BCF PORTB,03 Label_0019 BTFSS PORTB,02 GOTO Label_0017 BTFSC PORTB,01 GOTO Label_0018 GOTO Label_0019 ;*********************************************************** ; ???? * ;*********************************************************** Label_001B BSF PORTB,03 MOVLW 0x0C MOVWF 0x2C MOVWF FSR MOVF INDF,W MOVWF 0x2E RLF 0x2E,f MOVLW 0x08 MOVWF 0x2D Label_0016 BTFSC PORTB,02 GOTO Label_0015 BTFSC PORTB,01 GOTO Label_0016 Label_0017 BTFSS PORTB,05 ;si la T2G n'est pas alimentée GOTO Label_001A ;on va à Label_001A BTFSC PORTB,02 ;si on accède à la T2G en écriture GOTO Label_0019 ;on va à Label_0019 BTFSC PORTB,01 ;si l'horloge est à 1 GOTO Label_001B ;on va à Label_001B GOTO Label_0017 ;sinon on va à Label_0017 ;*********************************************************** ; ???? * ;*********************************************************** Label_001A BCF PORTB,03 ;on met la broche I/O de la T2G à 0 Label_001C BTFSS PORTB,05 ;tant que la T2G n'est pas alimentée GOTO Label_001C ;on boucle BTFSC STATUS,C ;si le précédent calcul à engendré une retenue BSF PORTB,03 ;on met la broche I/O de la T2G à 1 GOTO Label_0017 ;*********************************************************** ; ???? * ;*********************************************************** Label_0005 MOVF 0x2C,W MOVWF FSR DECF 0x2D,f BTFSS 0x2D,02 GOTO Label_001D BTFSS 0x2D,01 GOTO Label_001E BTFSS 0x2D,00 GOTO Label_001F BSF INDF,07 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_001D BTFSS 0x2D,01 GOTO Label_0020 BTFSS 0x2D,00 GOTO Label_0021 BSF INDF,03 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_0020 BTFSS 0x2D,00 GOTO Label_0022 BSF INDF,01 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_001E BTFSS 0x2D,00 GOTO Label_0023 BSF INDF,05 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_0022 BSF INDF,00 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_0021 BSF INDF,02 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_0023 BSF INDF,04 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_001F BSF INDF,06 INCF 0x2D,f RETURN ;*********************************************************** ; ???? * ;*********************************************************** Label_0003 CLRF 0x17 CLRF 0x30 Label_0024 BTFSS PORTB,01 GOTO Label_0024 GOTO Label_0006 ;************************************************************* ; ROUTINE DE LECTURE DES 32 OCTETS STOCKES EN EEPROM * ;************************************************************* Label_0008 MOVLW 0x20 MOVWF 0x2F ;on met 0x20=32 dans 0x2F (cette variable est un compteur de boucle qui va permettre de ;lire les 32 octets stockés en EEPROM) MOVLW 0x0B MOVWF FSR ;on va faire un adressage indirect sur l'@ 0x0B (FSR sert de pointeur) MOVLW 0xFF MOVWF EEADR ;0xFF dans le buffer de lecture des données en EEPROM Label_0025 INCF EEADR,f ;on incrémente EEADR. A la première inc, il passera à 0 car il était à 0xFF INCF FSR,f ;on incrémente le pointeur BSF STATUS,RP0 ;sélection de la banque 1 BSF EECON1,00 ;indique qu'on veut accèder à l'EEPROM en lecture BCF STATUS,RP0 ;sélection de la banque 0 MOVF EEDATA,W ;sauvegarde les données lues en EEPROM dans le registre de travail MOVWF INDF ;sauvegarde le registre de travail en RAM (à l'@ 0x0C pour le premier passage) DECFSZ 0x2F,f ;on décrémente le compteur de boucle GOTO Label_0025 ;si le compteur de boucle est à 0 (32 octets de l'EEPROM lu), on va à Label_001C GOTO Label_001C ;sinon on va à Label_0025 ORG 0x2000 DATA 0x0F DATA 0x0F DATA 0x0F DATA 0x0F ;***************************************************************************************** ;**** ZONE MEMOIRE dans laquelle on vient mettre le contenu de la t2g en hexadécimal****** ;***************************************************************************************** ORG 0x2100 DATA 0x11 ; ZONE MEMOIRE 1 DATA 0x11 DATA 0x11 DATA 0x11 DATA 0x99 DATA 0x15 DATA 0x11 DATA 0x11 DATA 0x00 DATA 0x00 DATA 0x01 ;j'ai enlevé mes valeurs mais on ne met que les 256 premiers bits de la t2g ce qui fait 256/8=32 valeurs hexadécimales DATA 0x01 DATA 0x11 DATA 0x11 DATA 0x11 DATA 0x8F DATA 0xFF DATA 0xFF DATA 0xFF DATA 0xFF DATA 0xFF DATA 0xFF DATA 0xFF DATA 0xFF DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 DATA 0x00 ;*************************************************** ;************** réglages du PIC ******************** ;*************************************************** ORG 0x2007 DATA 0x02 ; CODE_PROTECT_ON, /PWRTE_ON, WDTE_OFF, OSCI_HS END