I²C ( TWI ) UART / ATmega32 - PCF8583
Mise en œuvre du circuit test de mise à l’heure et d’affichage des secondes d’une RTC (réal time clock) et étude d’un prog en assembleur (misa_lheure.asm) qui gère le bus I²c. La partie ‘suivi ’ qui teste l’évolution interne et la prise en compte des acknoledges a volontairement été écarté (par souci de simplification) mais reste disponible pour celui qui s’y intéresse.
Montage « mise a l’heure » d’un pcf 8583 connecté au stk200 muni d’un processeur avec interface ‘TWI’ l’atmega 32 ,en utilisant les objets de ce projet..
- Brancher la platine STK 200 au pc avec le cable ‘ISP vers port paralléle.
- Brancher l’alim 9v à l’embase Roka
- Mettre en place l’ATMEGA 32 sur le support noté ‘AD PARTS’ voir RTC4.JPG
Programmation de l’ATMEGA32 :
- Lancer PONY
PROG 2000
- Setup, Interface, Avrisp, Port Parallèle, OK
- Setup , Calibration , OK
- Command , Security config bits , Read , OK*
- Comparer le résultat au fichier Fusebits.BMP corriger si nécessaire
- Command , ERASE , OK si successfull
- File open device file …misa_lheure.hex orécédamment compilé
- Command , Write All
- exit

Monter le circuit d’essai à partir des fichiers RTC1.jpg à RTC4.JPG
- Confectionner la nappe de connection RTC5.JPG
RTC5.JPG
- Relier la plaquette d’essai au STK200
- Contrôler puis mettre sous tension
Les secondes s’affichent
sur le port B de l’STK200 et la led
de contrôle reliée à
pcf8583 est cadencée à la seconde voir RTC.MOV.
misa_lheure.asm :
;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<<TWINT)|(1<<TWSTA)|(1<<TWEN)
; preparation condition start
out
TWCR,A
; envoi condition de start sur le bus
rcall WAIT
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RESTART:
ldi
A,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
; preparation condition start
out
TWCR,A
; envoi condition de start sur le bus
rcall WAIT
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SLAVE_ADR_w:
out
TWDR,SLA_W
; place la dans le 'TW dAtA register'
ldi A,(1<<TWINT)|(1<<TWEN); effacement
twint (à 1) et activation module twi
out
TWCR,A
; envoi Attente extinction de twint (twint à 1 voir
doc)
rcall
WAIT
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SLAVE_ADR_r:
out
TWDR,SLA_R
; place la dans le 'TW data register'
ldi A,(1<<TWINT)|(1<<TWEN); effacement
twint (à 1) et activation module twi
out
TWCR,A
;
envoi
rcall
wait
; Attente extinction de twint (twint à 1 voir doc)
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WORD_ADR:
out
TWDR,WORD_AD
; charge a dans le TWDR
ldi A,(1<<TWINT)|(1<<TWEN)
out
TWCR,A
; envoi sur le bus
rcall
wait
; Attente effacement twint
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TR_DATA:
out
TWDR,DATA
; envoi dans TWdata register
ldi A,(1<<TWINT)|(1<<TWEN) ;
out
TWCR,A
; envoi sur le bus
rcall wait
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RD_DATA:
ldi A,(1<<TWINT)|(1<<TWEN) ;
out
TWCR,A
; envoi sur le bus
rcall WAIT
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
STOP:
ldi
A,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
out
TWCR,A
; STOP et raz
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WAIT:
; Attente extinction de twint (twint à 1 voir doc)
in
A,TWCR
; et si ack ou nack
sbrs
A,TWINT
;
rjmp WAIT
ret
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TEMPO:
ldi
R23,0xff
;
BCLB:
;
ldi
R24,0x34
;
BCLA:
;TEMPO 10ms ,ff,34
dec
r24
;
brne
BCLA
;
dec
r23
;
brne
BCLB
;
ret
Bibliographie :
- AtMega32DocFr.pdf
- AVR300.pdf
- i2c_overview_2h_2003.pdf
- Les Atmegas.pdf
- les bus.pdf
- PCF8583.pdf
- pcf8583all.doc




