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 PIC18F452

 
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
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Sob Mar 06, 2010 8:10 pm    Naslov sporočila:  Programiranje PIC18F452 Odgovori s citatom

Na faksu smo začeli s programiranjem mikrokrmilnikov. Ker se prvič srečujem s programiranjem le-teh, imam pri temu malo težav, ker ne vem, kako določeno stvar sprogramirat, saj še ne poznam mehanizma in funkcij. Rahel problem je tudi to, da lahko delovanje spisane kode preverim samo v šoli(pa še to je omejeno), saj si ne lastim programatorja in pica. No, da preidem k bistvu. Do jutri imam za naredit nalogo z naslednim navodilom:

"Predvidimo, da delamo aplikacijo, ki bo štela korake. Ta deluje tako, da mora uporabnik ob vsakem koraku pritisniti na gumb. Ta je vezan na RA4. Ob pritisku na gumb se poveča števec. Glavna zanka skrbi le za to, da se stanje števca kaže na lučkah."

Po dolgem brskanu po internetu sem skupaj spacal naslednjo kodo, ampak dvomim, da je delovanje le-te pravilno.

Koda:

#include <p18f452.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void main()
{
    char st = 0;
    TRISC = 0;
   
    for (;;)
    {
        if (PORTAbits.RA4 == 0)
        {
            PORTC = st++;
        }
    }

    for(;;);
}


Torej, prosil bi vas, če si lahko ogledate nalogo ter spisano kodo in mi poveste kaj je prav, kaj narobe itd... Smile

Hvala za odgovor!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jerny
Član
Član



Pridružen-a: Čet 17 Apr 2008 11:27
Prispevkov: 414
Aktiv.: 1.98
Kraj: Dravograd

PrispevekObjavljeno: Sob Mar 06, 2010 8:20 pm    Naslov sporočila:   Odgovori s citatom

Prvič nevem zakaj imaš 2 for zanki? Drugič lučke se bodo prižigale če boš napisal potence števila 2 torej (1,2,4,8,16,32,64,128). Primer (PORTC=8 gorela bo ledica na C3). Pa še spremenljivka st ni tipa char ampak je integer (int).

Jaz bi zadevo napisal na tak način: (verjetno kakšne napake, spisano zelo na hitro)

Koda:

int st=0;
int i[8]={1,2,4,8,16,32,64,128};
void main()
{
    TRISC = 0;

do
{
if (Button(&PORTA, 4, 0, 1))
{
st++;
}
PORTC=i[st];
}
while (st<8);
}

_________________
Če smrdi je kemija, če kadi pa elektronika!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sob Mar 06, 2010 10:54 pm    Naslov sporočila:   Odgovori s citatom

Pajci najbolj pomemben del naloge je tole: Glavna zanka skrbi le za to, da se stanje števca kaže na lučkah.

Kar pomeni, da je potrebno štetje izvesti drugače. Ker uporabljaš za vhod ravno RA4, ki je po naklučju tudi T0CKI, pomeni da boš Timer0 nastavil na counter mode (T0CON=0b10101000), zdaj pa v glavni zanki le še nastavljaš led diode na vrednost, ki se nahaja v TMR0L in TMR0H registrih.

Preprosto a ne Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Sob Mar 06, 2010 11:16 pm    Naslov sporočila:   Odgovori s citatom

Za char pa 2 for zanki se je tud men čudn zdelo ... pač takšen primer so nam pokazali v šoli. A mi lahko malo podrobneje obrazložiš ta del
(Button(&PORTA, 4, 0, 1) - nevem, če je čisto to kar zahteva naloga ... verjetno bi moral še omeniti, da smo začeli delati s časovniki( timer-ji ) in smo v šoli naredili primer, kjer se je števec(služi za številko lučke) povečeval, ko je prišlo do overflowa. Timer pa smo povezali s taktom oscilatorja. Pri tej nalogi pa naj bi zadevo povezali preko RA4. Tukaj pa mi potem ni čisto jasno, kako preveriti da je gumb(kateri gumb ... je to na vezju al kako?) pritisnjen. Potem je še tukaj prescaler ... tega tukaj verjetno ne potrebujem, saj zadeve ne štejem s taktom ane? Torej, če sedaj prav razumem moram samo nastaviti bite za timer0 in potem čekirati, če je tipka stisnjena in takrat povečati števec. Kaj pa je indikator, da je tipka bila stisnjena? Matr se noobsko počutim Laughing


Nazadnje urejal/a Pajci Ned Mar 07, 2010 12:05 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jerny
Član
Član



Pridružen-a: Čet 17 Apr 2008 11:27
Prispevkov: 414
Aktiv.: 1.98
Kraj: Dravograd

PrispevekObjavljeno: Sob Mar 06, 2010 11:31 pm    Naslov sporočila:   Odgovori s citatom

if (Button(&PORTA, 4, 0, 1)) , 4 pomeni kateri pin, torej v tvojem primeru PORTA4. 0 pa pomeni katero stanje čekiramo, torej če je tipka sklenjena z maso bo pogoj izpolnjen. 1 pa pomeni (debounce) torej kako dolgo mora biti tipka pritisnjena da bo zaznalo v us. Moja verzija programa mislim da ne bo ustrezala tvojim zahtevam. Sem tudi sam "bolkone" začel z pici, tako da za ostalo pomoč pri timerjih raje ne bom kvasil da ne bom učil krive vere.
_________________
Če smrdi je kemija, če kadi pa elektronika!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sob Mar 06, 2010 11:53 pm    Naslov sporočila:   Odgovori s citatom

Nastavi TRM0 kot counter. Potem ti bo HW počel vse kar je potrebno, ti le izpisuješ stanje timerja na porte.

V CCS-ju bi to zgledalo takole:

Koda:
#include <18F452.h>
#device adc=8
#FUSES NOWDT, WDT128, HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, BORV20, PUT, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=20000000)

#byte TMR0H = 0xFD7
#byte TMR0L = 0xFD6


void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_L_TO_H);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);

   set_timer0(0);
   
   while(0)
   {
      output_C(TMR0L);
      output_D(TMR0H);
   }


}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Ned Mar 07, 2010 1:38 am    Naslov sporočila:   Odgovori s citatom

Verjetno velja še omeniti, da uporabljamo MPLAB in C18 compiler. Se bom danes zjutraj lotil zadeve in postal kodo. Hvala zaenkrat Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Ned Mar 07, 2010 2:02 pm    Naslov sporočila:   Odgovori s citatom

V šoli smo naredili tale primer, kjer smo timer vezali na takt oscilatorja in stevec povecevali, ko je prišlo do overflowa.

Koda:

#include <p18f452.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void main()
{
    char st = 0;
    INTCONbits.TMR0IF = 0;
    T0CON = 0x47;
    TMR0L = 0;
    T0CONbits.TMR0ON = 1;
    TRISC = 0;
   
    for (;;)
    {
        if (INTCONbits.TMR0IF)
        {
            PORTC = st++;
            INTCONbits.TMR0IF = 0;
        }
    }
}


Ta način mi je čist jasen ... kako za vraga pa sedaj narediti, da se bo stevec poveceval ob pritisku na tipko, ki je povezana na RA4 pin.

Vem, da moram T0CON nastviti na 10101000, kako pa potem dalje?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Ned Mar 07, 2010 3:39 pm    Naslov sporočila:   Odgovori s citatom

Nalogo sem rešil takole ... ali je pravilno?

Koda:

#include <p18f452.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void main()
{
    char st = 0;
    T0CON = 0b10101000;
    TRISB = 0;
   
    for (;;)
    {
        if (PORTAbits.RA4 == 1)
        {
            PORTB = st++;
            while (PORTAbits.RA4 == 1);
        }
    }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Ned Mar 07, 2010 5:44 pm    Naslov sporočila:   Odgovori s citatom

Ne ni pravilno. Vse kar moraš naredit je to, da postaviš T0CON = 0b10101000; in potem TRIS.RA4 postaviš kot vhod. V glavni zanki pa le še izpisuješ vrednost timerja0, ki se v tem primeru obnaša kot števec in že sam spremlja in povečuje svojo vrednost ob prisotnosti signala na RA4. Za to ti ni treba skrbet. Kot sem že prej napisal, za to ti skrbi HW.

Torej ...
Koda:
#include <p18f452.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF

void main()
{
    char st = 0;
    T0CON = 0b10101000;
    TRISB = 0;
    TRISA = 0b00010000;
   
    while (1)
    {
       
            PORTB = TMR0L;   
    }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pajci
Član
Član



Pridružen-a: Sob 06 Mar 2010 19:49
Prispevkov: 13
Aktiv.: 0.07
Kraj: Slovenske Konjice

PrispevekObjavljeno: Ned Mar 07, 2010 11:58 pm    Naslov sporočila:   Odgovori s citatom

Heh končno razumem. Hvala ti bungee.
Imam pa zopet problem. Končno bolj ali manj poznam delovanje timerja0, imam pri novi nalogi timer3.

Naloga je takšna:
Citiram:
Napišite funkcije za delo s časovnikom 1,2 ali 3 (dodeljen vam bo na vajah). Napišite naslednje funkcije:

initTimerX() - inicializacija časovnika, števec naj se povečuje kar najpočasneje,

getTimeX() - funkcija vrne trenutno vrednost števca

dTX(time) - funkcija vrne razliko med trenutno vrednostjo števca in časom time. Funkcija naj bo odporna na en preliv (overflow) števca.


Prvi in drugi del sem naredil takole:
Koda:

void initTimerX()
{
    PIR2bits.TMR3IF = 0;
    T3CON = 0b11011101;
    TMR3L = 0;   
}

int getTimeX()
{
    return TMR3L;
}


Tukaj točno ne vem kaj uporabiti za števec saj sta dve verziji ... TMR3L in TMR3H ... kakšna je razlika med njima oz kako se ju uporablja. Bral sem da je L za last significant bit H pa za most significant bit. Kaj je fora tega?

Potem mi ni jasno kako se nastavi 6 bit za T3CON. V dokumentaciji piše
Citiram:
bit 6-3 T3CCP2:T3CCP1: Timer3 and Timer1 to CCPx Enable bits
1x = Timer3 is the clock source for compare/capture CCP modules
01 = Timer3 is the clock source for compare/capture of CCP2,
Timer1 is the clock source for compare/capture of CCP1
00 = Timer1 is the clock source for compare/capture CCP modules


Kaj pa je sedaj s5 to(CPP/x/1/2)?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 08, 2010 1:29 am    Naslov sporočila:   Odgovori s citatom

TMR3L in TMR3H sta 8 bitni komponenti 16 bitnega števca. Wink

Torej High byte in Low byte.

Če ne boš uporabljal CCP modula potem bita 6 in 3 nastavi na 0.

Koda:
int getTimeX()
{
    return TMR3L;
}

Ta koda ne bo dobra, ker imaš 16 biten števec ne 8 bitnega. Ne vem kako se v C18 pretvarja dve 8 bitni vrednosti v 16 bitno..... no vsekakor bi to šlo, če bi s pointerjem vrnil vrednost direktno iz TMR3 lokacije in seveda to opredelil kot 16 bitno vrednost Wink Na žalost nisem tako močno domač v tem področju, tako da ti težko pomagam. V CCS-ju bi enostavno definiral kje se nahaja ta timer in bi ga kot spremenljivko vračal nazaj.

In inicializirati moraš High in Low byte. (TMR3L=0; TMR3H=0; )
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-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: 494 dni


Powered by phpBB © 2001, 2005 phpBB Group