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



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
Objavljeno: Sre Okt 14, 2009 10:28 am Naslov sporočila: Globalne spremenljivke v Cju |
|
|
Najbolje da kar pripnem kos kode, ki me muči:
Koda: |
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include "lcd.h"
#define motor 1
#define motor_on PORTC |= (1<<motor)
#define motor_off PORTC &= ~(1<<motor)
#define led 7
#define led_on PORTB |= (1<<led)
#define led_off PORTB &= ~(1<<led)
#define sredina 1
#define levo 2
#define desno 3
static char ld;
ISR (SIG_OVERFLOW2)
{
ld = levo ;
PORTB ^= (1<<led);
}
int main(void)
{
// ld = levo;
DDRC = (1<<motor);
DDRB = (1<<led);
motor_off;
TIMSK = 1 <<TOIE2;
TCCR2=0x07;
sei ();
while (1) {
_delay_ms(50);
motor_on;
if (ld == levo) {
_delay_us(800);
}
motor_off;
}
return 0;
}
|
Problem je v tem, da ko v interruptu nastavim da je ld = levo to potem glavni program ne upošteva. Zgleda tako, kot da iz interrupta ne bi imel dostopa do spremenljivke ld. Interrupt se izvaja 100%, ker mi ledica utripa. Če na začetku programa vklopim tisti ld = levo, ki je zakomentiran, mi izvaja _delay_us(800).
Kako moram definirat spremenljivko, da bom lahko v njo pisal iz interrupta? |
|
Nazaj na vrh |
|
 |
upornik Član

Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.10 Kraj: Celje
|
Objavljeno: Sre Okt 14, 2009 10:43 am Naslov sporočila: |
|
|
Jaz dam volatile spredaj za globalne spremenljivke in vedno deluje, samo nisem prepričan, da bo v tem primeru, ker imaš static  |
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
Objavljeno: Sre Okt 14, 2009 10:46 am Naslov sporočila: |
|
|
Ok super.. z volatile deluje Hvala |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.13 Kraj: Kobarid
|
Objavljeno: Sre Okt 14, 2009 10:50 am Naslov sporočila: |
|
|
Hmm kaj ni static za statične vrednosti, ki se naj nebi spreminjale??? Mislim da bi šlo tudi z samo char _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Sre Okt 14, 2009 11:43 am Naslov sporočila: |
|
|
Ja, static tip spremenljivke se naj ne bi spreminjal, zato mu prevajalnik dodeli prostor v flashu in ne v ramu. Jasno, da se flash-a kar tako ne da spreminjati, zato se vrednost ni spremenila. |
|
Nazaj na vrh |
|
 |
upornik Član

Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.10 Kraj: Celje
|
Objavljeno: Sre Okt 14, 2009 12:37 pm Naslov sporočila: |
|
|
Ja, saj to se je meni tudi zdelo čudno, ker static tip se naj ne bi spreminjal, verjetno mora res samo z char delovati. |
|
Nazaj na vrh |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.14 Kraj: okolica Divače
|
Objavljeno: Sre Okt 14, 2009 1:15 pm Naslov sporočila: |
|
|
Samo s char ni hotelo delat, čeprav v starejših verzijah gccja je delalo.. Mogoče so kaj popravlili. V glavnem stvar sedaj deluje  |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.41
|
Objavljeno: Sre Okt 14, 2009 1:19 pm Naslov sporočila: |
|
|
spy je napisal/a: |
Ja, static tip spremenljivke se naj ne bi spreminjal, zato mu prevajalnik dodeli prostor v flashu in ne v ramu. Jasno, da se flash-a kar tako ne da spreminjati, zato se vrednost ni spremenila. |
Malo si pomešal static in const, ane?
Static se spreminja, vendar ohranja vrednost med posameznimi klici funkicje (recimo v rekurziji). Const je pa konstanta, ta se ne spreminja. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70810.75
|
Objavljeno: Sre Okt 14, 2009 2:13 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Sre Okt 14, 2009 3:21 pm Naslov sporočila: |
|
|
Takšen test ne vem če bi naredil... Vsekakor zanimivo. _________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
janiP Član

Pridružen-a: Čet 23 Okt 2008 23:00 Prispevkov: 145 Aktiv.: 0.72 Kraj: Ljubljana
|
Objavljeno: Sre Okt 14, 2009 4:04 pm Naslov sporočila: |
|
|
Pri globalnih spremenljivkah je vseeno če uporabljaš static ali ne, ker je vsaka globalna spremenljivka itak že statična.
Volatile pa pove prevajalniku, da naj ne optimira kode v zvezi s to spremenljivko. Volatile ga prisili, da pri vsakem ciklu dejansko prebere nekje iz spomina vsebino te spremenljivke. Brez volatile bo spremenljivko samo enkrat naložil v nek delovni register, nato pa bo računal samo s tem registrom.
Se pravi, volatile uporabiš npr. tam, kjer si spremenljivko deliš z nekim interuptom, lahko pa tudi takrat, ko uporabljaš kakšen debugger. |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Sre Okt 14, 2009 5:27 pm Naslov sporočila: |
|
|
"Celo življenje se učiš, pa še neumen umreš". Bo držalo, moja napaka glede razlage static. Se oproščam.
Ampak... pred časom mi je ravno static povzročil precej sivih las. Sicer pri ARM-u in IARju. Prevajanik mi je spremenljivko vrgel v flash, spremenljivka se je hotela spremeniti in vpis je povzročil Hard_fault prekinitev. Torej vem, da spet nič ne vem...
Hvala za opozorilo. Bo vsaj ena luknja več zapolnjena (v glavi). |
|
Nazaj na vrh |
|
 |
Jan Član


Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.35 Kraj: Dolenjska
|
Objavljeno: Sre Okt 14, 2009 6:21 pm Naslov sporočila: |
|
|
Ravno včeraj sem imel popolnoma identičen problem. Sicer sem potem to rešil z malo večjim spreminjanjem programa, ampak mi je požrlo še pa še živcev... Važno da sedaj vem za drugič.
lp
Jan |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.41
|
Objavljeno: Sre Okt 14, 2009 11:07 pm Naslov sporočila: |
|
|
Hmm... malo sem si napačno razlagal const. Sicer imam "izgovor", ker sem se C učil direkt iz "biblije", tam pa const še ni bil definiran...
Hvala za tale link  _________________ Tule nisem več aktiven. |
|
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
|