ACCUEIL  ACTUALITES  FORUMS  WIKI  TELECHARGEMENTS  LIENS
Menu principal
ATMEL AVR
PCB - CAO
ELECTRONIQUE
Qui est en ligne
8 utilisateur(s) en ligne

Membre(s): 0
Invité(s): 8

plus...
Infos du site
JELECTRONIQUE - Atmel (ATMEGA,AT90S8535), AVR, Microcontroleurs, CodeVision, dongle ISP, programmateurs

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 

stk200

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
fuse_bits

Monter le circuit d’essai à partir des fichiers RTC1.jpg à RTC4.JPG

  • Confectionner la nappe de connection  RTC5.JPG

cable

RTC5.JPG
  • Relier la plaquette d’essai au STK200 
schema
RTC1.JPG

connex

RTC2.JPG

connex

RTC3.JPG

stk200

RTC4.JPG

  • 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 à la RTC

 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 :


Auteur : MRJJ