grupa 432 B
-PROIECT 2-
Tema nr 12
1
Date initiale de proiectare
0/1
1/0 0/0 1/0
0 1 2
0/0
1/0
2
CUPRINS
Date de Proiectare…………………………………..2
Rezumatul proiectului………………………………4
Cuprins………………………………………………….3
Bibliografie……………………………………………..20
3
REZUMATUL PROIECTULUI
- a doua etapa este conceperea organigramei pe baza careia vom scrie efectiv
programul, cu explicarea exacta a fiecarui bloc si precizarea schimbarilor care au
loc in automat la schimbarea semnalelor de intrare
4
CAPITOLUL I: INTRODUCERE TEORETICA
5
De magistrala interna de 8 biti sunt legate si celelalte componente ale
sisstemului: cei 6 pini multifunctionali(GP0.. GP5) care constituie portul general
de intrare-iesire, Comparatorul analogic si referinta, Convertorul analog-numeric
cu patru canale de itnrare, circuite temporizatoare Timer0 si Timer1 precum si
Memoria suplimentara de date(EEPROM).
Circuitul mai contine Oscilatorul intern, Generatorul de secvente de timp
precum si o serie de componente suplimentare: Temporizatorul de alimentare,
Temporizatorul de pornire a oscilatorului, Circuitul de resetare la
alimentare(Power-on Reset), Temporizatorul circuit de supraveghere(Watchdog
Timer) si Detectorul de avarie a tensiunii de alimentare.
Memoria este organizata in memorie de program si memorie de date.
Memoria de program: Microcotnrollerul contine un contor de
instructiuni(PC) pe 13 biti capabil a adresa un spatiu de 8KX14 de memorie de
program. La microcontrollerul 12F675 numai 1K din acest spatiu este fizic
implementat(de la 0000H la 3FFH. Vectorul de initializare(prima instructiune
executate dupa o operatie de resetare hardware)(RESET) se afla stocat la adresa
0000H iar vectorul de intrerupere la adresa 0004H. Memoria stiva de 8 nivele
este implementata pe o zona speciala de memorie cu 8 locatii interconectate
pentru a realiza functia LIFO(Last In First Out) necesara memoriei stiva.
Memoria de date este de tip SRAM, organizata pe cuvinte de 8 biti si
formata din doua bancuri. Fiecare banc contine in primele 32 de locatii(adresele
de la 00H la 1FH, respectiv 80H la 9FH) registre cu functii speciale(Special
Function Register) iar pe urmatoarele 64 locatii sunt realizate registrele de uz
general(aceleasi in ambele bancuri) de la adresa 20H la 5HF
Selectarea bancului de lucru se face cu ajutorul bitului 5 din registrul de
stare(STATUS,5) notat cu RP0, avand urmatoarea semnificatie:
RP0 = 0 Bancul 0 este selectat
RP0 = 1 Bancul 1 este selectat
Registrele cu functii speciale sunt foosite de CPU respectiv de circuitiele de
intrare-iesire(periferice) pentru a selecta anumite optiuni si a asigura in felul
acesta buna functionare a microcontrolerului. Registrele cu functii speciale pot fi
impartite in doua categorii:
6
In PICkit 1 FLASH Starter Kit sunt incluse urmatoarele blocuri componente:
- Un soclu de evaluare(Evaluation Socket) pentru PIC 12F675(capsula
miniDIP de 8 pini) si pentru PIC 16F630/676(Capsula DIP de 14 pini)
- Bloc hardware pentru programarea microcontrollerelor din soclu cu
procedura ICSP (In-Circuit-Serial-Programming);
- Matrice de 8 LED-uri pentru afisarea unor variabile de iesire, matrice
comandata de 4 pini ai portului general de intrare-iesire;
- Doua LED-uri de semnalizare: un LED rosu pentru semnalizarea prezentei
alimentarii pe placa, un LED galben pentru semnalizarea faptului ca o operatie de
programare, verificare sau citire este in curs de desfasurare;
- Un microswitch SW1, cablat pe intrarea GP3 (RA3), utilizat ca intrare de
date logice pentru o serie de aplicatii;
- Un potentiometru semireglabil RP1, cablat pe GP0 (RA0), utilizat pentru
reglarea unui semnal analogic de intrare, in cazul utilizarii convertorului A/D;
- Accesorii de intrare-iesire: mufa pentru cablu USB, conector J1, necesar
pentru cuplarea la calculatorul gazda, conector J3 pentru acces din exterior la
pinii microcontrollerului.
In afara acestor componente existente, placa are si o arie de extindre pe care
pot fi implementate: un alt tip de microcontroller in capsula DIP de 14 pini, o
sursa de tensiune continua integrata (circuitul LM7805 sau unul echivalent) si un
conector DB9 cu circuit de interfata serial tip RS 232.
Blocul de programare
7
Rolul componentelor din aceasta schema este:
Obtinerea unei tensiuni de 13V necesara pentru programare (circuitul
format din L1, C, Q2, si D13) si comutarea ei ON/OFF la intrarea GP3 – V pp
doar in timpul desfasurarii operatiei de programare (folosind tranzistoarele
Q3 si Q4).
Generarea de tact, pe GP1, si date, pe GP0, pentru transferul fisierului
direct executabil al aplicatiei in timpul operatiei de programare.
Comutarea ON/OFF a tensiunii de alimentare VDD (cu trenzistorul Q1)
pentru a asigura resetarea microcontrollerului din soclu.
Matricea de LED-uri
PICkit 1 FLASH Starer Kit are prevazuta o matrice de afisare de 12 LED-
uri, dar sunt implementate efectiv doar 8 dintre acestea. Toate cele 12 LED-uri
sunt comandate de 4 pini ai portului de intrare-iesire GPIO (GP1, GP2, GP4,
GP5).
Aprinderea lor se face cu semnalul logic 1 (in anod si simultan semnalul
logic 0) pe catod. Stingerea lor se face punand pinii afereni in stare de
impedanta mare.
Asa cum rezulta din figura de mai jos, schema nu permite comanda
aprinderii simultane a doua LED-uri, cu alte cuvinte, la un moment dat, nu poate
fi aprins decat un singur LED.
8
CAPITOLUL II : SIMULARE ORCAD
a * b * c *... = a + b + c +...
D0= IN;
D1= Q0*IN => Prin negarea de 2 ori a acestei ecuatii obtin portile NAND
=> D1 = Q0*IN
OUT= Q1* IN => Prin negarea de 2 ori a acestei ecuatii obtin portile NAND
=>
OUT= Q1* IN;
9
II.2 Etapa de simulare
10
Setarile pe care le-am facut pentru definirea stimulilor:
11
Mai jos se pot observa formele de unda rezultate in urma simularii :
12
CAPITOLUL III: IMPLEMENTAREA PE KIT
START
Setari,configurare microcontroller
Definiri ale variabilelor de program
INITIALIZE
STATE_MACHINE
Subrutina BUTTON_PRESS
13
Subrutina
BUTTON_PRESS
DEBOUNCE_2 NU DEBOUNCE_1
DA
STATE_DEBOUNCE=0
NU GP3=1 DA DA NU
GP3=
0
TEMP
Initializarea registrelor
COUNTH si COUNTL
DA NU
TEMP=10ms
NU DA
STATE_DEBOUNCE=0
RETURN
14
III.2 Definirea variabilelor de program
-cu ajutorul directivei CBLOCK se defineste registrul COD_STARE in care este
memorat numarul starii curente
-se definesc variabilele de program pentru comanda ledului D6
-se definesc registrii folositi pentru temporizare si alti registrii folositi in program
III.3 Initializare
-Sunt stinse ledurile aprinse si sunt initializate registrele utilizate.
-se dezactiveaza convertorul A/D
-se dezactiveaza comparatorul
-se reseteaza registrul COD_STARE
State1
-citeste Intrarea IN(GP5) -daca valoarea lui este 0, STATE_COUNTER este setat
pe State1
-daca valoarea lui este 1, STATE_COUNTER este
setat pe State2
State2
15
III.6. Codul sursa
list p=12f675 ;directiva de definire a procesorului
#include <p12f675.inc>
errorlevel -302 ;elimina mesajul de tip 302 din fisierul list
__CONFIG
_CP_OFF&_CPD_OFF&_BODEN_OFF&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_
INTRC_OSC_NOCLKOUT
cblock 0x20
STATE_COUNTER
STATE_DEBOUNCE
CountA
CountH
CountL
FLAGS
endc
goto Initialize
org 0x004
Timer1Interrupt
movlw 0xB1
movfw TMR1H
movlw 0xE1
movfw TMR1L
btfss FLAGS, 6
goto LEDON
bcf FLAGS, 6
bsf STATUS, RP0
movlw TRIS_D6_OFF
movwf TRISIO
bcf STATUS, RP0
movwf GPIO
goto RET_I
16
LEDON
bsf FLAGS, 6
bsf STATUS, RP0
movlw TRIS_D6_ON
movwf TRISIO
bcf STATUS, RP0
movlw D6_ON
movwf GPIO
RET_I
bcf STATUS, RP0
bcf PIR1, TMR1IF
retfie
Initialize
call 0x3FF ;restabilirea factorului de calibrare
bsf STATUS, RP0 ;selectare BANK1
movwf OSCCAL ;incarcarea registrului OSCAL cu valoarea factorului de
calibrare
movlw 0x7f
movwf OPTION_REG ;validare weak pull-up general
bsf INTCON,PEIE ;Activare intreruperi generate de periferice
bcf INTCON,T0IF ;Resetare flag de intreruperi
bsf INTCON,GIE ;Activare intreruperi generale
movlw B'00111111'
movwf TRISIO
movwf WPU
clrf ANSEL
clrf VRCON
STATE_MACHINE
call Button_Press ; apelarea subrutinei Button_Press
movf STATE_COUNTER, w
17
andlw B'00000011' ;mascarea ultimilor 2 biti din STATE_COUNTER
addwf PCL, f
goto State0 ; apelarea rutinei State0
goto State1 ; apelarea rutinei State1
goto State2 ; apelarea rutinei State2
goto State3 ; apelarea rutinei State3
State0
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfsc GPIO, 5 ; se verifica bitul de intrare de la GP5
goto STATE_MACHINE ; daca e 1, ramane in starea 0
incf STATE_COUNTER, f ; daca e 0, se incrementeaza contorul
de program
goto STATE_MACHINE ; si se trece in starea 1
State1
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfss GPIO, 5 ; se verifica bitul de intrare de la GP5
goto STATE_MACHINE ; daca e 0, ramane in starea 1
incf STATE_COUNTER, f ; daca e 1, se incrementeaza contorul
de program
goto STATE_MACHINE ; si se trece in starea 2
State2
bcf STATUS, RP0 ; se trece in bancul 0 de memorie
btfss GPIO, 5 ; se verifica bitul de intrare de la GP5
goto State20 ; daca e 0, apeleaza subrutina State20
clrf STATE_COUNTER ; daca e 1, se incrementeaza
contorul de program
goto STATE_MACHINE ; si se trece in starea 0
State20
clrf STATE_COUNTER ; se decrementeaza contorul de program pentru a
se trece in starea 1
goto State3
;goto STATE_MACHINE
State3
;goto Timer20ms ; se apeleaza subrutina
18
movwf TMR1H
movlw 0xE1
movwf TMR1L
movlw b'10000001'
movwf T1CON
clrf STATE_COUNTER
goto STATE_MACHINE
Button_Press
btfss STATE_DEBOUNCE, 0
goto Debounce_1
goto Debounce_2
Debounce_1
bcf STATUS, RP0
btfsc GPIO, 3 ;SW apasat?
goto Debounce_1 ;Nu, salt la Debounce_1
incf STATE_DEBOUNCE, f ;Da, decrementeaa STATE_DEBOUNCE
Temp
movlw 0x01 ;initializarea registrelor folosite dupa temporizare
movwf CountH
M1
movlw 0x03
movwf CountL
M2
decfsz CountL, f ;se decrementeaza CountL
goto M2
decfsz CountH, f ;se decrementeaza CountH
goto M1
btfss STATE_DEBOUNCE, 0
goto Button_Press
retlw 0
Debounce_2
bcf STATUS, RP0
btfss GPIO, 3 ;SW neapasat?
goto Debounce_2 ;Nu, salt la Debounce_2
clrf STATE_DEBOUNCE ;Da, reseteaza registrul STATE_DEBOUNCE
goto Temp
19
Timer20ms
movlw 0xB1
movfw TMR1H ;se reinitializeaza TMR1H
movlw 0xE1
movfw TMR1L ;se reinitializeaza TMR1L
movlw B'10000001'
movwf T1CON
END
Bibliografie:
“Aplicatii hardware si software cu microcontrolerul PIC 12F675”
Autori: Elisabeta Buzoianu , Istvan Sztoianov, Sever Pasca
Editura Cavallioti, Bucuresti 2008
20