Bonjour,
Je réalise un bus I2C en assembleur avec un microcntroôleur 80C552 vers une mémoire EEPROM 8582.
J'ai déjà codé l'emission desdonnées, mais le programme n'entre en interruption et donc n'envoie les données qu'aléatoirement. Il met parfois plusieures minutes pour cela.
Voila le programme pour plus d'infos.
Merci de votre aide.
Code:include reg552.inc ;Positionner des bits utiles a la routine FIN_TR equ 07fh ;Donnees immediates a ecrire dans le registre S1CON ;(cas du 80C552 version 12Mhz, l'I2C fonctionnant a 100kbit/s) ENS1_NOTSTA_STO_NOTSI_AA_CR0 equ 0d5h ;genere un stop (CR0 equ 100khz) ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 equ 0c5h ;relache le BUS et envoie acquittement ENS1_NOTSTA_STO_NOTSI_NOTAA_CR0 equ 0c1h ;relache le bus et n'envoie pas l'acquittement ENS1_STA_NOTSTO_NOTSI_AA_CR0 equ 0e5h ;relache le bus et le reprends avec un STA ;Donnees immediates generales OWNSLA equ 031h ;adresse personnelle ENSIO1 equ 0a0h ; EA+ES1 autorise l'interrupion SIO1 doit etre ecrit dans ENI0 OFFSET equ 050h ;adresse de base des routines de traitement d'interruption liees ADRESC_W equ 0a0h ;ex. adresse esclave + bit ecriture ADRESC_R equ 0a1h ;ex. adresse esclace + bit lecture FIN equ 080h ;indic de fin de message FIN1 equ 040h ;Emplacements de registres particuliers en RAM internes MTD equ 030h ;adresse de base MST/TRX/DATA MRD equ 038h ;adresse de base MST/REC/DATA SRD equ 040h ;adresse de base SLV/REC/DATA STD equ 048h ;adresse de base SLV/TRX/DATA BACKUP equ 053h ;retour de backup de NOMBOCT ;pour faire revenir de sauvegarde NUMBYTMST en cas de perte d'arbritage NOMBOCT equ 052h ;nombre d'octets a transmettre ou recevoir SLA equ 0a0h ;contient l'adresse de l'esclave et le sens de transfert (R/W) a transmettre HADD equ 050h ;octet d'adresse haute des differents traitements dont l'adresse basse ;est fournie par la valeur du registre de status S1STA DAT equ 70h ;Routine d'utilisation Code at 4100h INIT: mov p4,#00h ;!!! TEST !!! mov S1ADR,#OWNSLA ;chargement adr perso + autorisation mov sp,#0a0h ;positionnement du pointeur de pile setb p1.6 ;p1.6 niveau haut (SCL) setb p1.7 ;p1.7 niveau haut (SDA) mov HADD,#OFFSET orl IEN0,#ENSIO1 ;autorisation interruption SIO1 mov S1CON,#ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 ;initialisation mode maitre ;caracteres a envoyer mov r1,#DAT mov @r1,#0000h inc r1 mov @r1,#0041h inc r1 mov @r1,#0042h mov p4,#03h ;!!! TEST !!! ever : mov SLA,#ADRESC_W ;W=ecriture mov NOMBOCT,#3 acall trans acall boucle ici: mov p4,#00h lcall 1212h ;routine de départ de transmission "maitre" trans: mov FIN_TR,#000h ;mise a zero indic fin de message mov S1CON,#ENS1_STA_NOTSTO_NOTSI_AA_CR0 ret boucle: mov a,FIN_TR jbc acc.6,etia jbc acc.7,fini mov p4,S1STA sjmp boucle etia: acall trans sjmp boucle fini: ret code at 402bh push psw push S1STA push HADD ret code at 5000h acall fct_00 pop psw reti code at 5008h acall fct_08 pop psw reti code at 5018h acall fct_18 pop psw reti code at 5020h acall fct_20 pop psw reti code at 5028h acall fct_28 pop psw reti fct_00: mov S1CON,#ENS1_NOTSTA_STO_NOTSI_AA_CR0 ;raz SI mise a 1 de STO et AA mov FIN_TR,#FIN1 mov p4,#0aah ret fct_08: ;1ere lcall 1212h mov p4,#1Fh;!!! TEST !!! mov S1DAT,SLA ;chargement de SLA+R/W ds tampon mov S1CON,#ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 ;raz SI mov r1,#DAT ; adresse puis data 2 octets mov BACKUP,NOMBOCT ;sauvegarde valeur initiale ret fct_18: ;2eme mov S1DAT,@r1 mov S1CON,#ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 ;raz SI et AA mov p4,#00110111b;!!! TEST !!! ret fct_20: ;Si Ack=0 mov S1CON,#ENS1_NOTSTA_STO_NOTSI_AA_CR0 ;mise a 1 STO, raz SI mov NOMBOCT, BACKUP mov FIN_TR,#FIN1 mov p4,#01h;!!! TEST !!! ret fct_28: ;3eme djnz NOMBOCT,CONTINU mov S1CON,#ENS1_NOTSTA_STO_NOTSI_AA_CR0 ;raz SI et mise a 1 de AA mov FIN_TR,#FIN ;positionnement indicateur de fin de transmission mov p4,#11101110b;!!! TEST !!! sjmp fin_28 CONTINU: inc r1 mov S1DAT,@r1 mov S1CON,#ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 ;raz SI et AA mov p4,#11001100b;!!! TEST !!! fin_28: ret end
-----