;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; mois de JUIN 2005 ; tester un PCF 8583 (voir doc et schemats ci joints)sur stk200 ; scl va sur PORT c bit0 de l'atmega32 (voir doc atmega32 page2) ; sda va sur PORT c bit1 de l'atmega32 ; quartz Atmega32 = 4mhz ; quartz pcf8583 = 32768khz (quartz de montre) ; Fuse bits Atmega32 (voir figure fusebits.bmp) ; but : mise à l'heure clock pcf8583) puis lire les secondes sur PORT B ; DATE: mercredi 29 juin 2005 9heures 30 min 0 secondes 0 centiemes ; Enchainement utilisé:voir programme principal ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx .include "M32def.inc" ; definition des registres programme .def A = R16 ; Accumulateur .def WORD_AD = R17 ; registre cellule interne du slave .def DATA = R18 ; registre de la donnée à ecrire ou lire .def SLA_W = R21 ; Adresse esclace en écriture doc pcf8583 p 16 .def SLA_R = R22 ; Adresse esclave en LECTURE ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;DECLARATION VECTEURS D INTERRUPTION .CSEG .ORG 0x0000 ;début mémoire programme rjmp RESET ;RESET ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;PROGRAMME DE RESET RESET: ldi A,low(RAMEND) out SPL,A ; Initialisation de la pile à ldi A,high(RAMEND) ; l'Adresse haute de la SRAM out SPH,A ;INIT PORTS ATMEGA32 ldi A, 0xff out DDRB,A ; PORT A en sortie suivi si erreur ;INIT TWI ATMEGA32 ldi A, 12 ; TWI clock 100kHz at 4 MHz out TWBR, A ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;Mise a l'heure : ;mercredi 29 juin 2005 9heures 30 min 0 secondes 0 centiemes rcall START ldi SLA_W,0xA0 ; Adresse-ecriture-esclave voir doc philips rcall SLAVE_ADR_w ldi WORD_AD,0x00 ; Adresse status pcf 8583 =@00 rcall WORD_ADR ; envoi ldi DATA,0x00 ; juste l'heure , sans alarme doc p6 rcall TR_DATA ; et en 32768khz ldi WORD_AD,0x01 ; Adresse centiemes rcall WORD_ADR ldi DATA,0x00 ; 0 rcall TR_DATA ldi WORD_AD,0x02 ; Adresse secondes rcall WORD_ADR ldi DATA,0x00 ; 0 rcall TR_DATA ldi WORD_AD,0x03 ; Adresse minutes rcall WORD_ADR ldi DATA,0x30 ;30min en hexa voir doc 8583 p 7 rcall TR_DATA ldi WORD_AD,0x04 ; Adresse heures voir doc 8583 p 8 rcall WORD_ADR ldi DATA,0x09 ; 9heures + mode 24heures(0) rcall TR_DATA ldi WORD_AD,0x05 ; Adresse annee/jour voir doc 8583 p 8 rcall WORD_ADR ldi DATA,0xE9 ; year = (prochaine bissextile) - (actuelle) rcall TR_DATA ; donc 2008-2005=3 voir p 8 fig6 ldi WORD_AD,0x06 ; Adresse mois / jour de semaine rcall WORD_ADR ldi DATA,0x66 ; voir page 8 rcall TR_DATA rcall STOP rcall TEMPO ; Attente 10ms ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;Mise en mode clock ldi SLA_W,0xA0 ; Adresse-ecriture-esclave voir doc philips ldi WORD_AD,0x00 ; Adresse status register pcf ldi DATA,0x00 ; mode clock voir doc sous status control rcall START rcall SLAVE_ADR_w rcall WORD_ADR ; envoi Adress du status reg rcall TR_DATA ; envoi code pour event counter rcall STOP rcall TEMPO ; Attente 10ms ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; PROGRAMME PRINCIPAL: ; LECTURE des secondes et Affichage sur PORT B LECTURE: ldi SLA_W,0xA0 ; Adresse-ecriture-esclave ldi SLA_R,0xA1 ; Adresse-LECTURE-esclave voir doc philips ldi WORD_AD,0x02 ; Adresse cellule memoire 2 (word Adress) rcall START rcall SLAVE_ADR_W ; envoi rcall WORD_ADR ; envoi rcall RESTART ; envoi restart rcall SLAVE_ADR_R ; envoi rcall RD_DATA ; data sur le bus rcall STOP ; STOP rcall TEMPO ; Attente 10ms in DATA,TWDR ; contenu mis dans registre DATApour Affich com DATA ; oui pour Affichage adapte au stk200 out PORTb,DATA ; Affichage rjmp LECTURE ; LECTURE suivante ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx START: ldi A,(1<