 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Bostjan_21 Neznanec


Pridružen-a: Sre 23 Jul 2008 19:10 Prispevkov: 3 Aktiv.: 0.01 Kraj: Mb
|
Objavljeno: Sre Jul 23, 2008 8:06 pm Naslov sporočila: Programiranje dsPic-ev z Mplab okoljem in C 30 Compilerjem |
|
|
Živjo
Ker sem nov član na tem forumu, se naprej opravičujem za morebitno napako, ali kaj podobnega, čeprav se bom poizkušal držati vseh navodil, če pa bom kaj vedel pa bom seveda rade volje priskočil na pomoč.
Pa preidimo k problemu, da nebom preveč "brezveze" besedičil.
Na Microchipovi spketni strani sem si prenesel delovno okollje Mplab IDE, ter študentsko verzijo C30 compilerja. Prva stvar je ta da je programiranje mikrokrmilnikov v c-ju zame dokaj nova zadeva. Izkušnje sicer imam z programiranjem v c++ ampak samo z programom visual studio. Dokaj jasna mi je sama arhitektura krmilnika, vendar se mi je kmalu pri pisanju programov pojavila težava.
Naprimer
Prižgati led diodo s pomočjo tipke ni nobena znanost
Primer
#include<p30f6014a>
#define STIKALO PORTAbits.RA15
main()
{
TRISD = 0XFC; //Definicija porta D0 kot izhoda
LATD = 0XFC;
while(1)
{
if(STIKALO)
LATDbits.LATD0 = 0; //vključi diodo
else
LATDbits.LATD0 = 1; //Izključi diodo
}
}
Se opravičujem za morebitno napako.
A se mi težave pojavijo pri naslednji nalogi. V c30 compilerju dobimo zraven ti 16 bitni istrukciski set, ki se po moji logiki uporabla za razne prekinitve...(morda se motim)in podobno.
Zanima me torej klasični primir kako uporabiti prekinitev za ti "input capture modul" ki reagira naprimer na vsako pozitivno flanko inpulza, ter prekinitev za Timer da bi stel te inpulze npr. 10 s.
Zahvaljujem se Vam za morenitno pomoč in mislim da se bo našel kdo ki se s tem ze dlje časa ukvarja in ima kot pravijo to že v mezincu.
 |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Pet Jul 25, 2008 6:44 pm Naslov sporočila: |
|
|
Hm. Povem, da z 30 pici nisem delal. Na 18 pa zgleda to tako. Timer 1 uporabiš za časovno bazo. Na 10s timetick kličeš funkcijo, ki ti obdela preštete impulze. Impulze pa šteješ z timer0 ki ga konfigururaš kot števec ob inicializaciji uCja:
Koda: |
INIT_TIMER0 CODE
GLOBAL INIT_TIMER0
INIT_TIMER0
bcf T0CON,TMR0ON ; turn off timer0
clrf TMR0H ; reset timer0 counter regs
clrf TMR0L
movlw b'10101000'
movwf T0CON ; enable timer0, 16bit mode, as couter -
; transmitionon T0CKI pin increment on low
; to high transition on T0CKI, bypass
; prescaler, 000 prescaler
return
|
Ja, koda je v asm, samo ne bi smelo bit problemov prepisat v C.
Sledi pa rutina obdelave preštetih impulzov vsakih 10s:
Najprej prepišemo vrednost iz timer0 registrov pri ugasnjenem timerju, jih resetiramo in ponovno omogočimo timer0:
Koda: |
bcf T0CON,TMR0ON ; turn off timer0
movff TMR0L,TMR0_LO_VAL ; in variable for timer0 value
movff TMR0H,TMR0_HI_VAL ; in variable for timer0 value
clrf TMR0H ; reset timer0 counter regs
clrf TMR0L
bsf T0CON,TMR0ON ; turn on timer0
|
Potem pa za tem pohendlaš podatek na primer tako:
Koda: |
void Calc_freq (void)
{
unsigned short Freq;
// Calculate the frequency in Hz
Freq = (((unsigned short)TMR0_HI_VAL << 8) + TMR0_LO_VAL) / 10;
}
|
Druga malo bolj požrešna varianta bi bila, da bi definiral vhod kot INT0 in potem eno spremenljivko inkrementiral ob vsakem interruptu. Na 10 sekund bi pa vrednost v spremenljivki naprej obdelal ter spremenljivko resetiral.
Upam da bo (čeprav je pisano za 18ko) prav prišlo. _________________ 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: 491 dni
Powered by phpBB © 2001, 2005 phpBB Group
|