Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLÉ DALLAS + I2C (24C32)


Information sur la source

Catégorie :Autres cpu Niveau : Débutant Date de création : 02/03/2004 Date de mise à jour : 26/12/2005 11:00:12 Vu : 16 653

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Ce programme est déstiné a être inséré dans un pic ou un microcontroleur. il gère 2 protocoles : celui des clés dallas (iButton) et du protocole I2C pour utiliser une mémoire EEPROM 24C32.
Il est donc nécessaire de réaliser un système électronique, si vous désirez obtenir la doc technic envoyez-moi un mail ou aller sur :
http://www.webfractales.com/projets/
 

Source

  • /********************************************************************************
  • * *
  • * Lecteur-Enregistreur Dallas *
  • * *
  • * The "Lecteur-Enregistreur Dallas" is a read/write interface of Dallas keys. *
  • * See the documentations for more explainations. *
  • * *
  • * Copyright (C) 2003-2005 Julien MICHOT *
  • * *
  • * Contact : m.i.t.c.h@free.fr - http://www.webfractales.com/ *
  • * *
  • * This program is free software; you can redistribute it and/or *
  • * modify it under the terms of the GNU General Public License *
  • * as published by the Free Software Foundation; either version 2 *
  • * of the License, or (at your option) any later version. *
  • * *
  • * This program is distributed in the hope that it will be useful, *
  • * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  • * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  • * GNU General Public License for more details. *
  • * *
  • * You should have received a copy of the GNU General Public License *
  • * along with this program; if not, write to the Free Software *
  • * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  • * *
  • * *
  • * *
  • ********************************************************************************/
  • ; Programme réalisé par Julien Michot - MiTcH
  • ; Pour le projet de réalisation de 2ème année
  • ; Lecteur-Enregistreur Dallas
  • ; zone de d,finition des ,quivalences (equ)
  • OctMemEcrire equ 10100000b
  • OctMemLire equ 10100001b
  • ; zone de d,finition des variables adressables au niveau du bit (bit)
  • Cle bit P3.2
  • Enreg bit P1.4
  • Supp bit P1.5
  • SDA bit P2.3
  • SCL bit P2.4
  • Led_OK bit P1.0
  • Led_Err bit P1.1
  • Led_Enreg bit P1.2
  • Led_Supp bit P1.3
  • ; d,but de la zone de m,moire de donn,es en RAM interne (ds)
  • dseg at 30h ; avant : 30
  • cle1 ds 8 ; clé lue
  • cle2 ds 8 ; clé contenue dans la mémoire
  • etat ds 1 ; flag d'état (10101010=OK)
  • erreur ds 1 ; non utilisé
  • adrs ds 2 ; adresse dans la mémoire
  • adrs_temp ds 2
  • TEMPS ds 1 ; variable utilisée pour la temporisation
  • ; fin de la zone de m,moire de donn,es en RAM interne
  • ; d,but de la zone de m,moire de programme en EPROM
  • cseg at 0
  • ; zone des vecteurs d'interruptions
  • org 0
  • ljmp main
  • ; zone de constantes (db)
  • org 30h ; avant : 30
  • ; zone de sous programmes
  • ;-----------------------Fonction de dialogue avec la clé-----------------------
  • ; initialisation des entrées-sories
  • Init:
  • mov adrs,#0
  • mov adrs+1,#0
  • lcall Effacer_cle
  • setb Cle
  • setb SDA
  • setb SCL
  • clr Led_Err
  • clr Led_Supp
  • clr Led_Enreg
  • clr Led_OK
  • mov etat,#0
  • mov erreur,#0
  • mov IE,#00000000b
  • ret
  • ;cette fonction envoie un '1' à la clé
  • Ecrire_1:
  • clr Cle
  • mov TEMPS,#3
  • lcall Tempo
  • setb Cle
  • mov TEMPS,#80
  • lcall Tempo
  • ret
  • ;cette fonction envoie un '0' à la clé
  • Ecrire_0:
  • clr Cle
  • mov TEMPS,#50
  • lcall Tempo
  • setb Cle
  • mov TEMPS,#20
  • lcall Tempo
  • ret
  • ;reset la clé, permet de redemander les octets à la clé
  • Reset:
  • Clr Cle
  • mov TEMPS,#255
  • lcall Tempo
  • mov TEMPS,#140
  • lcall Tempo
  • setb Cle
  • mov TEMPS,#15
  • lcall Tempo
  • clr Cle
  • mov TEMPS,#80
  • lcall Tempo
  • setb Cle
  • mov TEMPS,#170
  • lcall Tempo
  • ret
  • ;Effacer les 8 octets de la variable cle1
  • Effacer_cle:
  • mov cle1,#00000000b
  • mov cle1+1,#00000000b
  • mov cle1+2,#00000000b
  • mov cle1+3,#00000000b
  • mov cle1+4,#00000000b
  • mov cle1+5,#00000000b
  • mov cle1+6,#00000000b
  • mov cle1+7,#00000000b
  • ret
  • ;Fonction tres importante
  • ;elle permet de réaliser une temporisation de 128us max
  • ;le temps de tempo est dans la variable TEMPS
  • Tempo:
  • djnz TEMPS,Tempo
  • ret
  • ;----------------------Fonction de dialogue avec la mémoire---------------------
  • ;Signal de début de transmission de la mémoire
  • Start:
  • clr SDA
  • mov TEMPS,#2
  • lcall Tempo
  • lcall Front_D
  • ret
  • ;Signal de fin de transmission de la mémoire
  • Stop:
  • clr SCL
  • mov TEMPS,#2
  • lcall Tempo
  • clr SDA
  • mov TEMPS,#2
  • lcall Tempo
  • lcall Front_M
  • setb SDA
  • ret
  • ;Cette fonction Acknowledge signifie " un autre octet va etre transmit"
  • ACK:
  • mov TEMPS,#2
  • lcall Tempo
  • clr SDA
  • lcall Front_M
  • lcall Front_D
  • setb SDA
  • mov TEMPS,#2
  • lcall Tempo
  • ret
  • ;prevenir la mémoire qu'aucun octet ne va etre transmit
  • NOACK:
  • mov TEMPS,#2
  • lcall Tempo
  • setb SDA
  • lcall Front_M
  • lcall Front_D
  • ret
  • ;réaliser un front montant pour la mémoire
  • Front_M:
  • clr SCL
  • mov TEMPS,#2
  • lcall Tempo
  • setb SCL
  • mov TEMPS,#2
  • lcall Tempo
  • ret
  • ;réaliser un front descendant pour la mémoire
  • Front_D:
  • setb SCL
  • mov TEMPS,#2
  • lcall Tempo
  • clr SCL
  • mov TEMPS,#2
  • lcall Tempo
  • ret
  • ;faire une impulsion
  • Impulsion:
  • lcall Front_M
  • lcall Front_D
  • ret
  • ;tester si la mémoire à reçu et compris ce que l'on a demander
  • Test_ACK:
  • lcall Front_M
  • jb SDA,Erreur_Mem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • lcall Front_D
  • ret
  • ;Gestion des erreurs
  • Erreur:
  • lcall LED_ERR
  • lcall Attente_LED
  • lcall Init
  • lcall Attente_Fin
  • ljmp main
  • ret
  • Erreur_Mem:;;;;;;;;;;;;;;;;;;;;;;TESTER SI C LA MEMOIRE;;;;;;;;;;;;
  • lcall LED_ERR
  • lcall LED_OK
  • lcall Attente_LED
  • lcall Init
  • lcall Attente_Fin
  • ljmp main
  • ret
  • ;Cette fonction ecrit les 8 octets de la clé dans la mémoire,
  • ;à l'adresse contenue dans les 2 octets de adrs
  • Ecrire_Mem:
  • ; lcall Tester_Mem_Dispo ;attendre que la mémoire soit prête
  • lcall Start
  • ;envoyer le premier octet
  • mov A,#OctMemEcrire
  • mov B,#8
  • ecrire_suite:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz B,ecrire_suite
  • setb SDA
  • lcall Test_ACK
  • ;mettre dans la pile kles 8 octets de la clé et de son adresse
  • push cle1+7
  • push cle1+6
  • push cle1+5
  • push cle1+4
  • push cle1+3
  • push cle1+2
  • push cle1+1
  • push cle1
  • push adrs
  • push adrs+1
  • ;ecrire les 10 octets (2-adresse + 8-clé)
  • mov R2,#10
  • ecrire_suite1:
  • pop A
  • mov R3,#8
  • ecrire_suite2:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz R3,ecrire_suite2
  • lcall Test_ACK
  • djnz R2,ecrire_suite1
  • lcall Stop
  • ; mov P1,#01010000b
  • ret
  • ;Cette fonction lit les 8 octets contenus dans la mémoire,
  • ;à l'adresse contenue dans les 2 octets de adrs
  • Lecture_Mem:
  • ; lcall Tester_Mem_Dispo ;attendre que la mémoire soit prête
  • ;pour lire les octets à une adresse il faut tout d'abord ecrire
  • ;dans la mémoire l'adresse à laquelle nous voulons lire
  • lcall Start
  • ;envoyer le premier octet
  • mov A,#OctMemEcrire
  • mov B,#8
  • lecture_suite:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz B,lecture_suite
  • setb SDA
  • lcall Test_ACK
  • ; mettre les adresses dans la pile
  • push adrs
  • push adrs+1
  • ;ecriture des 2 octets de l'adresse
  • mov R2,#2
  • lecture_suite1:
  • pop A
  • mov R3,#8
  • lecture_suite2:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz R3,lecture_suite2
  • lcall Test_ACK
  • djnz R2,lecture_suite1
  • lcall Stop
  • ;La lecture en elle-meme :
  • lcall Start
  • mov A,#OctMemLire
  • mov B,#8
  • lecture_suite8:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz B,lecture_suite8
  • setb SDA
  • lcall Test_ACK
  • ;mov P1,#11000000b
  • ; lecture des 8 octets
  • mov R2,#8
  • lecture_suite3:
  • mov R3,#8
  • lecture_suite4:
  • lcall Front_M
  • mov C,SDA
  • lcall Front_D
  • RLC A
  • djnz R3,lecture_suite4
  • push A ;mettre dans la pile
  • cjne R2,#1, lecture_suite5
  • lcall NOACK
  • ljmp lecture_suite6
  • lecture_suite5:
  • lcall ACK
  • lecture_suite6:
  • djnz R2,lecture_suite3
  • lcall Stop
  • ;restitution dans le registre nø2
  • pop cle2+7
  • pop cle2+6
  • pop cle2+5
  • pop cle2+4
  • pop cle2+3
  • pop cle2+2
  • pop cle2+1
  • pop cle2
  • ; mov P1,#10100000b
  • ; mov P1,cle2
  • ret
  • ;teste si la mémoire est prête pour être utilisée
  • Tester_Mem_Dispo:
  • lcall Start
  • mov A,#OctMemLire
  • mov B,#8
  • Dispo_suite:
  • RLC A
  • mov SDA ,C
  • lcall Impulsion
  • djnz B,Dispo_suite
  • setb SDA
  • lcall Front_M
  • jnb SDA,fin_dispo
  • lcall Front_D
  • lcall Stop
  • mov TEMPS,#50
  • lcall Tempo
  • ljmp Tester_Mem_Dispo
  • ;ne sort que si la mémoire à répondu
  • fin_dispo:
  • lcall Front_D
  • lcall Stop
  • mov B,#255
  • lcall Tempo
  • ; mov P1,#10100110b
  • mov etat,#1
  • ret
  • ;Reset la mémoire et écrit l'octet 11111111b signifiant la fin des codes
  • Reset_Mem:
  • ; lcall Tester_Mem_Dispo
  • lcall Init
  • mov A,#9
  • Reset_Mem_suite1:
  • lcall Front_M
  • setb SDA
  • lcall Front_D
  • djnz A,Reset_Mem_suite1
  • lcall Start
  • lcall Effacer_cle
  • mov adrs,#0
  • mov adrs+1,#0
  • mov cle1,#11111111b
  • mov cle1+1,#00000000b
  • ; mov TEMPS,#10
  • ; lcall Tempo
  • lcall Ecrire_Mem
  • mov etat,#10101010b
  • ret
  • ;--------------Fonction gérant l'enregistrement et la suppression---------------
  • ;Enregistrer les 8 octets de la clé dans la mémoire
  • Enregistrer:
  • lcall Tester_cle
  • mov A,etat
  • cjne A,#10101010b,save_suite
  • ;cle d,j. enregistr,e, ou vient d'^tre enregistr,e
  • ljmp fin_save_err
  • save_suite:
  • lcall Trouver_espace
  • ; espace libre : état -> 00000000b
  • ;fin (1111111)->00001111b
  • mov A,etat
  • cjne A,#00000000b,save_suite3
  • ; lcall Tester_Mem_Dispo
  • lcall Ecrire_Mem
  • ljmp fin_save
  • save_suite3:
  • cjne A,#00001111b,fin_save_err
  • ; lcall Tester_Mem_Dispo
  • lcall Ecrire_Mem
  • mov A,adrs
  • add A,#8
  • mov adrs,A
  • cjne A,#00000000b,save_suite2
  • INC adrs+1
  • save_suite4:
  • mov A,adrs+1
  • cjne A,#00010000b,save_suite2
  • ljmp fin_save
  • save_suite2:
  • lcall Effacer_cle
  • mov cle1,#11111111b
  • ; lcall Tester_Mem_Dispo
  • lcall Ecrire_Mem
  • ljmp fin_save
  • fin_save_err:
  • ;erreurs
  • mov etat,#0
  • ljmp fin_fin_save
  • fin_save:
  • ;c bon
  • mov etat,#10101010b
  • fin_fin_save:
  • ret
  • ;Supprimer les 8 octets de la mémoire
  • Supprimer:
  • mov adrs,#0
  • mov adrs+1,#0
  • mov A,#0
  • lcall Tester_cle
  • mov A,etat
  • cjne A,#10101010b,fin_supp_err
  • lcall Effacer_cle
  • lcall Tester_Mem_Dispo ;
  • lcall Ecrire_Mem
  • ljmp fin_supp
  • fin_supp_err:
  • mov etat,#01010000b
  • ljmp fin_fin_supp
  • fin_supp:
  • mov etat,#10101010b
  • fin_fin_supp:
  • ;lcall Reset_Mem
  • ret
  • ;tester si la clé est enregistrée dans la mémoire
  • Tester_cle:
  • mov etat,#00001111b
  • mov A,#0
  • clr C
  • mov adrs,#0
  • mov adrs+1,#0
  • ljmp Tester_cle_suite2
  • Tester_cle_suite1:
  • mov A,adrs
  • add A,#8
  • mov adrs,A
  • cjne A,#00000000b,Tester_cle_suite2
  • inc adrs+1
  • Tester_cle_suite4:
  • mov A,adrs+1
  • cjne A,#00010000b,Tester_cle_suite2
  • ljmp fin_fin_mem
  • Tester_cle_suite2:
  • lcall Tester_Mem_Dispo ;
  • lcall Lecture_Mem
  • mov R0,cle2
  • cjne R0,#11111111b,Tester_cle_suite3
  • ljmp fin_fin_mem
  • Tester_cle_suite3:
  • mov A,cle1+1
  • cjne A,cle2+1,Tester_cle_suite1
  • mov A,cle1+2
  • cjne A,cle2+2,Tester_cle_suite1
  • mov A,cle1+3
  • cjne A,cle2+3,Tester_cle_suite1
  • mov A,cle1+4
  • cjne A,cle2+4,Tester_cle_suite1
  • mov A,cle1+5
  • cjne A,cle2+5,Tester_cle_suite1
  • mov A,cle1+6
  • cjne A,cle2+6,Tester_cle_suite1
  • mov A,cle1+7
  • cjne A,cle2+7,Tester_cle_suite1
  • ;ici le code est bon
  • mov etat,#10101010b
  • ljmp fin_tester_cle
  • fin_fin_mem:
  • mov etat,#00001111b
  • ; mov etat,adrs
  • fin_tester_cle:
  • ;si connue adrs-> son adr dans la mem
  • ;si non connue adrs -> adr de la derniSre place o- il n'y a rien !
  • ; cl, connue -> 10101010b
  • ;fin (1111111)->00001111b
  • ret
  • ;tester si la clé est enregistrée dans la mémoire
  • Trouver_espace:
  • mov adrs,#0
  • mov adrs+1,#0
  • ljmp Trouver_esp_suite2
  • Trouver_esp_suite1:
  • mov A,adrs
  • add A,#8
  • mov adrs,A
  • cjne A,#00000000b,Trouver_esp_suite4
  • INC adrs+1
  • Trouver_esp_suite4:
  • mov A,adrs+1
  • cjne A,#00010000b,Trouver_esp_suite2
  • ljmp fin_fin_mem_1
  • Trouver_esp_suite2:
  • ; lcall Tester_Mem_Dispo
  • lcall Lecture_Mem
  • mov R0,cle2
  • cjne R0,#11111111b,Trouver_esp_suite3
  • ljmp fin_fin_mem_0
  • Trouver_esp_suite3:
  • cjne R0,#00000000b,Trouver_esp_suite1
  • mov etat,#00000000b
  • ljmp fin_Trouver_espace
  • fin_fin_mem_0:
  • mov etat,#00001111b
  • ljmp fin_Trouver_espace
  • fin_fin_mem_1:
  • mov etat,#11111111b
  • fin_Trouver_espace:
  • ; espace libre : état -> 00000000b
  • ;fin (1111111)->00001111b
  • ret
  • ; FONCTIONS D'AFFICHAGE
  • LED_OK:
  • mov A,etat
  • clr Led_OK
  • cjne A,#10101010b,fin_led1
  • setb Led_OK
  • ljmp fin_fin_led1
  • fin_led1:
  • setb Led_Err
  • fin_fin_led1:
  • ret
  • LED_ENREG:
  • mov A,etat
  • clr Led_Enreg
  • cjne A,#10101010b,fin_led2
  • setb Led_Enreg
  • fin_led2:
  • ret
  • LED_SUPP:
  • mov A,etat
  • clr Led_Supp
  • cjne A,#10101010b,fin_led3
  • setb Led_Supp
  • fin_led3:
  • ret
  • LED_ERR:
  • setb Led_Err
  • fin_led4:
  • ret
  • Attente_LED:
  • mov R0,#5
  • fin_tt1:
  • mov A,#250
  • fin_tt2:
  • mov TEMPS,#250
  • lcall Tempo
  • djnz A,fin_tt2
  • djnz R0,fin_tt1
  • ret
  • Attente_Fin:
  • mov R0,#5
  • fin_t1:
  • mov A,#250
  • fin_t2:
  • mov TEMPS,#250
  • lcall Tempo
  • djnz A,fin_t2
  • djnz R0,fin_t1
  • ret
  • ;;;;;fonction servant à tester les différentes fonctions;;;;;;;;;
  • ;Fonction_tester:
  • ; mov adrs,#0
  • ; mov adrs+1,#0
  • ;
  • ; ljmp fct_suite2
  • ;fct_suite1:
  • ;inc adrs
  • ; mov A,adrs
  • ; add A,#1
  • ; mov adrs,A
  • ;fct_suite2:
  • ;
  • ; lcall Lecture_Mem
  • ;mov p1,adrs
  • ; mov P1,cle2
  • ;mov p1,adrs
  • ; lcall Attente_LED
  • ; lcall Attente_Fin
  • ;fct_b:
  • ; jb lec,fct_fin
  • ; jnb tester,fct_b
  • ; ljmp fct_suite1
  • ;fct_fin:
  • ; lcall Attente_LED
  • ; lcall Init
  • ; lcall Attente_Fin
  • ;ret
  • ;-------------------------------------MAIN-----------------------------------
  • ; d,but du programme principal
  • main:
  • lecture:
  • lcall Reset
  • lcall Ecrire_1
  • lcall Ecrire_1
  • lcall Ecrire_0
  • lcall Ecrire_0
  • lcall Ecrire_1
  • lcall Ecrire_1
  • lcall Ecrire_0
  • lcall Ecrire_0
  • mov TEMPS,#90
  • lcall Tempo
  • ;lecture des octets de la clé
  • mov A,#0
  • mov R0,#8
  • boucle0:
  • mov R1,#8
  • boucle1:
  • clr Cle
  • nop
  • setb Cle
  • nop
  • nop
  • mov C,Cle
  • RRC A
  • cjne R1,#1,suite1
  • push A
  • mov A,#0
  • suite1:
  • mov TEMPS,#20
  • lcall Tempo
  • djnz R1,boucle1
  • djnz R0,boucle0
  • ; RESTITUTION
  • pop cle1+7 ;CRC
  • pop cle1+6
  • pop cle1+5
  • pop cle1+4
  • pop cle1+3
  • pop cle1+2
  • pop cle1+1
  • pop cle1 ;CF
  • mov P1,#00110000b
  • mov A,cle1
  • cjne A,#00000001b,fin_p ;ici il n'y a pas de clé
  • boucle4:
  • ;une clé a été lue
  • mov P1,#00010000b
  • jnb Enreg,test_supp
  • jnb Supp,do_enreg
  • ljmp do_reset
  • test_supp:
  • jnb Supp,test_cle
  • ljmp do_supp
  • test_cle:
  • lcall Tester_cle
  • lcall LED_OK
  • ljmp fin_p
  • do_reset:
  • lcall Reset_Mem
  • lcall LED_ENREG
  • lcall LED_SUPP
  • ljmp fin_p
  • do_enreg:
  • lcall Enregistrer
  • lcall LED_ENREG
  • ljmp fin_p
  • do_supp:
  • lcall Supprimer
  • lcall LED_SUPP
  • fin_p:
  • lcall Attente_LED
  • lcall Init
  • lcall Attente_Fin
  • ljmp main
  • ; fin du programme principal
  • ;asmex1 ; retour au moniteur, ligne à supprimer pour l'EPROM
  • ; fin de la zone de m,moire de programme en EPROM
/********************************************************************************
*                                                                               *
*                    Lecteur-Enregistreur Dallas                                *
* 																				*
* The "Lecteur-Enregistreur Dallas" is a read/write interface of Dallas keys. 		*
* See the documentations for more explainations.                                *
* 																				*
* Copyright (C) 2003-2005  Julien MICHOT										*
* 																				*
* Contact : m.i.t.c.h@free.fr - http://www.webfractales.com/						*
* 																				*
* This program is free software; you can redistribute it and/or					*
* modify it under the terms of the GNU General Public License					*
* as published by the Free Software Foundation; either version 2				*
* of the License, or (at your option) any later version.						*
* 																				*
* This program is distributed in the hope that it will be useful,				*
* but WITHOUT ANY WARRANTY; without even the implied warranty of				*
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the					*
* GNU General Public License for more details.									*
* 																				*
* You should have received a copy of the GNU General Public License				*
* along with this program; if not, write to the Free Software					*
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.	*
* 																				*
* 																				*
* 																				*
********************************************************************************/
; Programme réalisé par Julien Michot - MiTcH
; Pour le projet de réalisation de 2ème année
; Lecteur-Enregistreur Dallas

 ; zone de d,finition des ,quivalences	(equ)
	OctMemEcrire	equ 	10100000b
	OctMemLire	equ 	10100001b

; zone de d,finition des variables adressables au niveau du bit	(bit)


	Cle	bit	P3.2
	Enreg	bit	P1.4
	Supp	bit	P1.5
	SDA	bit	P2.3
	SCL 	bit	P2.4

	Led_OK       bit      P1.0
        Led_Err      bit      P1.1
        Led_Enreg    bit      P1.2
        Led_Supp     bit      P1.3
	
; d,but de la zone de m,moire de donn,es en RAM interne	(ds)
        dseg    at      30h  ; avant : 30
 	cle1	ds	8     ; clé lue
	cle2	ds	8     ; clé contenue dans la mémoire
	etat	ds	1     ; flag d'état (10101010=OK)
	erreur	ds	1     ; non utilisé
	adrs	ds	2    ; adresse dans la mémoire
	adrs_temp  ds   2
	TEMPS	ds	1     ; variable utilisée pour la temporisation


; fin de la zone de m,moire de donn,es en RAM interne


; d,but de la zone de m,moire de programme en EPROM
        cseg    at      0
        ; zone des vecteurs d'interruptions
        org     0
        ljmp    main


        ; zone de constantes	(db)
        org     30h   ; avant : 30


        ; zone de sous programmes
        
;-----------------------Fonction de dialogue avec la clé-----------------------


; initialisation des entrées-sories
Init:
	mov	adrs,#0
	mov	adrs+1,#0
	lcall   Effacer_cle
 	setb 	Cle
	setb	SDA
	setb	SCL
	clr     Led_Err
        clr     Led_Supp
        clr     Led_Enreg
        clr     Led_OK
	mov	etat,#0
	mov	erreur,#0
	
	mov     IE,#00000000b
	
ret

;cette fonction envoie un '1' à la clé
Ecrire_1:
	clr Cle
	mov TEMPS,#3
	lcall Tempo
	setb Cle
	mov TEMPS,#80      
	lcall Tempo
ret

;cette fonction envoie un '0' à la clé
Ecrire_0:
	clr Cle
	mov TEMPS,#50
	lcall Tempo
	setb Cle
	mov TEMPS,#20
	lcall Tempo 
ret

;reset la clé, permet de redemander les octets à la clé
Reset:

	Clr Cle
	mov TEMPS,#255
	lcall Tempo
	mov TEMPS,#140
	lcall Tempo

	setb Cle
	mov TEMPS,#15
	lcall Tempo

	clr Cle
	mov TEMPS,#80
	lcall Tempo

	setb Cle     
	mov TEMPS,#170
	lcall Tempo
ret

;Effacer les 8 octets de la variable cle1
Effacer_cle:
	mov	cle1,#00000000b
	mov	cle1+1,#00000000b
	mov	cle1+2,#00000000b
	mov	cle1+3,#00000000b
	mov	cle1+4,#00000000b
	mov	cle1+5,#00000000b
	mov	cle1+6,#00000000b
	mov	cle1+7,#00000000b
ret


;Fonction tres importante
;elle permet de réaliser une temporisation de 128us max
;le temps de tempo est dans la variable TEMPS
Tempo:
 djnz TEMPS,Tempo
ret


;----------------------Fonction de dialogue avec la mémoire---------------------



;Signal de début de transmission de la mémoire
Start:
	clr 	SDA
	mov   	TEMPS,#2
	lcall	Tempo
 	lcall	Front_D
ret

;Signal de fin de transmission de la mémoire
Stop:
	clr 	SCL
	mov   	TEMPS,#2
	lcall	Tempo
	clr	SDA
	mov 	TEMPS,#2
	lcall 	Tempo
	lcall	Front_M
	setb	SDA
ret

;Cette fonction Acknowledge signifie " un autre octet va etre transmit"
ACK:
	mov 	TEMPS,#2
	lcall 	Tempo
	clr 	SDA
	lcall 	Front_M
	lcall	Front_D
	setb 	SDA
	mov 	TEMPS,#2
	lcall 	Tempo	
ret

;prevenir la mémoire qu'aucun octet ne va etre transmit
NOACK:
	mov 	TEMPS,#2
	lcall 	Tempo
	setb 	SDA
	lcall 	Front_M
	lcall	Front_D
ret

;réaliser un front montant pour la mémoire
Front_M:
	clr	SCL
	mov 	TEMPS,#2
	lcall 	Tempo
	setb	SCL
	mov 	TEMPS,#2
	lcall 	Tempo
ret

;réaliser un front descendant pour la mémoire
Front_D:
	setb	SCL
	mov 	TEMPS,#2
	lcall 	Tempo
	clr	SCL
	mov 	TEMPS,#2
	lcall 	Tempo
ret

;faire une impulsion
Impulsion:
	lcall 	Front_M
	lcall	Front_D
ret

;tester si la mémoire à reçu et compris ce que l'on a demander
Test_ACK:
	lcall	Front_M
	jb	SDA,Erreur_Mem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	lcall	Front_D
ret

;Gestion des erreurs
Erreur:
        lcall   LED_ERR
        lcall   Attente_LED
 	lcall 	Init
 	lcall   Attente_Fin
	ljmp main
ret
Erreur_Mem:;;;;;;;;;;;;;;;;;;;;;;TESTER SI C LA MEMOIRE;;;;;;;;;;;;
        lcall   LED_ERR
        lcall   LED_OK
        lcall   Attente_LED
 	lcall 	Init
 	lcall   Attente_Fin
	ljmp main
ret

;Cette fonction ecrit les 8 octets de la clé dans la mémoire, 
;à l'adresse contenue dans les 2 octets de adrs
Ecrire_Mem:
;	lcall	Tester_Mem_Dispo  ;attendre que la mémoire soit prête
	lcall 	Start
	;envoyer le premier octet
	mov	A,#OctMemEcrire                    
	mov	B,#8
ecrire_suite:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	B,ecrire_suite
	setb 	SDA
	lcall	Test_ACK
        ;mettre dans la pile kles 8 octets de la clé et de son adresse
	push  	cle1+7
	push 	cle1+6
	push	cle1+5
	push	cle1+4
	push	cle1+3
	push	cle1+2
	push	cle1+1
	push	cle1
	push	adrs
	push 	adrs+1

        ;ecrire les 10 octets (2-adresse + 8-clé)
	mov  	R2,#10
ecrire_suite1:
	pop	A
	mov	R3,#8
ecrire_suite2:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	R3,ecrire_suite2
	lcall	Test_ACK
	djnz	R2,ecrire_suite1	
	lcall 	Stop
;	mov	P1,#01010000b
ret

;Cette fonction lit les 8 octets contenus dans la mémoire,
;à l'adresse contenue dans les 2 octets de adrs
Lecture_Mem:

;	lcall	Tester_Mem_Dispo  ;attendre que la mémoire soit prête
	
	
;pour lire les octets à une adresse il faut tout d'abord ecrire
;dans la mémoire l'adresse à laquelle nous voulons lire
	lcall 	Start
	;envoyer le premier octet
	mov	A,#OctMemEcrire                    
	mov	B,#8
lecture_suite:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	B,lecture_suite
	setb 	SDA
	lcall	Test_ACK

        ; mettre les adresses dans la pile
	push	adrs
	push 	adrs+1
        ;ecriture des  2 octets de l'adresse
	mov  	R2,#2
lecture_suite1:
	pop	A
	mov	R3,#8
lecture_suite2:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	R3,lecture_suite2
	lcall	Test_ACK
	djnz	R2,lecture_suite1
	lcall	Stop

;La lecture en elle-meme :
	lcall 	Start
	mov	A,#OctMemLire                    
	mov	B,#8
lecture_suite8:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	B,lecture_suite8
	setb 	SDA
	lcall	Test_ACK
;mov	P1,#11000000b

        ; lecture des 8 octets

	mov  	R2,#8
lecture_suite3:
	mov	R3,#8
lecture_suite4:
	lcall 	Front_M
	mov 	C,SDA
	lcall	Front_D
	RLC	A
	djnz	R3,lecture_suite4
	push	A                  ;mettre dans la pile
	cjne	R2,#1, lecture_suite5
	lcall	NOACK
	ljmp	lecture_suite6
lecture_suite5:
	lcall 	ACK
lecture_suite6:
	djnz	R2,lecture_suite3
	lcall	Stop

        ;restitution dans le registre nø2
	pop	cle2+7
	pop	cle2+6
	pop	cle2+5
	pop 	cle2+4
	pop	cle2+3
	pop	cle2+2
	pop	cle2+1
	pop	cle2
	
;	mov	P1,#10100000b
;	mov	P1,cle2

ret

;teste si la mémoire est prête pour être utilisée
Tester_Mem_Dispo:
	lcall	Start
	mov	A,#OctMemLire     
	mov	B,#8
Dispo_suite:
	RLC	A 
	mov 	SDA ,C
	lcall   Impulsion
	djnz	B,Dispo_suite
	setb 	SDA

	lcall	Front_M
	jnb	SDA,fin_dispo
	lcall	Front_D
	lcall	Stop
	mov	TEMPS,#50
	lcall	Tempo
	ljmp	Tester_Mem_Dispo
	;ne sort que si la mémoire à répondu
fin_dispo:
	lcall	Front_D
	lcall	Stop
	mov	B,#255
	lcall	Tempo
;	mov	P1,#10100110b
	mov	etat,#1
ret

;Reset la mémoire et écrit l'octet 11111111b signifiant la fin des codes
Reset_Mem:
;        lcall	Tester_Mem_Dispo
	lcall	Init
	mov	A,#9
Reset_Mem_suite1:
	lcall	Front_M
	setb	SDA
	lcall	Front_D
	djnz	A,Reset_Mem_suite1
	lcall	Start

	lcall	Effacer_cle
	mov	adrs,#0
	mov	adrs+1,#0
	mov	cle1,#11111111b
	mov	cle1+1,#00000000b

;	mov	TEMPS,#10
;	lcall	Tempo	
	lcall	Ecrire_Mem

	mov	etat,#10101010b
	
ret

;--------------Fonction gérant l'enregistrement et la suppression---------------

;Enregistrer les 8 octets de la clé dans la mémoire
Enregistrer:
	lcall	Tester_cle
	mov	A,etat
	cjne 	A,#10101010b,save_suite
;cle d,j. enregistr,e, ou vient d'^tre enregistr,e
	ljmp 	fin_save_err
save_suite:
        lcall   Trouver_espace
; espace libre : état -> 00000000b
;fin (1111111)->00001111b
	mov	A,etat
	cjne 	A,#00000000b,save_suite3
;	lcall   Tester_Mem_Dispo
	lcall	Ecrire_Mem
        ljmp    fin_save
save_suite3:
        cjne 	A,#00001111b,fin_save_err
;	lcall   Tester_Mem_Dispo
	lcall	Ecrire_Mem

	mov	A,adrs
	add	A,#8
	mov	adrs,A
	cjne	A,#00000000b,save_suite2
	INC	adrs+1
save_suite4:
	mov	A,adrs+1
	cjne	A,#00010000b,save_suite2
	ljmp	fin_save
save_suite2:
	lcall 	Effacer_cle
	mov	cle1,#11111111b
;	lcall   Tester_Mem_Dispo
 	lcall	Ecrire_Mem
	ljmp	fin_save
fin_save_err:
;erreurs
	mov     etat,#0
	ljmp	fin_fin_save
fin_save:
;c bon
	mov	etat,#10101010b

fin_fin_save:
ret

;Supprimer les 8 octets de la mémoire
Supprimer:
	mov  	adrs,#0
	mov	adrs+1,#0
	mov	A,#0
	lcall	Tester_cle
	mov	A,etat

	cjne 	A,#10101010b,fin_supp_err
	lcall	Effacer_cle

        lcall	Tester_Mem_Dispo          ;
	lcall	Ecrire_Mem
	ljmp	fin_supp

fin_supp_err:                                             
	mov	etat,#01010000b
	ljmp    fin_fin_supp
fin_supp:
	mov	etat,#10101010b
fin_fin_supp:
	;lcall	Reset_Mem
ret

;tester si la clé est enregistrée dans la mémoire
Tester_cle:

	mov	etat,#00001111b

	mov	A,#0
	clr 	C
	mov	adrs,#0
      	mov	adrs+1,#0
	ljmp 	Tester_cle_suite2
Tester_cle_suite1:
	mov	A,adrs
	add	A,#8
	mov	adrs,A
	cjne	A,#00000000b,Tester_cle_suite2
	inc	adrs+1
Tester_cle_suite4:
	mov	A,adrs+1
	cjne	A,#00010000b,Tester_cle_suite2
	ljmp	fin_fin_mem
Tester_cle_suite2:
        lcall	Tester_Mem_Dispo                 ;
	lcall	Lecture_Mem
	mov	R0,cle2
	cjne	R0,#11111111b,Tester_cle_suite3
	ljmp	fin_fin_mem
Tester_cle_suite3:
	mov	A,cle1+1
	cjne	A,cle2+1,Tester_cle_suite1
	mov	A,cle1+2
	cjne	A,cle2+2,Tester_cle_suite1
	mov	A,cle1+3
	cjne	A,cle2+3,Tester_cle_suite1
	mov	A,cle1+4
	cjne	A,cle2+4,Tester_cle_suite1
	mov	A,cle1+5
	cjne	A,cle2+5,Tester_cle_suite1
	mov	A,cle1+6
	cjne	A,cle2+6,Tester_cle_suite1
	mov	A,cle1+7
	cjne	A,cle2+7,Tester_cle_suite1
;ici	le code est bon
	mov	etat,#10101010b
	ljmp	fin_tester_cle
fin_fin_mem:
	mov	etat,#00001111b
;	mov	etat,adrs
fin_tester_cle:

;si connue adrs-> son adr dans la mem
;si non connue adrs -> adr de la derniSre place o- il n'y a rien !
; cl, connue -> 10101010b
;fin (1111111)->00001111b

ret


;tester si la clé est enregistrée dans la mémoire
Trouver_espace:
	mov	adrs,#0
	mov	adrs+1,#0
	ljmp 	Trouver_esp_suite2
Trouver_esp_suite1:

	mov	A,adrs
	add	A,#8
	mov	adrs,A
	cjne	A,#00000000b,Trouver_esp_suite4
	INC	adrs+1
Trouver_esp_suite4:
	mov	A,adrs+1
	cjne	A,#00010000b,Trouver_esp_suite2
	ljmp	fin_fin_mem_1
Trouver_esp_suite2:
;        lcall	Tester_Mem_Dispo
	lcall	Lecture_Mem
	mov	R0,cle2
	cjne	R0,#11111111b,Trouver_esp_suite3
	ljmp	fin_fin_mem_0
Trouver_esp_suite3:
	cjne	R0,#00000000b,Trouver_esp_suite1

	mov	etat,#00000000b
	ljmp	fin_Trouver_espace
fin_fin_mem_0:
	mov	etat,#00001111b
	ljmp    fin_Trouver_espace
fin_fin_mem_1:
	mov	etat,#11111111b
fin_Trouver_espace:

; espace libre : état -> 00000000b
;fin (1111111)->00001111b

ret

; FONCTIONS D'AFFICHAGE
LED_OK:
	mov	A,etat
	clr     Led_OK
	cjne	A,#10101010b,fin_led1
	setb    Led_OK
	ljmp	fin_fin_led1
fin_led1:
	setb	Led_Err
fin_fin_led1:
ret
LED_ENREG:
	mov	A,etat
	clr     Led_Enreg
	cjne	A,#10101010b,fin_led2
	setb    Led_Enreg
fin_led2:
ret
LED_SUPP:
	mov	A,etat
	clr     Led_Supp
	cjne	A,#10101010b,fin_led3
	setb    Led_Supp
fin_led3:
ret
LED_ERR:
	setb    Led_Err
fin_led4:
ret

Attente_LED:
	mov  R0,#5
fin_tt1:
	mov  A,#250
fin_tt2:
	mov TEMPS,#250
	lcall Tempo
	djnz A,fin_tt2
	djnz R0,fin_tt1
ret

Attente_Fin:
	mov  R0,#5
fin_t1:
	mov  A,#250
fin_t2: 
	mov TEMPS,#250
	lcall Tempo
	djnz A,fin_t2
	djnz R0,fin_t1

ret

;;;;;fonction servant à tester les différentes fonctions;;;;;;;;;
;Fonction_tester:
;	mov	adrs,#0
;	mov	adrs+1,#0
;
;	ljmp 	fct_suite2
;fct_suite1:
;inc adrs
;	mov	A,adrs
;	add	A,#1
;	mov	adrs,A
;fct_suite2:
;
;	lcall	Lecture_Mem
;mov p1,adrs
;        mov     P1,cle2
;mov p1,adrs
;        lcall   Attente_LED
;        lcall   Attente_Fin
;fct_b:
;        jb      lec,fct_fin
;        jnb     tester,fct_b
;        ljmp    fct_suite1
;fct_fin:
;        lcall   Attente_LED
; 	lcall 	Init
; 	lcall   Attente_Fin
;ret


;-------------------------------------MAIN-----------------------------------
        ; d,but du programme principal
main:




lecture:
	lcall Reset
	 
	lcall Ecrire_1
	lcall Ecrire_1
	lcall Ecrire_0
	lcall Ecrire_0
	lcall Ecrire_1
	lcall Ecrire_1
	lcall Ecrire_0
	lcall Ecrire_0


	mov TEMPS,#90
	lcall Tempo

        ;lecture des octets de la clé
	mov A,#0
	mov R0,#8
boucle0:
	mov R1,#8
boucle1: 
	clr Cle 
	nop
	setb Cle
	nop
	nop
	mov C,Cle
	RRC A
	cjne  R1,#1,suite1
	push A

	mov A,#0
suite1: 
	mov TEMPS,#20
	lcall Tempo
	djnz R1,boucle1

	djnz R0,boucle0

; 	RESTITUTION 

	pop cle1+7	;CRC
	pop cle1+6
	pop cle1+5
	pop cle1+4
	pop cle1+3
	pop cle1+2
	pop cle1+1
	pop cle1	;CF


	mov	P1,#00110000b
	mov	A,cle1
	cjne  	 A,#00000001b,fin_p    ;ici il n'y a pas de clé
boucle4:
        ;une clé a été lue
	mov	P1,#00010000b	

	jnb	Enreg,test_supp
	jnb	Supp,do_enreg
	ljmp	do_reset
test_supp:
	jnb	Supp,test_cle
	ljmp	do_supp
test_cle:
	lcall	Tester_cle
	lcall	LED_OK

	ljmp	fin_p

do_reset:
	lcall	Reset_Mem
	lcall	LED_ENREG
	lcall   LED_SUPP

	ljmp 	fin_p
do_enreg:
	lcall 	Enregistrer
	lcall	LED_ENREG

	ljmp	fin_p
do_supp:
	lcall 	Supprimer
	lcall   LED_SUPP

fin_p:

        lcall   Attente_LED
 	lcall 	Init
 	lcall   Attente_Fin

	ljmp  main

	; fin du programme principal

        ;asmex1     ; retour au moniteur, ligne à supprimer pour l'EPROM

; fin de la zone de m,moire de programme en EPROM

Conclusion

Ce code a été réalisé dans le cadre de l'IUT de Tours en info et élec...
Voilà la version finale.


Bien d'autres porgrammes : http://www.webfractales.com/projets/
 

Historique

06 février 2005 12:01:42 :
26 décembre 2005 11:00:12 :
_

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,109 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.