Temporizator masa de expunere


nightmare392


M-am hotarat sa-mi construiesc o masa de expunere pentru cablaje foto, deoarece in comert sunt extrem de scumpe. Am achizitionat neoane black light, drossere, startere, socluri. Acum intervine problema unui temporizator care sa-mi opreasca automat expunerea. Stie cineva vreo schema de temporizator cu PIC16F628? Tot ce gasesc e cu 16F84.
edy_wheazel
Nu ai nevoie de PIC, iti ajunge un 555.
 
nightmare392
Si cum leg acel 555 la un display de orice tip (preferabil 7-segment ca e varianta mai ieftina)? Mi se pare cam complicat.
edy_wheazel
Aham, pai nu ai zis nimic de afisaj. In cazu' asta ii plin netu' de scheme, da-i pe google, alege o schema si vedem.

nightmare392
Schema am gasit si eu multe, dar dupa cum am scris mai sus toate sunt cu 16F84 si eu nu am decat 16F628 la indemana si mi-e total peste cap sa mai cumpar acum 16F84 pe care evident ca nu o sa-l gasesc in oras la mine si daca il comand de pe net va trebui sa platesc taxe de transport. Banuiesc ca se poate modifica codul pentru 628, dar nu sunt tocmai experimentat in microcontrolere. Daca nu am nici o sansa pana la urma ma chinui si cu modificarea codului.

Un exemplu ar fi asta:
http://www.electronics-lab.com/projects/os.../019/index.html
miron1947
Pe Elforum gasiti aceasta schema(treceam link-ul dar acum nu merge),care preia semnalul de la buzzerul unui ceas cu alarma.Cred ca este mai simplu de realizat.
edy_wheazel
CITAT (nightmare392 @ 19th September 2009, 14:10) *
... toate sunt cu 16F84 si eu nu am decat 16F628 la indemana si mi-e total peste cap sa mai cumpar acum 16F84 pe care evident ca nu o sa-l gasesc in oras la mine


Nu ma pricep la PIC-uri, in general am studiat AVR-urile. Am sa-ti spun cum sa modifici anumite chestii din cod, pt. restu' te poate ajuta cineva mai experimentat. Trebuie sa modifici fisierul DarkRoomTimer.asm pt. a genera un .hex pt. 16F628, adica incepi cu
PROCESSOR PIC16F84A
#INCLUDE "P16f84A.INC"


In loc de PIC16F84A pui PIC16F628. Dupa asta se complica problema, dar nu foarte mult. Trebuie sa compari arhitectura celor doua uC sa vezi diferentele constructive si de mnemonici:

CONSTRUCTIVE: ma refer la adresele porturilor (asta nu ar fi o problema deoarece vad ca sunt scrise clar PORTA, etc...) si in special la registrii cu functii speciale. Prea multe probleme nu vei avea deoarece 16F628 e mai nou decat 16F84. Dupa ce compilezi codul cu MPlab-ul iti va spune erorile pe care le poti corecta pe traseu.

MNEMONICI: aici poate urmatorea problema: 16F84 sa nu cunoasca anumite instructiuni si pt. acestea trebuie sa rescri codul. Nu cred ca apar probleme deoarece, cum am zis 16F628 e mai nou decat 16F84.


Fa prima modificare, compileaza codul si posteaza erorile.

 
nightmare392
E mai indicat sa folosesc un oscilator extern, ca in schema sau mai bine il folosesc pe cel intern si elimin pe cel extern?
edy_wheazel
Daca modifici oscilatoru' ai de modificat mai multe linii de cod. Lasa-l asa.
nightmare392


Am modificat pentru 16F628A si se compileaza, dar da niste warning-uri care pot sa pun pariu ca vor influenta functionarea. Am atasat mai jos sursa si poza cu erorile. Am modificat extensia fisierului pentru ca nu ma lasa sa atasez .asm.
edy_wheazel
Mesajele de warning sunt clare. La primele 3 probabil 16F628 are o instructiune mai potrivita. Studiaza instructiunile.
La restul ma mir ca sunt doar warning-uri.
nightmare392
Si pe mine ma mira ca nu sunt erori si sunt doar warning, pentru ca accesarea unei locatii invalide clar impiedica functionarea programului. Trebuie sa ma apuc sa studiez mai bine arhitectura celor 2 ca sa ma prind de ce nu sunt locatiile potrivite.

CITAT (miron1947 @ 19th September 2009, 15:05) *
Pe Elforum gasiti aceasta schema(treceam link-ul dar acum nu merge),care preia semnalul de la buzzerul unui ceas cu alarma.Cred ca este mai simplu de realizat.


E de luat in calcul si varianta asta. O sa vad ce gasesc.
edy_wheazel
CITAT (nightmare392 @ 19th September 2009, 16:09) *
Trebuie sa ma apuc sa studiez mai bine arhitectura celor 2 ca sa ma prind de ce nu sunt locatiile potrivite.


Daca ii dai clic pe eroare ar trebui sa-ti iasa in evidenta in cod linia cu probleme. Vezi la ce adresa a RAM-ului te trimite si dupa aceea compara cele doua uC, eventual spune-mi care e linia respectiva sa vad daca te pot ajuta.
nightmare392
CODSURSA
SEC           EQU H'0C'         ; this register holds the value of seconds
SEC10         EQU H'0D'         ; holds value of 10's of seconds
FUDGE         EQU H'13'         ; allows slight adjustment every 7 interrupts
RUNFLG        EQU H'14'         ; bit 0 only, tells if countdown in progress
KEEP        EQU H'1B'          ; hold RB4 and RB5 state


La toate liniile care se refera la acesti registrii da eroare.
De ex:
CODSURSA
MOVWF FUDGE
edy_wheazel
Uita-te pe harta memoriilor la cele 2 uC. S-ar putea ca la 16F628 sa ai ceva la adresele 0Ch, 0Dh, etc. Schimba-le cu altele din seria registrilor de uz general (la AVR-uri sunt notate R0, R1...). Studiaza pdf-ul cu instructiuni sa nu ai conflicte in accesarea noilor locatii.
nightmare392
Gata... am studiat harta memoriei la 16F628A si intr-adevar zona pentru definire de registri era intre 20h si 6Fh. Am ales adrese de acolo si nu mai da erorile.

Acum ma mira ceva. Mai sunt si alti registri definiti acolo, care nu au adrese din zona corespunzatoare si totusi nu da eroare la ei. Sa schimb toate adresele in asa fel incat sa fie in "general purpose registers"?
edy_wheazel
Nu. Daca nu ai warning lasa-le asa. Probabil adresele chiar daca nu indica niste registrii de uz general indica o zona de RAM utilizabila. Mai ai warning-uri?
nightmare392
Mai am doar pe cele legate de TRIS care cred ca le pot ignora. Unele din adresele alea se duc pe zone de memorie unde am TMR1L, TMR1H, etc. De ce oare nu da nici un warning?
edy_wheazel
Cele cu TMR1L si TMR1H nu sunt timere? Pt. acelea e destul sa scrii in clar TMR1L si compilatorul stie unde sa mearga.
nightmare392
CODSURSA
SEC           EQU H'21'        ; this register holds the value of seconds
SEC10         EQU H'22'        ; holds value of 10's of seconds
MIN          EQU H'0E'        ; holds value of minutes
MIN10         EQU H'0F'        ; holds value of 10's of minutes
DIGCTR        EQU H'10'        ; 8 bit counter, only 2 lowest bits actually used
DIGIT         EQU H'11'        ; hold digit number to access table
INTCNT        EQU H'12'        ; counts # interrupts to determine when 1 sec up
FUDGE         EQU H'23'        ; allows slight adjustment every 7 interrupts
RUNFLG        EQU H'24'        ; bit 0 only, tells if countdown in progress
W_TEMP        EQU H'15'        ; temporarily holds value of W
STATUS_TEMP EQU H'16'        ; temporarily holds value of STATUS
SECNT         EQU H'17'        ; used in counting 25, 20 msec delays for 1 sec
CNTMSEC       EQU H'18'        ; used in timing of milliseconds
ALARM         EQU H'19'        ; bit 0 only, used as flag for when to alarm
OFFSET        EQU H'1A'        ; hold offset of address in EEPROM
KEEP        EQU H'25'         ; hold RB4 and RB5 state


Astea sunt toate definitiile. Am scimbat eu SEC, SEC10, FUDGE, RUNFLG si KEEP ca sa fie in zona de registrii. Am studiat si harta memoriei pentru 16F84 si conform ei, toate aceste definitii intra in zona de general purpose registers, deci cred ca ar trebui sa schimb si eu adresele in asa fel incat sa fie acolo toate.
edy_wheazel
Da, numai sa ai grija sa nu folosesti o adresa de doua ori (sa pui o adresa care exista deja in programul initial). Oricum iti da eroare la compilare daca apare situatia respectiva.
nightmare392
Le-am pus in ordine ca oricum nu mai aveam nimic definit in zona aia. Astea sunt noile adrese:
CODSURSA
SEC           EQU H'21'         ; this register holds the value of seconds
SEC10         EQU H'22'         ; holds value of 10's of seconds
MIN          EQU H'23'         ; holds value of minutes
MIN10         EQU H'24'         ; holds value of 10's of minutes
DIGCTR        EQU H'25'         ; 8 bit counter, only 2 lowest bits actually used
DIGIT         EQU H'26'         ; hold digit number to access table
INTCNT        EQU H'27'         ; counts # interrupts to determine when 1 sec up
FUDGE         EQU H'28'         ; allows slight adjustment every 7 interrupts
RUNFLG        EQU H'29'         ; bit 0 only, tells if countdown in progress
W_TEMP        EQU H'2A'         ; temporarily holds value of W
STATUS_TEMP EQU H'2B'         ; temporarily holds value of STATUS
SECNT         EQU H'2C'         ; used in counting 25, 20 msec delays for 1 sec
CNTMSEC       EQU H'2D'         ; used in timing of milliseconds
ALARM         EQU H'2E'         ; bit 0 only, used as flag for when to alarm
OFFSET        EQU H'2F'         ; hold offset of address in EEPROM
KEEP        EQU H'30'          ; hold RB4 and RB5 state
Reclama
In curand... autoevolution.ro

Teste, stiri, ghiduri, jurnale, forum si multe altele!
Aceasta este o versiune simplificatã a paginii originale. Pentru a vizita versiunea originala click aici.