Documente Academic
Documente Profesional
Documente Cultură
Laboratorul 5
Lucrarea 1: Operarea cu modulul ECCP n modul captur
Obiective:
1. Operarea cu modulul ECCP n modul captur (Capture)
2. Generarea de ntreruperi la evenimente externe de tip apsare de buton
PIC16F684
VDD
ICSP
PIC16F684
R2
10K
D1
1N4148
VPP
VDD
P1A
R3
10K
SW1
VSS
ICSPDAT
C1
100nF
RC2
ICSPCLK
VPP
VDD
GND
PGD
PGC
LED1
R1
330R
Etape:
- conectarea PICkit 2 la circuitul electronic si verificarea detectrii corecte a tipului microcontrolerului
- crearea unui proiect nou n MikroC, alegnd modelul PIC16F684 si frecventa ceasului intern la alegere
- setarea n Edit Project a sursei de ceas de tip INTERNAL RC No Clock
- dezactivarea n Edit Project a optiunii Monitor Clock Fail-Safe
- scrierea codului
- compilarea codului pentru obtinerea fisierului de tip HEX
- importarea fisierului HEX cu programul PICkit2
- scrierea fisierului HEX n memoria program a microcontrolerului prin apsarea butonului Write
- alimentarea circuitului electronic prin bifarea optiunii VDD PICkit 2 On
- verificarea succesiva a celor patru moduri diferite de functionare:
a) captur la fiecare front descresctor
b) captur la fiecare front cresctor
c) captur la fiecare al 4-lea front ccresctor
d) captur la fiecare al 16-lea front cresctor
Exemplu de conectare:
A
SIL5
K1
K2
K1
K2
K1
K2
List de componente:
LED 20 mA
x1
R1 = 330R
x1
C1 = 100nF
x1
R2, R3 = 10K
x2
D1 = 1N4148
x1
IC1 = PIC16F684 x1
Pushbutton Switch x1
PIC16F684
.10
Registrii specifici:
CCP1CON
CCPR1H
CCPR1L
PIE1
PIR1
31
NIVEL 1
Laboratorul 5
Lucrarea 1: Operarea cu modulul ECCP n modul captur
Exemple de cod:
1. Generare de ntrerupere la fiecare front descresctor
void interrupt(){
PORTC.RC2=!PORTC.RC2;
PIR1.CCP1IF=0;
}
void main() {
OSCCON.SCS=0;
OSCCON.IRCF2=1;
OSCCON.IRCF1=1;
OSCCON.IRCF0=1;
ANSEL=0;
TRISC.RC5=1;
TRISC.RC2=0;
CCP1CON.CCP1M3=0;
CCP1CON.CCP1M2=1;
CCP1CON.CCP1M1=0;
CCP1CON.CCP1M0=0;
INTCON.GIE=1;
INTCON.PEIE=1;
PIE1.CCP1IE=1;
PIR1.CCP1IF=0;
}
//
//
//
//
//
//
//
//
Activare
Activare
Activare
Resetare
ntreruperi globale
ntreruperi periferice
ntrerupere modul CCP
flag ntrerupere modul CCP
32
//
//
//
//
//
//
//
//
//
Activare
Activare
Activare
Resetare
ntreruperi globale
ntreruperi periferice
ntrerupere modul CCP
flag ntrerupere modul CCP
NIVEL 1
Laboratorul 5
Lucrarea 2: Operarea cu modulul ECCP n modul comparare
Obiective:
1. Operarea cu modulul ECCP n modul comparare (Compare)
2. Generarea unei ntreruperi si modificarea strii unui port la un interval predefinit dup apsarea unui buton
PIC16F684
VDD
ICSP
PIC16F684
R2
10K
D1
1N4148
VPP
VDD
INT
R3
10K
SW1
VSS
ICSPDAT
C1
100nF
P1A
ICSPCLK
VPP
VDD
GND
PGD
PGC
LED1
R1
330R
Etape:
- conectarea PICkit 2 la circuitul electronic si verificarea detectrii corecte a tipului microcontrolerului
- crearea unui proiect nou n MikroC, alegnd modelul PIC16F684 si frecventa ceasului intern de 500 kHz
- setarea n Edit Project a sursei de ceas de tip INTERNAL RC No Clock
- dezactivarea n Edit Project a optiunii Monitor Clock Fail-Safe
- scrierea codului
- compilarea codului pentru obtinerea fisierului de tip HEX
- importarea fisierului HEX cu programul PICkit2
- scrierea fisierului HEX n memoria program a microcontrolerului prin apsarea butonului Write
- alimentarea circuitului electronic prin bifarea optiunii VDD PICkit 2 On
Registrii specifici:
CCP1CON
CCPR1H
CCPR1L
PIE1
PIR1
K2
Exemplu de conectare:
SIL5
K2
K1
K2
PIC16F684
.10
K1
List de componente:
LED 20 mA
x1
R1 = 330R
x1
C1 = 100nF
x1
R2, R3 = 10K
x2
D1 = 1N4148
x1
IC1 = PIC16F684 x1
Pushbutton Switch x1
33
NIVEL 1
Laboratorul 5
Lucrarea 2: Operarea cu modulul ECCP n modul comparare
Exemplu de cod:
1. Aprinderea sau stingerea unui LED conectat la portul P1A la o perioad de timp scurs de la apsarea unui buton conectat la portul INT
void interrupt(){
if (INTCON.INTF==1){
PIE1.CCP1IE=1;
CCP1CON.CCP1M3=1;
CCP1CON.CCP1M0=!CCP1CON.CCP1M0;
T1CON.TMR1ON=1;
}
if (PIR1.CCP1IF==1){
PIE1.CCP1IE=0;
T1CON.TMR1ON=0;
}
PIR1.CCP1IF=0;
INTCON.INTF=0;
}
void main() {
OSCCON=0b00110000;
ANSEL.RA2=0;
TRISA.RA2=1;
TRISC.RC5=0;
PORTC.RC5=0;
T1CON.T1CKPS1=1;
T1CON.T1CKPS0=1;
T1CON.TMR1ON=0;
CCPR1H=249;
CCPR1L=249;
CCP1CON=0b00000001;
INTCON=0b11010000;
}
//
//
//
//
//
//
//
//
//
Ceas intern
Setare port
Setare port
Setare port
kHz
modul digital
mod intrare
mod ieire
Exemplu de calcul:
TCCP1 = 4 TOSC T1CKPS (1+CCPR1L) (1+CCPR1H) = 4 / 500000 8 (1+249) (1+249) = 4 s
34
de 500
INT n
INT in
P1A in
NIVEL 1
Laboratorul 5
Lucrarea 3: Operarea cu modulul ECCP n modul PWM cu o singur iesire
Obiective:
1. Operarea cu modulul ECCP n modul generator de semnal PWM cu iesire simpl
2. Generarea unei semnal PWM cu perioad de 20 ms si durata impulsului ntre 1.2 si 1.8 ms pentru comanda unui motor servo
PIC16F684
ICSP
PIC16F684
Hitec HS-422
VDD
VPP
VDD
P1A
VSS
ICSPDAT
ICSPCLK
VPP
VDD
GND
PGD
PGC
Etape:
- conectarea PICkit 2 la circuitul electronic si verificarea detectrii corecte a tipului microcontrolerului
- crearea unui proiect nou n MikroC, alegnd modelul PIC16F684 si frecventa de 0.125 MHz
- setarea n Edit Project a sursei de ceas de tip INTRC -OSC2 as RA6
- dezactivarea n Edit Project a optiunii Fail-Safe Clock Monitor Enable
- scrierea codului
- compilarea codului pentru obtinerea fisierului de tip HEX
- importarea fisierului HEX cu programul PICkit2
- scrierea fisierului HEX n memoria program a microcontrolerului prin apsarea butonului Write
- alimentarea circuitului electronic prin bifarea optiunii VDD PICkit 2 On
- verificarea pe osciloscop a semnalelor PWM generate
Registrii specifici:
CCP1CON
CCPR1L
T2CON
PR2
Exemplu de conectare:
SIL5
PWM
VDD
GND
Formule de calcul:
List de componente:
IC1 = PIC16F684 x1
Servo Hitec HS-422 x1
PIC16F684
35
NIVEL 1
Laboratorul 5
Lucrarea 3: Operarea cu modulul ECCP n modul PWM cu o singur iesire
Exemple de cod:
1. Generarea unui semnal PWM cu perioada de 20 ms (50 Hz) si durata impulsului de 1.2 ms (factor de umplere 6%)
void main() {
OSCCON=0b00010000;
TRISC.RC5=0;
T2CON.T2CKPS1=0;
T2CON.T2CKPS0=1;
T2CON.TMR2ON=1;
PR2=155;
CCPR1L=0b00001001;
CCP1CON.P1M1=0;
CCP1CON.P1M0=0;
CCP1CON.DC1B1=1;
CCP1CON.DC1B0=0;
CCP1CON.CCP1M3=1;
CCP1CON.CCP1M2=1;
}
Pornire Timer 2
Setare valoare registru PR2
Setare primii 8 bii DB1B9:DB1B2
Setare CCP n mod de lucru PWM cu ieire simpl pe P1A
2. Generarea unui semnal PWM cu perioada de 20 ms (50 Hz) si durata impulsului de 1.8 ms (factor de umplere 9%)
void main() {
OSCCON=0b00010000;
TRISC.RC5=0;
T2CON.T2CKPS1=0;
T2CON.T2CKPS0=1;
T2CON.TMR2ON=1;
PR2=155;
CCPR1L=0b00001110;
CCP1CON.P1M1=0;
CCP1CON.P1M0=0;
CCP1CON.DC1B1=0;
CCP1CON.DC1B0=0;
CCP1CON.CCP1M3=1;
CCP1CON.CCP1M2=1;
}
//
//
//
//
Pornire Timer 2
Setare valoare registru PR2
Setare primii 8 bii DB1B9:DB1B2
Setare CCP n mod de lucru PWM cu ieire simpl pe P1A
NIVEL 1
Laboratorul 5
Lucrarea 4: Operarea cu modulul ECCP n modul PWM n semipunte H
Obiective:
1. Operarea cu modulul ECCP n modul generator de semnal PWM n semipunte
2. Generarea unei semnal PWM de 200 kHz si factor de umplere ntre 20% si 80% ms pentru comanda unui motor de c.c cu perii
PIC16F684
VMOT
VDD
L293D
ICSP
PIC16F684
DC Motor
VCC1
1Y
VPP
VPP
VDD
GND
PGD
PGC
VDD
VCC2
C1
100nF
2Y
GND
1,2EN
RA0
1A
P1A
ICSPDAT
2A
P1B
ICSPCLK
VSS
Etape:
- conectarea PICkit 2 la circuitul electronic si verificarea detectrii corecte a tipului microcontrolerului
- crearea unui proiect nou n MikroC, alegnd modelul PIC16F684 si frecventa de 8 MHz
- setarea n Edit Project a sursei de ceas de tip INTRC -OSC2 as RA6
- dezactivarea n Edit Project a optiunii Fail-Safe Clock Monitor Enable
- scrierea codului
- compilarea codului pentru obtinerea fisierului de tip HEX
- importarea fisierului HEX cu programul PICkit2
- scrierea fisierului HEX n memoria program a microcontrolerului prin apsarea butonului Write
- alimentarea circuitului electronic prin bifarea optiunii VDD PICkit 2 On
- verificarea celor dou sensuri de rotaie pentru diferite turaii ale motorului
Registrii specifici:
CCP1CON
CCPR1L
T2CON
PR2
Formule de calcul:
perioada impulsurilor PWM:
Exemplu de conectare:
SIL5
6-12V DC
L293DNE
.10
DC Brushed Motor
1,2EN
1A
1Y
GND
GND
2Y
2A
Vcc2
Vcc1
4A
4Y
GND
GND
3Y
3A
3,4EN
List de componente:
C1 100 nF
x1
IC1 = PIC16F684 x1
IC2 = L293DNE
x1
DC Motor Brushed x1
PIC16F684
L293DNE
37
NIVEL 1
Laboratorul 5
Lucrarea 4: Operarea cu modulul ECCP n modul PWM n semipunte H
Exemple de cod:
1. Comanda unui motor de curent continuu cu perii la 20% din turatia nominal
void main() {
OSCCON=0b01110000;
TRISC.RC5=0;
TRISC.RC0=0;
PORTC.RC0=1;
T2CON.T2CKPS1=0;
T2CON.T2CKPS0=0;
T2CON.TMR2ON=1;
PR2=9;
CCPR1L=0b00000010;
CCP1CON.P1M1=0;
CCP1CON.P1M0=0;
CCP1CON.DC1B1=0;
CCP1CON.DC1B0=0;
CCP1CON.CCP1M3=1;
CCP1CON.CCP1M2=1;
}
//
//
//
//
//
//
//
//
//
Pornire Timer 2
Setare valoare registru PR2
Setare primii 8 bii DB1B9:DB1B2
Setare CCP n mod de lucru PWM cu ieire simpl pe P1A
2. Comanda unui motor de curent continuu cu perii la 80% din turatia nominal
void main() {
OSCCON=0b01110000;
TRISC.RC5=0;
TRISC.RC0=0;
PORTC.RC0=1;
T2CON.T2CKPS1=0;
T2CON.T2CKPS0=0;
T2CON.TMR2ON=1;
PR2=9;
CCPR1L=0b00001000;
CCP1CON.P1M1=0;
CCP1CON.P1M0=0;
CCP1CON.DC1B1=0;
CCP1CON.DC1B0=0;
CCP1CON.CCP1M3=1;
CCP1CON.CCP1M2=1;
}
//
//
//
//
Pornire Timer 2
Setare valoare registru PR2
Setare primii 8 bii DB1B9:DB1B2
Setare CCP n mod de lucru PWM cu ieire simpl pe P1A
(PR2+1) = n / PS = 10 / 1 = 10
PR2 = 10 - 1 = 9
(PR2+1) = n / PS = 10 / 1 = 10
PR2 = 10 - 1 = 9
38
//
//
//
//
//
NIVEL 2
Laboratorul 5
Lucrarea 5: Frecventmetru numeric cu afisaj digital 2x16 caractere LCD
Obiective:
1. Operarea cu modulul ECCP pentru msurarea duratelor de timp
2. Operarea cu un display 2x16 caractere LCD cu comand serial
PIC16F882
VDD
ICSP
PIC16F882
Rx*
TX
5V
VPP
VPP
VDD
GND
PGD
PGC
VDD
LED+
VSS
ICSPDAT
GND
VIN
CCP1
ICSPCLK
Algoritm:
- setarea modulului CCP n mod de lucru captur la fiecare al 16-lea front cresctor
- setarea prescalerului timerului 1 pentru durata maxim de timp msurabil fr overflow
- activarea ntreruperii modulului CCP
- la fiecare ntrerupere:
- msurarea valorii curente de timp (T2) prin registrul CCPR1 (CCPR1H i CCPR1L)
- determinarea numrului de impulsuri TTMR1 prin calculul diferenei dintre valoarea curent (T2) i cea anterioar (T1) a CCPR1
- memorarea valorii curente a registrului CCPR1 (T1 T2)
- resetarea flagului de ntrerupere a modulului CCP
- afiarea rezultatului curent pe display
VIN
Formule de calcul:
Registrii specifici:
CCP1CON
CCPR1H
CCPR1L
T1CON
16T
perioada impulsurilor TTMR1:
N2 = 256 CCPR1H+CCPR1L
perioada T:
frecvena:
CCP1IF
T1
T2
TTMR1
VTMR1
NetMedia
2x16
Serial LCD
Exemplu de conectare:
SIL5
VIN
LED+
Rx*
Rx
5
GND
List de componente:
NetMedia 2x16
x1
IC1 = PIC16F882 x1
IC2 = DS32kHz
x1
PIC16F882
39
NIVEL 2
Laboratorul 5
Lucrarea 5: Frecventmetru numeric cu afisaj digital 2x16 caractere LCD
Exemplu de cod:
unsigned int N1,N2,N=0;
// Variabile pe 16 bii
void interrupt(){
N2=(unsigned int)(256*CCPR1H+CCPR1L);
N=N2-N1;
N1=N2;
PIR1.CCP1IF=0;
}
//
//
//
//
//
void main() {
OSCCON=0b01110000;
TRISC.RC6=0;
TRISC.RC2=1;
UART1_Init(9600);
UART1_Write(14);
delay_ms(1000);
UART1_Write(20);
UART1_Write(255);
UART1_Write(12);
UART1_Write(13);
UART1_Write_Text("Frecv.:
//
//
//
//
//
//
//
//
Hz");
T1CON.T1CKPS1=1;
T1CON.T1CKPS0=1;
T1CON.TMR1ON=1;
CCP1CON=0b00000111;
INTCON=0b11000000;
PIE1.CCP1IE=1;
PIR1.CCP1IF=0;
while(1){
display(4000000/N);
}
// Pornire Timer 1
40
c) determinarea prescalerului PS
T1CKPS = n / 65536 = 400000 / 65536 = 6.103515625 (se alege 8)
d) determinarea noii valorii maxime a TTMR1 MAX
TTMR1 MAX = 4 TOSC T1CKPS 65536 = 0.262144 s