|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Borza Član
Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.15 Kraj: Slovenija
|
Objavljeno: Sob Okt 13, 2012 1:08 pm Naslov sporočila: PRAVOKOTNI IMPULZ |
|
|
Citiram: |
unsigned short ini stevec_signal=80, CCPR1_high=0XC3, CCPR1_low=0x50;
unsigned short ini stevec_pavza=40;
unsigned short ini stevec=40;
void interrupt(){
asm{
bcf PIR1, CCP1IF
incf PORTD, 1
clrf TMR1L
clrf TMR1H
btfss PORTB, 3
goto prizgi
decfsz stevec, 1
retfie
movf stevec_pavza, 0
movwf stevec
bcf PORTB, 3
retfie
prizgi:
decfsz stevec, 1
retfie
movf stevec_signal, 0
movwf stevec
bdf PORTB, 3
}
}
void timer1_ini(){
asm{
clrf TMR1L
clrf TMR1H
bsf T1CON, TMR1ON
movf CCPR1_high, 0
movwf CCPR1H
movf CCPR1_low, 0
movwf CCPR1L
}
}
void interr_ini(){
asm{
bsf INTCON, PEIE
bsf STATUS, RP0
bsf PIE1, CCP1IE
bcf STATUS, RP0
bsf INTCON, GIE
bsf CCP1CON, CCP1M3
bcf CCP1CON, CCP1M2
bcf CCP1CON, CCP1M1
bcf CCP1CON, CCP1M0
}
}
void main(){
asm{
bsf STATUS, RP0
clrf TRISD
clrf TRISB
bcf STATUS, RP0
}
timer1_ini();
interr_ini();
} |
V tem programčku naj bi generiral pravokotni impulz, quartz frekvenca je 4Mhz
razmerje signal/pavza mora biti 4s/2s
Program je bil podan kot primer, prosil bi za kakšno razlago, kako dobim to razmerje?
Hvala in LP |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Sob Okt 13, 2012 3:26 pm Naslov sporočila: |
|
|
Vidim, da gre za PIC mikrokontroler. Kakšen kompiler uporabljaš?
V main funkciji po inicializaciji nimaš krožne zanke (na primer while(1){}). Brez tega se bo uC konstantno resetiral. V kodi sem tudi našel bdf PORTB, 3. Takšne komande ne poznam. Izgleda, da je ta koda nekaj nepreizkušenega.
Kakorkoli, razmerje signal/pavza izhaja iz definicije spremenljivk stevec_signal in stevec_pavza. V funkciji interrupt() pa imaš potek, ki poskrbi za toglanje pina PORTB,3 v željenih presledkih. Prav tako se na portu D inkrementirajo stanja pinov.
Koliko poznaš asembler? _________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
Borza Član
Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.15 Kraj: Slovenija
|
Objavljeno: Sob Okt 13, 2012 5:15 pm Naslov sporočila: |
|
|
Program je bil podan kot primer.
bdf je napaka, moralo bi biti BSF
jasno mi je da so vrednosti stevcev pomembna za razmerje, ni mi pa jasno kako se 80:40 pretvori v 4s:2s.
zdi se mi je to nekakšna osnovna zadeva, tako da ne morem reči da ravno poznam assembler
LP |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Sob Okt 13, 2012 7:15 pm Naslov sporočila: |
|
|
Koda: |
bcf PIR1, CCP1IF ;ko pride v interrupt zbriše flag zaradi katerega je padel sem
incf PORTD, 1 ; ob vsakem interruptu inkrementira vrednost (stanje) na portu D
clrf TMR1L ;resetira timer
clrf TMR1H
btfss PORTB, 3 ;preveri stanje na potu, ki ga toglaš
goto prizgi ;če je port b enak 0 pojdi na labelo prizgi
decfsz stevec, 1 če je 1 dekrementiraj spremenljivko števec za 1 in preskoči naslednjo inštrukcijo če je 0
retfie ;če ni nič pojdi iz iterrupt rutine (prvih 40 krat) in čakaj na naslednji interrupt
movf stevec_pavza, 0 ;če je nič (prvič po 40 interruptih) premakni vrednost spremenljivke stevec_pavza v work register
movwf stevec ;vrednost work registra daj v spremenljivko stevec
bcf PORTB, 3 ; port B, 3 daj na 0
retfie ;pojdi iz inetrrupta in čakaj na naslednji interrupt
prizgi: ;labela
decfsz stevec, 1 ;dekrementiraj spremenljivko stevec in preveri če je že 0
retfie ;če še ni nič, pojdi iz interrupta in čakaj na naslednji int
movf stevec_signal, 0 ; ko je 0, daj vrednost spremenljivke stevec_signal v work
movwf stevec ;work v stevec
bdf PORTB, 3 ;postavi port B, 3 |
2 in 4 sekunde pa pride iz časa med enim in drugim interruptom in teh 40x in 80x loopov skozi interrupt, ampak saj to pa že veš. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
Borza Član
Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.15 Kraj: Slovenija
|
Objavljeno: Ned Okt 14, 2012 11:31 am Naslov sporočila: |
|
|
najlepša hvala za pojasnilo, vendar še zmeraj ne razumem kako 80 v števcu pomeni 4s.
kako bi dobil razmerje npr. 3:6??
LP |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pon Okt 15, 2012 12:31 am Naslov sporočila: |
|
|
Predvidevam, da je timer1 16 bitni. Da prešteje od 0 do 65535 potrebuje pri 4MHz 0,065536 sekunde (timer1 poganjaš z internim clockom Fosc/4, prescaler 1:1). Če to pomnožiš krat 80 dobiš 5,24 sekunde. Za točne 4 sekunde bi moral vpisat v timer1 vrednost 15536, ali pa tistih 80 ustrezno zmanjšat.
Za proženje interrupta uporabljaš compare mode CCP1 modula, ki je hardversko povezan s timer 1 modulom. Pri inicializaciji je nastavljena vrednost CCPR1 0. CCP1 modul proži v tvojem primeru interrupt, ko sta vrednosti registra TMR1 in CCPR1 enaki. Torej ob prehodu preko 0. Načeloma bi lahko tudi z vpisom vrednsoti 50000 v CCPR1 popravil čas na 4 sekunde. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
Borza Član
Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.15 Kraj: Slovenija
|
Objavljeno: Pon Okt 15, 2012 10:02 am Naslov sporočila: |
|
|
Super! Najlepša hvala, ccpr1 je v bistvu res nastavljen na 50000
Citiram: |
CCPR1_high=0XC3, CCPR1_low=0x50; |
LP |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pon Okt 15, 2012 2:30 pm Naslov sporočila: |
|
|
Ah, sem čisto spregledal, da je CCPR1 inicializiran že v prvi vrstici. Potem je pa timing vredu. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
Borza Član
Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.15 Kraj: Slovenija
|
Objavljeno: Pon Okt 15, 2012 3:40 pm Naslov sporočila: |
|
|
Ok, če prav razumem bi za razmerje signal=3s in pavza=6s, v ccpr1 vnesel EA60(60000), in nastavil stevec_signala=50 ter stevec_pavze=100..
LP |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pon Okt 15, 2012 4:10 pm Naslov sporočila: |
|
|
Pravilno. Timer1 inkrementira vsako us. Torej bi bil čas signala 60000 x 50 x 0.000001s = 3s. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 78 dni
Powered by phpBB © 2001, 2005 phpBB Group
|