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

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Sob Mar 06, 2010 8:10 pm Naslov sporočila: Programiranje PIC18F452 |
|
|
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...
Hvala za odgovor! |
|
Nazaj na vrh |
|
 |
jerny Član


Pridružen-a: Čet 17 Apr 2008 11:27 Prispevkov: 414 Aktiv.: 1.98 Kraj: Dravograd
|
Objavljeno: Sob Mar 06, 2010 8:20 pm Naslov sporočila: |
|
|
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 |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sob Mar 06, 2010 10:54 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
Pajci Član

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Sob Mar 06, 2010 11:16 pm Naslov sporočila: |
|
|
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 
Nazadnje urejal/a Pajci Ned Mar 07, 2010 12:05 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
jerny Član


Pridružen-a: Čet 17 Apr 2008 11:27 Prispevkov: 414 Aktiv.: 1.98 Kraj: Dravograd
|
Objavljeno: Sob Mar 06, 2010 11:31 pm Naslov sporočila: |
|
|
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 |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sob Mar 06, 2010 11:53 pm Naslov sporočila: |
|
|
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 |
|
 |
Pajci Član

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Ned Mar 07, 2010 1:38 am Naslov sporočila: |
|
|
Verjetno velja še omeniti, da uporabljamo MPLAB in C18 compiler. Se bom danes zjutraj lotil zadeve in postal kodo. Hvala zaenkrat  |
|
Nazaj na vrh |
|
 |
Pajci Član

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Ned Mar 07, 2010 2:02 pm Naslov sporočila: |
|
|
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 |
|
 |
Pajci Član

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Ned Mar 07, 2010 3:39 pm Naslov sporočila: |
|
|
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 |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Ned Mar 07, 2010 5:44 pm Naslov sporočila: |
|
|
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 |
|
 |
Pajci Član

Pridružen-a: Sob 06 Mar 2010 19:49 Prispevkov: 13 Aktiv.: 0.07 Kraj: Slovenske Konjice
|
Objavljeno: Ned Mar 07, 2010 11:58 pm Naslov sporočila: |
|
|
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 |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Pon Mar 08, 2010 1:29 am Naslov sporočila: |
|
|
TMR3L in TMR3H sta 8 bitni komponenti 16 bitnega števca.
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 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 |
|
 |
|
|
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
|