www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PRAVOKOTNI IMPULZ

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.15
Kraj: Slovenija

PrispevekObjavljeno: Sob Okt 13, 2012 1:08 pm    Naslov sporočila:  PRAVOKOTNI IMPULZ Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Sob Okt 13, 2012 3:26 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.15
Kraj: Slovenija

PrispevekObjavljeno: Sob Okt 13, 2012 5:15 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Sob Okt 13, 2012 7:15 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.15
Kraj: Slovenija

PrispevekObjavljeno: Ned Okt 14, 2012 11:31 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Pon Okt 15, 2012 12:31 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.15
Kraj: Slovenija

PrispevekObjavljeno: Pon Okt 15, 2012 10:02 am    Naslov sporočila:   Odgovori s citatom

Super! Najlepša hvala, ccpr1 je v bistvu res nastavljen na 50000

Citiram:
CCPR1_high=0XC3, CCPR1_low=0x50;


LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Pon Okt 15, 2012 2:30 pm    Naslov sporočila:   Odgovori s citatom

Ah, sem čisto spregledal, da je CCPR1 inicializiran že v prvi vrstici. Potem je pa timing vredu.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.15
Kraj: Slovenija

PrispevekObjavljeno: Pon Okt 15, 2012 3:40 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.60

PrispevekObjavljeno: Pon Okt 15, 2012 4:10 pm    Naslov sporočila:   Odgovori s citatom

Pravilno. Timer1 inkrementira vsako us. Torej bi bil čas signala 60000 x 50 x 0.000001s = 3s.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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