Inter Fa Cage

15
1 Mini-projet INTERFACAGE Thème : Programmation de périphériques sur les bus SPI en langage C

Transcript of Inter Fa Cage

Page 1: Inter Fa Cage

1

Mini-projet INTERFACAGE

Thème : Programmation de périphériques sur les bus SPI en langage C

Page 2: Inter Fa Cage

2

Table des matières I. Introduction ..................................................................................................................................... 3

II. Gestion de la liaison série ................................................................................................................ 3

Objectifs........................................................................................................................................... 3

Description ...................................................................................................................................... 3

Programme ...................................................................................................................................... 4

Explications ...................................................................................................................................... 6

III. Gestion de la liaison SPI pour le capteur de température .......................................................... 8

Le capteur de température TMP 125 .............................................................................................. 8

Le bus SPI ......................................................................................................................................... 9

IV. Conclusion ................................................................................................................................. 14

V. Bibliographies ................................................................................................................................ 15

Page 3: Inter Fa Cage

3

I. Introduction

Le but du projet est d’illustrer le cours d’Interfaçage au travers d’un exemple qui met en évidence le

transfert de données entre différents composants. Le principe est de récupérer l’information d’un

capteur de température et de l’afficher en utilisant un afficheur graphique. Par manque de temps, on

se contentera d’utiliser l’HyperTerminal pour afficher la température.

Logiciels et matériels utilisés :

Comme pour le projet de première année on utilise les cartes ATMEGA16 (munies d’un afficheur

graphique SP5 GFX1 et d’un capteur de température TMP125) et le logiciel AVR STUDIO.

II. Gestion de la liaison série

Objectifs

Dans un premier temps, on délaisse le capteur de température pour ne s’intéresser qu’à l’affichage

d’une chaîne de caractères quelconques.

Description

La liaison série (USART) du microcontrôleur ATMEGA16 permet d’envoyer et de recevoir des

données. Cette interface est utilisée pour établir un dialogue entre le microcontrôleur et

l’ordinateur.

Pour pouvoir communiquer, pc et microcontrôleur doivent partager les mêmes paramètres de

transmission. La vitesse de transmission et donc fixée à 9 600 bps (correspondant à un temps bit).

Ci-dessous, figure le schéma des connexions relatives au microcontrôleur ATMEGA16 et aux

différents composants mis en jeu dans le système :

Page 4: Inter Fa Cage

4

Schéma des différentes connexions

Programme

#include <stdio.h>

#include <avr\io.h>

#define FOSC 11059200// Clock Speed

#define BAUD 9600

#define MYUBRR FOSC/16/BAUD-1

// Partie Initialisation

void USART_Init(void)

{ /* Vitesse de transmission */

UBRRH = 0x00;

UBRRL = 71; /* pour fixer BAUD=9600bps */

UCSRB = 0x18; /* Active mode récepteur et transmetteur */

UCSRC = 0x86;

UCSRA = 0x20;

}

Page 5: Inter Fa Cage

5

//Partie Transmission

void USART_Transmit(unsigned char data )

{ /* Attendre que la mémoire tampon soit vide pour transmettre */

while ( !( UCSRA & (1<<UDRE)) );

/* Ecriture dans la mémoire tampon, envoi des données */

UDR = data;

}

//Programme principal

void main(void)

{ USART_Init ();

int i;

for(i=0; i<10;i++)

{ unsigned char caractere = 'J';

USART_Transmit(caractere);

}

while(1);

}

Page 6: Inter Fa Cage

6

Explications

// Partie Initialisation

Registre UBBR :

On désire une vitesse de transmission de 9600 bauds avec un quartz de 11,059MHz : dans ce cas la

datasheet de l’ATMEGA nous indique que UBRR = 71. De plus, étant donné qu’on utilise une petite

fréquence d’horloge, il est possible de coder seulement sur 8 bits donc UBBRH = 0 et UBBRL = 71.

Registre UCSRA : 00100000

Bit 5 - UDRE à 1, indique que la mémoire tampon est vide et prête pour l’écriture. Tous les autres bits

à 0.

Page 7: Inter Fa Cage

7

Registre UCSRB : 00011000

Bit 4 - RXEN à 1, active le mode récepteur.

Bit 5 - TXEN à 1, active le mode transmetteur.

Tous les autres bits à 0.

Registre UCSRC : 10000011

Bit 1, 2 - UCSZ0, UCSZ1 à 1, détermine la taille des caractères à transmettre, ici 8 bits suffisent pour

afficher un caractère à la fois(le bit 3 - UCSZ2 du registre UCSRB est mis à 0. En effet il participe lui

aussi à la définition de la taille des caractères).

Bit 7 - URSEL à 1, sélection du registre UCSRC ???

Tous les autres bits à 0.

//Partie Transmission

La fonction « USART_Transmit » autorise l’écriture dans le registre UDR (TXB), à condition que la

mémoire tampon soit vide. Elle permet aussi de lire puis d’afficher les données contenues dans la

partie réception du registre UDR (RXB).

//Programme principal

La boucle for permet d’écrire la chaîne de caractères : « JJJJJJJJJJ ».

Page 8: Inter Fa Cage

8

III. Gestion de la liaison SPI pour le capteur de température

On utilise cette fois le capteur de température TMP125 .Toutefois on ne va pas chercher à afficher la

température sur l’afficheur SP5 GFX1 par manque de temps. On se contentera d’afficher la

température sur l’interfaçage Terminal de Windows.

On utilisera pour cela la liaison SPI (Serial Peripheral Interface) de l’Atmega 16. Une liaison SPI est un

bus de donnée série qui exploite plusieurs broches du port B du processeur. Les circuits

communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la

communication.

Le bus SPI contient 4 signaux logiques :

SCK - Horloge MOSI - Sortie du maitre MISO - Entrée du maitre SS - Sélection de l’esclave

Nous utiliserons le port C afin de sélectionner les circuits CS. Ici étant donné que nous utiliserons seulement le thermomètre nous n’utiliserons que le bit 7 du port C.

Le capteur de température TMP 125

Nous remarquons tout d’abord qu’il est primordial d’activer le capteur sur le port C afin de pouvoir l’utiliser

Page 9: Inter Fa Cage

9

Toutefois, nous utiliseront une boucle qui retarde l’activation du capteur, car le chronogramme est décalé par rapport au chronogramme SCK.

On obtient ainsi le code suivant :

/*CS_TMP permet de sélectionner et d'activer le capteur température */

int i;

for(i=0; i<10;i++)

{ PORTC =0x7F;

}

Le bus SPI

On initialise tout d’abord le bus SPI

Registre du port B

Registre DDRB : 10111111 Port B : 10111111 On met toutes les broches en sorties à l’exception de PB6, car MISO est une entrée.

Page 10: Inter Fa Cage

10

Registre du port C

Registre DDRB : 11111111 Port B : 11111111 On met toutes les broches en sorties bien que l’on utilisera car le port PC7 pour le capteur température.

Registre SPCR

Registre SPCR : 01011101

Bit 6 – SPE: SPI Enable à 1 Il permet d’activer le mode SPI du microcontrôleur Bit 4 – MSTR: Master/Slave Select à 1 On sélectionne le mode maitre du SPI en mettant le bit à 1 Bit 3 – CPOL: Clock Polarity à 1 Bit 2 – CPHA: Clock Phase à 1 On souhaite le mode 3 pour le SPI

Page 11: Inter Fa Cage

11

Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0 On choisit ici le temps d’horloge du SPI par rapport à la fréquence d’oscillation du microcontrôleur On désire un temps d’horloge lent.

On obtient ainsi le code suivant pour l’initialisation du SPI maitre:

void SPI_MasterInit(void)

{ DDRB=0xBF;/* tout sauf MISO qui est une entrée */

DDRC=0xFF;/* On sélectionne tout bien que l'on utilisera que le bit 7 */

SPCR =0x5d;/* Enable SPI

PORTB=0xBF;

PORTC=0xFF;

SPSR=0x00;

}

On écrit ensuite les fonctions d’écriture et de lecture avec des temps d’attente pour ces étapes.

Page 12: Inter Fa Cage

12

Registre SPDR

Ce registre est le registre d’écriture et de lecture pour les données du SPI. Il fait la liaison pour envoyer et recevoir les données au SPI.

Le capteur nous renvoi 16 bits, nous devons donc mettre en place un algorithme.

Dans un premiers temps, on écrit les 8 premiers bits de données du capteur de température. On enregistre ces données dans le SPDR, puis on les décale de huit bits vers la gauche. Ainsi on possède la partie haute.

Ensuite dans la partie lecture, on ajoute les 8 bits restants. D’où temperature = SPDR + temperature. On a la totalité du registre de notre capteur température (De D15 à D0). Toutefois, seuls les bits D14, D13, D12, D11, D10, D9, D8, D7 nous intéresse. Ainsi on enlève d’abord l’octet D15 puis on décale l’ensemble sur le droite (voir algorithme ci-dessous)

Page 13: Inter Fa Cage

13

void SPI_Master(char data) { int temperature; /* Fonction d’écriture */ SPDR = data; /* Temps d’attente pour la fonction d’écriture */ while(!(SPSR & (1<<SPIF))); temperature=SPDR; temperature=temperature<<8; /* Fonction de lecture */ SPDR = data; /* Temps d’attente pour la fonction de lecture */ while(!(SPSR & (1<<SPIF))); temperature=SPDR+temperature; /* On décale de 1 octets sur la droite pour enlever le 0 de D15 car seul D14 à D7 nous intéresse*/ temperature=temperature<<1; /* On décale les 16 octets sur la gauche pour obtenir juste 8 octets (on récupère la partie haute et on met le signe en poids fort)*/ temperature=temperature>>8; }

On écrit le programme principal en faisant appel aux fonctions déjà établis : En ce qui concerne l’affichage de la chaine de caractère, on décide d’utiliser un tableau qui nous renverra tous les caractères de données du capteur de température par une boucle while. En faisant varier une variable i, chaque caractère aura sa place dans le tableau. On utilise la fonction USART_Transmit programmée précédemment. Puis, on affiche la température avec la fonction sprintf.

Page 14: Inter Fa Cage

14

Programme principal

void main(void) { USART_Init(); SPI_MasterInit(); SPI_Master(temperature); int i; /*CS_TMP permet de sélectionner et d'activer le capteur température ou alors avec al boucle*/ for(i=0; i<10;i++) { PORTC =0x7F; } /* Il ne reste plus qu'à afficher lachaine de caractère */ char tab[i]; sprintf(tab,'%d',temperature); i=0; while(tab[i] !=0) { USART_Transmit(tab[i]); i++; } while(1); }

Toutefois, le test de ce programme ne nous renvoie pas la température sur l’HyperTerminal. Par

manque de temps, le problème n’a pas été résolu !

IV. Conclusion

Nous n’avons pas totalement répondu au cahier des charges qui nous était imposé car le programmé

testé ne nous renvoie pas la température. Toutefois, ce projet nous a parmi d’approfondir le cours

d’Interfaçage de manière pratique. La gestion de l’USART pour le processeur ATMEGA 16 a été

validée, puisque le programme nous renvoie des données sur le terminal de l’ordinateur

Page 15: Inter Fa Cage

15

V. Bibliographies

Les tableaux et figures sont des captures d’écran des différentes datasheet.

Datasheet du ATMEGA 16. http://www.datasheetcatalog.org/datasheet/atmel/2466S.pdf

Datasheet du TMP125. http://pdf1.alldatasheet.com/datasheet-pdf/view/114779/TI/TMP125.html