Interruptions void main(void) { TRISD=0x04; while(1) { PORTD^=1; } } static void interrupt Nom_SPint() { if(RB3==1) PORTD I= 0x10; else PORTD=0x20; ….; } cours normal du programme événement aléatoire ou programmé 2) exécution du S-P 1) saut + sauve contexte sur pile 3 ) retour + récupère contexte de pile
41
Embed
Interruptions - GEII | Institut Universitaire de Technologiegeii.iut-nimes.fr/sites/default/files/u60/cours2_S2.pdf · Exemple de code pour liaison série asynchrone Communication
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Interruptions
void main(void)
{
TRISD=0x04;
while(1)
{
PORTD^=1;
}
}
static void interrupt Nom_SPint()
{
if(RB3==1)
PORTD I= 0x10;
else
PORTD=0x20;
….;
}cours normal du programme
événement aléatoire ou programmé
2) exécution du S-P I
1) saut+ sauve contexte sur pile
3 ) retour + récupère contexte de pile
Mémoire de programme
pile à 8 niveaux
déroulementprogramme
événement aléatoire ou programmé
saut
sauvegarde PC + sauvegarde environnement mémoire de données (soft)
• pas de composants externes. Fonctionne indépendamment de l’horloge principale => watchdog fonctionne même lorsque le processeur est en mode sommeil, (instruction SLEEP).
• Si le microcontrôleur est en mode normal, le w a t c h d o g g é n è r e u n R E S E T d u microcontrôleur (au bout de 18 ms).
• Si le microcontrôleur est en mode SLEEP, le débordement du watchdog générera un réveil du microcontrôleur
Le watchdog peut être désactivé en mettant à 0 le bit de configuration WDTE (adresse 0x2007)
CLRWDT et SLEEP réinitialiser le registre WDT et prévient donc débordement et ainsi le RESET
__CONFIG(WDTE_OFF);
#include<htc.h>void main (void){TRISD=0;while(1){__delay_ms(500);RD0^=1;
}}
reset par Watchdog toutes les 18 ms!!!!
#include<htc.h>void main (void){int i;TRISD=0;while(1){for (i=0;i<500/15;i++)
{__delay_ms(15);CLRWDT;
}RD0^=1;
}}
désactivation du reset pour les 18 prochaines ms
Conversion analogique / numérique
4 registres :
• ADCON0
• ADCON1
• ADRESH
• ADRESL
En interruption :
• bits d’autorisation : ADIE, GIE et PEIE
• drapeau d’interruption : ADIF
Config.
Résultat
1 CAN
multiplexage 8 vers 1
8 entrées (voies)
Résolution de 10 bits, 12 Tad = temps de conversion Minimum Tad = 1.6 us
Result = ADRESH*2^8+ADRESL Result = ADRESH+(ADRESL>>6)
voiesvitesse activationStart
Fini
format config. broches A/D
void main(void)
{
GIE=1; // registre INTCON
T0IE=1; // registre INTCON
OPTION_REG=0x01;
TRISD=0x04;
TMR0=5;
ADCON0 l= 0x91 ; // F/32, Voie2, ON
ADCON1 =0x80 ; // all pins analog, right justified
while(1);
}
static void interrupt test_int()
{
if( T0IF ==1 && T0IE==1)
{
ADCON0 l = 0x04;
while(!(ADCON0 & 0x04));
if((ADRESH&0x03)*256+ADRESL)>750)
PORTD^=1;
}
TMR0=5;
T0IF=0;
}
Communications séries : module USART
• Communication = transfert de données sous forme binaire entre 2 appareils
• Liaison série : transfert de données binaires séquentiellement = les bits sont transmis les uns après les autres,
• 3 fils minimum pour transmission / réception : TX, RX, masse,…
• Vitesse de transmission : bits/s ou baud
• Deux types de liaison série : - synchrone : transmission de l’horloge via ligne dédiée en plus
Ex : liaison SPI- asynchrone : synchronisation par horloges côté émetteur et
récepteur réglées de manière identique Ex : liaison RS232
Module série asynchrone (16f87xx)
Rx = RC7
Tx = RC6
Niveau logique Tension RS232 Tension TTL
" 0 " +3V à +25V 0V
" 1 " -3V à -25V +5V
équipement identique sur tous appareils sur pic 16f877
TX -> RC6 RX -> RC7
Attention broche TTL ->convertisseur
brochage d’une liaison RS232
temps
liaison asynchrone => génération d’horloge de chaque côté (Baud rate generator) pour emission et reconstruction de données
@9600 bauds : emission d’1 bit dure 104 us
Format de trame RS232
Exemple d’une trame capturée
Registres associés : état transmission
Ex : TXSTA=0x24
0 0 1 0 0 1 0 0
Registre associée : état réception
Ex : RCSTA = 0x90
1 0 0 1 0 0 0 0
Registre SPBRG : baud rate generator
Registres de réception et de transmission
RCREG = registre en lecture en réceptionTXREG =registre en écriture en émission
2 modes : maître ou esclaveFonction Label Broche Sens
Horloge SCK RC3 S
Données sortantes SDO (MISO) RC5 S
Données entrantes SDI (MOSI) RC4 E
Synchronisation maître / esclave SS/ RA5 E/S
Fonction Label Broche SensHorloge SCL RC3 EDonnées SDA RC4 E
Débit• 100 kHz • 400 kHz • 1MHz
Mode maître
• FOSC/4 (or TCY)
• FOSC/16 (or 4•TCY)
• FOSC/64 (or 16 • TCY)
• 2/(TMR2 output)
=> Max = 10Mb/s @ Fosc=40 MHz
Taille données8 bits variable : encapsulée dans trame
Module SPI : liaison full-duplex
L'émission et la réception se font simultanément par le même registre à décalage SSPSR.
Emission/réception commence à écriture 1 octet dans SSPBUF puis transfert vers registre à décalage SSPSR.Les bits sont transmis un à un sur SDO par 8 tops d’horloges.
Octet émis, remplacé par bits arrivant sur SDI. =>nouveau contenu de SSPSR (= octet reçu) copié dans SSPBUF. => mise à 1 du bit BF et SSPIF.
BF est en lecture seule =>remise à 0 = lire registre SSPBUF.
data + horlogeenvoyées simultanément à tous les esclaves
Module SPI : mode « maître » (master)
Module SPI : mode maître (master)
BF : Indicateur qui indique quand il passe à 1 que le registre SSPBUF contient l'octet qui vient d'être reçu. Ce bit est remis automatiquement à zéro au moment de la lecture du registre SSPBUF.
Module SPI : mode maître (master)
Module SPI : mode esclave (slave)
Module SPI : mode esclave (slave)
Module SPI : mode esclave (slave)
Module SPI : mode esclave (slave)
Module SPI : mode esclave (slave)
Exemple : liaison entre 2 uC master vers slave
• Configurer la direction des lignes RC4/SDI, RC5/SDO et RC3/SCK • Définir la polarité de l'horloge par le bit SSPCON.CKP • Définir la fréquence de l'horloge à l'aide des bits SSPCON.SSPMx • Définir le moment de lecture des bits entrant à l'aide du bit SSPSTAT.SMP Définir le moment d’écriture des bits sortants à
l'aide du bit SSPSTAT.CKE Valider le port par le bit SSPCON.SSPEN • Après l’initialisation, l'émission/réception se fait comme suit :
• Copier un octet dans SSPBUF pour démarrer l’émission/réception • attendre la fin en surveillant SSPSTAT.BF ou PIR1.SSPIF • La lecture de SSPBUF est la seule façon de r.à.z le bit SSPSTAT.BF • Si on l’utilise, le drapeau PIR1.SSPIF doit être remis à 0
void main(void) {
unsigned char dataTX = 0xFF; TRISA = 0x00; // broche SS sur slave TRISC = 0x00; // SDO et SCK en sortie OpenSPI(SPI_FOSC_16, MODE_10, SMPMID); // configuration de la liaison SPI