Pozdrav svima,
zelio bi da pitam ukoliko ima nekog da mi objasni razliku izmedju (ORG 0x004) interrupt reset vectora i (ORG 0x000) processor reset vectora kod pic12f629?Takodje me zanima da li postoji neki univerzalni code u asembleru koji nastavlja da radi tamo gde je stao posle reseta. Imam problem jer izgleda da nemam dovoljno stabilisanu napon , usled cega mi PIC12f629 stalno radi interrapt reset verovatno, posto nisam siguran da li radi interrupt ili procesor reset, a nakon toga umesto da nastavi od mesta prekida on izvrsava program iz pocetka... Meni je potrebno da pic nastavi tako gde je stao. Da li mi neko moze pomoci u vezi ovoga? Unapred hvala
12f629 pitanje u vezi reseta
Moderators: pedja089, stojke369, [eDo], trax
Re: 12f629 pitanje u vezi reseta
Ako u svojoj aplikaciji ne koristis interrupte (a vjerovatno ne koristis), trebas da ih i iskljucis. Postoji mogucnost da su ti ukljuceni a da nemas interrupt rutinu u kodu (na vektoru/adresi 0x04) koja hendla taj interrupt.
To uradis tako sto ocistis INTCON, GIE bit kada se mikrokontroler starta (u svom programu, negdje na pocetku). Kada to odradis, mikrokontroler nece nikad skakati na 0x04 vektor.
Sto se tice reseta na adresu 0 (pocetak), to ces rijesiti tako sto ces dodati kondenzatore paralelno sa Vcc i GND pinom od PIC-a, a koji ce peglati napon. Spoji 3 blok kondenzatora, 1nF, 10nF i 100nF.
Takodje, postoji mogucnost da ti je MCLR omogucen a da nemas na njemu pull-up otpornik, ili da imas nesto spojeno na MCLR pin sto kupi smetnje i resetuje ti mikrokontroler. Ili stavi otpornik od 10k prema Vcc i jos dodaj kondenzator od nekih 10-100nF izmedju MCLR pina i GND.
To uradis tako sto ocistis INTCON, GIE bit kada se mikrokontroler starta (u svom programu, negdje na pocetku). Kada to odradis, mikrokontroler nece nikad skakati na 0x04 vektor.
Sto se tice reseta na adresu 0 (pocetak), to ces rijesiti tako sto ces dodati kondenzatore paralelno sa Vcc i GND pinom od PIC-a, a koji ce peglati napon. Spoji 3 blok kondenzatora, 1nF, 10nF i 100nF.
Takodje, postoji mogucnost da ti je MCLR omogucen a da nemas na njemu pull-up otpornik, ili da imas nesto spojeno na MCLR pin sto kupi smetnje i resetuje ti mikrokontroler. Ili stavi otpornik od 10k prema Vcc i jos dodaj kondenzator od nekih 10-100nF izmedju MCLR pina i GND.
Re: 12f629 pitanje u vezi reseta
Hvala Trax na brzom odgovoru, ali mclr je u redu. I sa pull-up - om ne radi kako treba iako je iskljucen... Napisao sam code i kada ga prikljucim na ispravljac u kome je dobro isfiltrirani napon, radi super, medjutim , kada pokusam da iskoristim napajanje po principu jedan kondenzator i otpornik, ispravljen zener diodom, uredjaj nece da radi korektno.Aplikacija je krajnje jednostavna, hocu da upalim led diodu kada pritisnem na taster.Inace koristim interne pull up otpornike za taster.Ideja mi je bila da bude minimalni broj komponenti. Pokusacu i drugu varijantu sa blokovima na pinovima za napajanje. Trenutno je samo jedan viseslojni kondenzator od 100n ovde. ovako mi izgleda deo za interrapte (Init je pocetak programa) i skoro sam siguran da me to zeza.
ORG 0x000 ; processor reset vector
nop
goto init ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp
ORG 0x000 ; processor reset vector
nop
goto init ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp
Re: 12f629 pitanje u vezi reseta
A gdje ti je izlaz iz interapt rutine?
Re: 12f629 pitanje u vezi reseta
Kako moze biti ispravljeno zener diodom
Re: 12f629 pitanje u vezi reseta
1. ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie
pa onda ide Init i ostatak coda... Eto to je ceo deo koji je vezan za interapt. Ja sam se uhvatio za interapt ali mozda je i nesto drugo u pitanju.
2. Pa malo sam se pogresno izrazio, idu 2x1n4001 i koristio zener za stabilizaciju na 5.6v ... Standardna sema za napajanje bez transformatora.
Moje skromno mishljenje je da u nekom trenutku pad napona bude takav da se pic potpuno ugasi a onda kada pocne da radi on umesto da krene gde je stao, on uradi ovaj deo coda
ORG 0x000 ; processor reset vector
nop
goto init ; go to beginning of program
Procedura za switch mi izgleda ovako:
SwitchDebounce
; The SWITCH must be a steady high for 10 milliseconds to be considered
; released and debounced. The debounce routine sets a 10 mSec timer and looks
; for a high SWITCH input. The timer is reset to 10 mSec for every occurance of
; a low SWITCH input.
;
; Debounce timer constants (TenMSH and TenMSL) are a function of the
; instruction execution time and number of instructions in each loop. Debounce
; time for this example is:
; Timer overhead + TenMSH * [outer loop time + (TenMSL * inner loop time)]
; or [2 + TenMSH * (5 + (TenMSL * 5))]*(4/fosc)= .010
;
; Arbitrarily choosing 99 for TenMSL we solve for TenMSH
; 2 + TenMSH * (5 + (99 * 5)) = 10,000
; TenMSH = 9998/500 ~ 20
#define TenMSH D'20'
#define TenMSL D'99'
movlw TenMSH ; set outer timer loop count
movwf CountH ; outer loop overhead is 2 instructions
;========== outer loop [TenMSH * 5 instruction cycles*(Inner loop time)] ======
SD10
movlw TenMSL ; set inner timer loop
movwf CountL
;----------------- inner loop (TenMSL * 5 instruction cycles) -----------------
SD20
btfss SWITCH ; test SWITCH input
goto SwitchDebounce ; SWITCH was low - reset timer
decfsz CountL,f ; inner loop countdown
goto SD20 ; test SWITCH while counting
;-------------------------------- inner loop ----------------------------------
decfsz CountH,f ; outer loop countdown
goto SD10 ; reset inner loop after each outer loop count
;================================ outer loop ==================================
return ; full countdown and no bounces achieved - exit
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie
pa onda ide Init i ostatak coda... Eto to je ceo deo koji je vezan za interapt. Ja sam se uhvatio za interapt ali mozda je i nesto drugo u pitanju.
2. Pa malo sam se pogresno izrazio, idu 2x1n4001 i koristio zener za stabilizaciju na 5.6v ... Standardna sema za napajanje bez transformatora.
Moje skromno mishljenje je da u nekom trenutku pad napona bude takav da se pic potpuno ugasi a onda kada pocne da radi on umesto da krene gde je stao, on uradi ovaj deo coda
ORG 0x000 ; processor reset vector
nop
goto init ; go to beginning of program
Procedura za switch mi izgleda ovako:
SwitchDebounce
; The SWITCH must be a steady high for 10 milliseconds to be considered
; released and debounced. The debounce routine sets a 10 mSec timer and looks
; for a high SWITCH input. The timer is reset to 10 mSec for every occurance of
; a low SWITCH input.
;
; Debounce timer constants (TenMSH and TenMSL) are a function of the
; instruction execution time and number of instructions in each loop. Debounce
; time for this example is:
; Timer overhead + TenMSH * [outer loop time + (TenMSL * inner loop time)]
; or [2 + TenMSH * (5 + (TenMSL * 5))]*(4/fosc)= .010
;
; Arbitrarily choosing 99 for TenMSL we solve for TenMSH
; 2 + TenMSH * (5 + (99 * 5)) = 10,000
; TenMSH = 9998/500 ~ 20
#define TenMSH D'20'
#define TenMSL D'99'
movlw TenMSH ; set outer timer loop count
movwf CountH ; outer loop overhead is 2 instructions
;========== outer loop [TenMSH * 5 instruction cycles*(Inner loop time)] ======
SD10
movlw TenMSL ; set inner timer loop
movwf CountL
;----------------- inner loop (TenMSL * 5 instruction cycles) -----------------
SD20
btfss SWITCH ; test SWITCH input
goto SwitchDebounce ; SWITCH was low - reset timer
decfsz CountL,f ; inner loop countdown
goto SD20 ; test SWITCH while counting
;-------------------------------- inner loop ----------------------------------
decfsz CountH,f ; outer loop countdown
goto SD10 ; reset inner loop after each outer loop count
;================================ outer loop ==================================
return ; full countdown and no bounces achieved - exit
Re: 12f629 pitanje u vezi reseta
Pic kada ostane bez napajanja uvek krece od pocetka. Tu nemas sta mudrovati. Napravi napajanje...
Kod mi se sad ne da gledati...
Kod mi se sad ne da gledati...
Re: 12f629 pitanje u vezi reseta
Ja sam taj problem imao s Trax-ovim dimmerom, i rješenje je bilo:
http://www.elektronika.ba/forum/viewtop ... &start=260
Jedino kvalitetno je radilo kad sam ubacio 78L05. Stariji kontroleri su radili i bez njega, ali ni jedan novokupljeni nije htio, tj "brljavio" je.
http://www.elektronika.ba/forum/viewtop ... &start=260
Jedino kvalitetno je radilo kad sam ubacio 78L05. Stariji kontroleri su radili i bez njega, ali ni jedan novokupljeni nije htio, tj "brljavio" je.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Re: 12f629 pitanje u vezi reseta
Kukinjos , skroz si u pravu! Od sada, pa nadalje, napajanje bez transformatora pravim iskljucivo sa 78L05 stabilizatorom. Cak mi je i MOC 3043 radio na 5V a njegov radni napon mislim da je 6V ako se dobro secam... Nadam se da cu naci vremena i u neko dogledno vreme postaviti projekat koji sam upravo zavrsio. Do tada, pozdrav svima.