[ janjic @ 21.02.2015. 10:44 ] @
Početnik sam u programiranju MikroBasic-om. Pokušao sam da sa PIC12F675 napravim vremenski relej kod koga mogu da podešavam trajanje impulsa i pauze ali kada ga simuliram u Proteus-u to ne radi. Možete li mi pomoći da vidim gde grešim. Potenciometri su vezani na GP0 i GP2 a izlaz je na GP4 gde se preko tranzistora pali relej.
P.S. ne znam kako da sliku iz proteusa postavim na ovaj forum.

program Tajmer
' Deklaracija promenljivih
dim impuls, pauza as word
dim brojac as word
'procedura prekida
sub procedure interrupt
INTCON = $20 'zabrana svih prekida i brisanje bita koji je registrovao prekid
if(INTCON.2=1)then 'ako je TMR0 napravio prekid
INTCON.2=0 'obriši bit prekida
brojac = brojac+1 'brojac prekida
end if
TMR0 = 114
INTCON = %10100000 'dozvoli prekide
end sub
main:
INTCON = $20
OPTION_REG = %10000111 'prescaler 1:256 dodeljen TMR0
TRISIO = %00000101 'ulazi GP0 i GP2, sve ostalo izlazi
ANSEL = %00110101 'GP0 i GP2 kao analogni ulazi; interni oscilator za A/D konv.
ADCON0 = %10000001 'desno poravnanje rezultata; Vref=Vdd
CMCON = %00000111 'zabrana komparatora
GPIO.4=1 'relej ukljucen prilikom paljenja tajmera
brojac = 0
TMR0 = 114
INTCON = %10100000
while (TRUE)
ADCON0 = %10000001 'kanal CH0 aktivan
ADCON0.1 = 1 'start konverzije
while ADCON0.1=1 'cekaj dok se ne zavrsi konverzija
wend
impuls = ADC_Read(0)
if(brojac<impuls)and(GPIO.4=1)then
GPIO.4=0
end if
ADCON0 = %10001001 'kanal CH2 aktivan
ADCON0.1 = 1 'start konverzije
while ADCON0.1=1 'cekaj dok se ne zavrsi konverzija
wend
pauza = ADC_Read(2)
if(brojac<pauza)and(GPIO.4=0)then
GPIO.4=1
end if
wend
end.

[Ovu poruku je menjao janjic dana 21.02.2015. u 12:05 GMT+1]
[ janjic @ 21.02.2015. 15:54 ] @
Sa ovim programom radi samo jedan AD kanal.

program Tajmer
dim impuls, pauza, brojac as word
sub procedure interrupt
brojac = brojac+1 'brojac prekida
TMR0 = 218
INTCON = %00100000 'dozvoli prekide
end sub
main:
OPTION_REG = %10000111 'prescaler 1:256 dodeljen TMR0
TRISIO = %00000101 'ulazi GP0 i GP2, sve ostalo izlazi
ANSEL = %00110101 'GP0 i GP2 kao analogni ulazi; interni oscilator za A/D konv.
ADCON0 = %10000001 'desno poravnanje rezultata; Vref=Vdd
CMCON = %00000111 'zabrana komparatora
VRCON = %00000000 'ugasi naponsku referencu komparatora
GPIO.4=1 'relej ukljucen prilikom paljenja tajmera
brojac = 0
TMR0 = 218
INTCON = %10100000
while (TRUE)
delay_us(100) 'kasnjenje da je vece od 2xTad - akviziciono vreme AD konvertora
ADCON0 = %10000001 'kanal AN0 aktivan
ADCON0.1 = 1 'start konverzije
while ADCON0.1=1 'cekaj dok se ne zavrsi konverzija
wend
impuls=ADRESL
Hi(impuls)=ADRESH
if(brojac>=impuls)and(GPIO.4=1)then
GPIO.4=0
end if
wend
end.

Kako da uključim drugi kanal preko koga ću da definišem pauzu a da mi ne izbaci grešku?
[ janjic @ 21.02.2015. 20:28 ] @
Rešeno.
[ SASA M. @ 21.02.2015. 21:57 ] @
Mogao si da napises, mozda ce jos nekog interesovati.
[ janjic @ 23.02.2015. 09:25 ] @
Na Microchip-ovom forumu sam našao da mora da se stavi akviziciono vreme kašnjenja (reda 100ms) posle aktiviranja svakog AD kanala kao i akviziciono vreme između dve konverzije. U proceduri prekida se nalaze dve prekidne rutine - jedna sa TMR0 a druga spoljni prekid spojen sa izlazom za pokretanje releja. Dva potenciometra su vezana na GP0 i GP3.
[ janjic @ 23.02.2015. 10:20 ] @
Evo i programa (korišćen je interni oscilator):

program Tajmer
' Deklaracija promenljivih
dim impuls, pauza, cnt as word
'procedura prekida
sub procedure interrupt
' impuls
if(INTCON.2=1)then 'ako je TMR0 napravio prekid
INTCON.2=0 'obrisi bit prekida
cnt = cnt+1 'brojac prekida
TMR0 = 145 'vreme od 30 sec
' pauza
else if(INTCON.1=1)then 'ako je prekid na GP2/INT
INTCON.1=0 'obrisi bit prekida
cnt = cnt+1
TMR0 = 145 'vreme od 30 sec
end if
end if
end sub
main:
OPTION_REG = %10000111 'prescaler 1:256 dodeljen TMR0
TRISIO = %00010101 'ulazi GP0,GP2 i GP4 sve ostalo izlazi
ANSEL = %00111001 'GP0 i GP3 kao analogni ulazi; interni oscilator za A/D konv.
ADCON0 = %10000001 'desno poravnanje rezultata; Vref=Vdd
CMCON = %00000111 'zabrana komparatora
VRCON = %00000000 'ugasi naponsku referencu komparatora
GPIO.5=1 'relej ukljucen prilikom paljenja tajmera
cnt = 0
TMR0 = 145 'vreme od 30 sec
INTCON = %10110000 'dozvoli prekide
while (TRUE)
ADCON0 = %10000001 'kanal AN0 aktivan
delay_ms(100) 'akviziciono vreme AD konvertora
ADCON0.1 = 1 'start konverzije
while ADCON0.1=1 'cekaj dok se ne zavrsi konverzija
wend
impuls=ADRESL
Hi(impuls)=ADRESH
if(cnt>=impuls)and(GPIO.5=1)then
GPIO.5=0
cnt = 0
TMR0 = 145 'vreme od 30 sec
end if
delay_ms(100) 'akviziciono vreme AD konvertora
ADCON0 = %10001101 'kanal AN3 aktivan
delay_ms(100) 'akviziciono vreme AD konvertora
ADCON0.1 = 1 'start konverzije
while ADCON0.1=1 'cekaj dok se ne zavrsi konverzija
wend
pauza=ADRESL
Hi(pauza)=ADRESH
if(cnt>=pauza)and(GPIO.5=0)then
GPIO.5=1
cnt = 0
TMR0 = 145 'vreme od 30 sec
end if
wend
end.

Može li neko da pomogne da vreme trajanja impulsa i pauze bude jednako (sada ima neku razliku od oko 1 sekunde).