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


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Sre Nov 24, 2010 10:12 pm Naslov sporočila: mikroC za AVR in prekinitve |
|
|
Pozdravljeni !
Nekako sem dobro začel s programiranjem v mikroC programskem jeziku in me zanima ali ga še kdo uporablja ?
Imam namreč težavo pri uporabi zunanjih prekinitvah, ki jih nekako ne znam uporabljati . Na uradnem forumu Mikroelektronike sem že iskal kakšne informacije, pa so primeri, ki jih ne razumem najbolje. Torej če je kdo, ki tudi uporablja omenjeni jezik, bi lepo prosil, če lahko poda preprost primer s kakšnim komentarjem kako uporabiti zunanje prekinitve. |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Čet Dec 23, 2010 12:14 am Naslov sporočila: |
|
|
Odgovarjam sam sebi in sicer s malim primerom kako se uporabi zunanje prekinitve v jeziku MikroC za AVR:
Koda: |
/*
* Project name:
External Interrupt on PortD (Simple 'Hello World' project)
* Copyright:
(c) Mikroelektronika, 2010.
* Revision History:
20101006:
- initial release;
- 20101006 (RR);
* Description:
This is a simple 'Hello World' project. It counts presses on PortD.3 and
shows result on diodes connected to PORTB.
* Test configuration:
MCU: ATmega16
dev.board: EasyAVRv6
Oscillator: External Clock 08.0000 MHz
Ext. Modules: -
SW: mikroC PRO for AVR v3.50
* NOTES:
- Make sure you turn ON the PORTB LEDs (SW8.2), set PortD Pull Up Jumper in Vcc position (J4)
and turn on PortD.3 Switch (SW4.4)
*/
int cnt = 0; // Global variable cnt
void interrupt_ISR () org IVT_ADDR_INT1 { // Interrupt rutine
SREG_I_bit = 0; // Disable Interrupts
cnt++; // Increment variable cnt
SREG_I_bit = 1; // Enable Interrupts
}
void main() { // Main program
DDRD = 0xF7; // Set PD3 as input
DDRB = 0xFF; // Set PortB as output
PortD = 0x00;
PortB = 0xFF; // Starting value for PortD
GICR = 0x80; // Set the Interrupts
MCUCR = 0x08; // Configure Interrupt for falling edge on PortD.3
SREG_I_bit = 1; // Enable Interrupts
while(1){ // Unending loop
PortB = cnt; // Write on PortB value of varibale cnt
}
} |
|
|
Nazaj na vrh |
|
 |
Sadida Član


Pridružen-a: Pet 17 Apr 2009 12:53 Prispevkov: 636 Aktiv.: 3.23 Kraj: Zasavje
|
Objavljeno: Čet Dec 23, 2010 4:37 pm Naslov sporočila: |
|
|
Kako se razlikuje mikroC jezik od C jezika. In zakaj ti je boljši? Predvidevam, da ti je ker ga uporabljaš. |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Čet Dec 23, 2010 7:49 pm Naslov sporočila: |
|
|
Bistvene razlike sicer ni, je mogoče kakšna rutina napisana, tako da je lažja za uporabo, če si začetnik v programiranju kot sem jaz. V C-ju sicer nimam izkušenj oz. samo toliko kot smo delali na faksu kjer je bil en semester obvezen predmet. Zdi se mi da sta zelo podobna.
Razlog, da ga uporabljam, je ta, da znam C od prej iz predavanj, ki smo jih imeli. Da pa nisem ostal na C-ju je glavni razlog ta, da sem po spletu okoliščin dobil licenco za ta program, tako da vsaki nadaljni update in nove verzije mi ne bo potrebno kupovati, kar se mi zdi nekako neka prednost sploh v navezi s tem, ker imam tudi razvojno orodje od istega proizvajalca, kjer se mi zdi, da je tudi podpora za njihove izdelke dobra.
Ker sta oba izdelka, tako razvojna plošča, kot tudi prevajalnik, istega proizvajalca, je programiranje določenih stvari zame lažje, ker so nekatere stvari v naprej pripravljene, tako da ni potrebno vedno na novo definirati npr. priključkov za lcd in podobne stvari. No, saj si lahko tudi v drugih okoljih to shraniš in uporabljaš za v naprej, ampak vseeno.
Všeč mi je tudi interface, ki se mi zdi nekoliko enostavnejši od npr. drugih bolj profesionalnih orodij. |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Pet Dec 31, 2010 2:41 pm Naslov sporočila: |
|
|
Pozdrav !
Zanimam me zakaj ne morem odpraviti debounce efekta pri prekinitvah ? Dodal sem eno zakasnitev 30 ms, za cnt++ oz, vmes ko je prekinitev izključena, pa se efekt ne odpravi popolnoma. Je bolje ampak ni dobro. Če povečam zakasnitev na več, ni efekta, je kvečjemu slabše.
Lp, in srečno 2011 ! |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Pet Dec 31, 2010 3:51 pm Naslov sporočila: |
|
|
V kolikor gledaš stanje s tipko, ki je vezana na prekinitev, potem moraš takoj, ko se prekinitev proži (ko stisneš tipko in program skoči v podprogram, ki ti streže prekinitev)
začasno onemogočiti prekinitve. Se pravi: Pritisneš tipko, prožiš prekinitev, takoj onemogočiš prekinitve, počakaš 5-10ms, preveriš, če je tipka še vedno aktivna, če je, postaviš eno zastavico in jo potem v glavni zanki obdelaš. V glavni zanki spet omogočiš prekinitve, da boš lahko spet pritisnil tipko.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Pet Dec 31, 2010 5:44 pm Naslov sporočila: |
|
|
Trenutno imam narejeno podobno v podprogramu za prekinitev. Ko pride do prekinitve se prekinitev onemogoči, števec se poveča in pa počakam še nekaj ms zaradi debounce efekta, potem pa vklopim prekinitve nazaj. Pa ne dela tako kot bi moralo, čeprav mislim, da je tudi ta način pravilen. Prekinitev pa imam nastavljeno da se proži z pozitivno fronto. |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Pet Dec 31, 2010 7:12 pm Naslov sporočila: |
|
|
Daj zakasnitev preden povečaš števec, še prej pa dodaj še eno If zanko, kjer gledaš, če je pin, na katerem imaš tipko še vedno na 1 ali 0, odvisno kako stvar gledaš.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Pet Dec 31, 2010 7:45 pm Naslov sporočila: |
|
|
To pred števec sem že tudi probal, je isto. Nisem pa probal tega z if stavkom, tako da bom še to poskusil.
EDIT: Super RGorazd najlepša hvala. Sedaj pa dela tako kot je treba. V podprogramu za prekinitev sem dodal še tisti if stavek, pred njega pa zakasnitev. Dela kot je treba . |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|