Vous êtes sur la page 1sur 5

; "Circuit de test : clignotant à LED"

; (C) Fabrice Sincère, novembre 2007


; IUT Nancy-Brabois
; Version 1.00
; Microcontrôleur PIC 16F876A
; Microchip MPLAB IDE
; Langage : assembleur

List p=16F876A ; processeur utilisé


#include <p16F876A.inc>

__config _RC_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF &
_WRT_OFF & _CPD_OFF & _CP_OFF
;bits de configuration :
;oscillateur RC
;watchdog timer OFF
;power up timer ON
;brown out detect ON
;low voltage program OFF
;flash program write protection off
;data EE read protect OFF
;code protect OFF

;xxxxxx
; Macro
;xxxxxx

bank1 macro ; passage en banque 1


bsf STATUS,RP0
endm
bank0 macro ; passage en banque 0
bcf STATUS,RP0
endm

;xxxxxxxxxxxxxxxxxxxx
; Démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx

org 0x0000
goto initialisation

; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; Routine d'interruption
; 1 source d'interruption : TMR0 en mode timer
; Toutes les 256*1 = 256 cycles (prescaler 1:1)
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

org 0x0004 ; vecteur d'interruption


comf PORTA , f ; on inverse le niveau logique de la
sortie RA1
; => inversion de
l'état de la LED
bcf INTCON,TMR0IF ; on efface le drapeau TMR0IF
retfie ; retour d'interruption

;xxxxxxxxxxxxxxx
; Initialisation
;xxxxxxxxxxxxxxx

initialisation
bank1

bcf OPTION_REG , T0CS


; bit 5 (T0CS) = 0 : TMR0 en mode timer
; (OPTION_REG) = (11011111)
; prescaler 1:1

movlw B'00000110'
movwf ADCON1 ; la broche RA1 est configurée commme entrée/sortie
numérique

bcf TRISA , 1
; bit 1 du port A (RA1) = 0 : configuration en sortie (commande de
la LED)
; (TRISA) = (11111101)

bank0

movlw B'10100000'
movwf INTCON
; bit 7 (GIE) = 1 : autorisation globale des interruptions
; bit 5 (TMR0IE) = 1 : autorisation de l'interruption TMR0
; bit 2 (TMR0IF)= 0 : on efface le drapeau de l'interruption TMR0

;xxxxxxxxxxxxxxxxxxxxx
; Programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

; on attend le débordement de TMR0 (0xFF -> 0x00)


; ce qui génère une interruption

goto debut_programme

END
#include <P16F877A.inc>
__config _RC_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _WRT_OFF &
_CPD_OFF & _CP_OFF
;Définition du µC utilisé, des constantes spécifiques au µC et des

;paramètres de configuration encodés lors de la programmation.

org 0x0000 ;Adresse de départ après un reset du µC.

init clrf PORTB

movlw 0x00

movwf TRISB

clrf PORTA

movlw B'00000001'

movwf TRISA

;Initialisation :
;Remise à zéro des bascules D des différents ports utilisés et

;configuration des entrées/sorties.

boucle btfsc PORTA,4

goto eteindre

bsf PORTB,0

goto boucle

eteindre bcf PORTB,0

goto boucle

END

Code
Program to demonstrates the LED fading using PWM signals.

#include<pic16f877a.h>
void delay(int cnt) {
while (cnt--);
}
int main() {
char dutyCycle = 0;
TRISC = 0x00; // Configure PORTC as output(RC2-PWM1, RC1-PWM2)
CCP1CON = 0x0F; // Select the PWM mode.
PR2 = 100; // Set the Cycle time to 100 for varying the duty cycle from 0-100
CCPR1L = 50; // By default set the dutyCycle to 50
TMR2ON = 1; //Start the Timer for PWM generation
while (1) {
for (dutyCycle = 0; dutyCycle < 100; dutyCycle++) // Keep increasing the dutyCyle to
increase the brightness of LED
{
CCPR1L = dutyCycle;
delay(10000);
}
for (dutyCycle = 100; dutyCycle > 0; dutyCycle--) // Keep reducing the dutyCyle to decrease
the brightness of LED
{
CCPR1L = dutyCycle;
delay(10000);
}
}
}

MikroC Program
unsigned int adc;
void main()
{
ADCON1 = 0x80;
TRISA = 0xFF; // PORTA is input
TRISC = 0x3F; // Pins RC7, RC6 are outputs
TRISB = 0; // PORTB is output
do
{
adc = ADC_Read(1); // Get 10-bit results of AD conversion
//of channel 1
PORTB = adc; // Send lower 8 bits to PORTB
PORTC = adc >> 2; // Send 2 most significant //bits to
RC7, RC6
} while(1);
}

You can vary the analog input value by varying the resistance of the potentio meter in the
circuit.

This tutorial covers only the basic ADC operation. If you want to know more about it, please
refer the datasheet of PIC 16F877A. If you have any doubt regarding this please do comment.

4.2 Programme en assembleur

Compl´etez le code suivant : un _ _ correspond `a une op´erande, trouvez l’op´erande qui convient.

LIST P=18F4520 #include <P18F4520.inc>

; Initialisation du vecteur RESET org h’0000’ goto init

; Initialisation du microcontrôleur ; ; config PORTC

init

clrf PORTC movlw _ _ movwf TRISC ; RC0 `a RC7 en Sortie

; Configuration du module PWM movlw _ _ movwf PR2 ; frequence 600Hz

movlw _ _ movwf CCPR1L ; Rapport cyclique .5

movlw _ _ movwf CCP1CON ; Rapport cyclique .5, mode PWM tout en active low, single output

; Configuration du Timer2 movlw _ _ ; movwf T2CON ; TMR2 On, post=1, pres=16

; programme principal ; main nop goto main


END

Vous aimerez peut-être aussi