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 

Programiranje dsPic-ev z Mplab okoljem in C 30 Compilerjem

 
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
Bostjan_21
Neznanec
Neznanec



Pridružen-a: Sre 23 Jul 2008 19:10
Prispevkov: 3
Aktiv.: 0.01
Kraj: Mb

PrispevekObjavljeno: Sre Jul 23, 2008 8:06 pm    Naslov sporočila:  Programiranje dsPic-ev z Mplab okoljem in C 30 Compilerjem Odgovori s citatom

Ž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.


Smile
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.33

PrispevekObjavljeno: Pet Jul 25, 2008 6:44 pm    Naslov sporočila:   Odgovori s citatom

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
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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group