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

Pridružen-a: Pet 16 Avg 2013 23:07 Prispevkov: 53 Aktiv.: 0.37
|
Objavljeno: Ned Sep 29, 2013 5:32 pm Naslov sporočila: switch statement za ATMEGA32 |
|
|
LP
Trenutno se trudim tako za trening narediti program v c++ na atmega32, ki bo bral senzorje na PINB2 in PINB3. Preko teh vhodom pa bom oklapljal nek izhod na PINB4 in PINB5. Želim narediti preko switch case izbire, da bo preverjal aktivnost senzorjev. Toda napisan program mi ne zakompajla in mi javi napako "case label does not reduce to an intiger constant"
napisan program v vrsticah switcha zgleda takole:
void program2(){
Send_A_String("Program2");
vrni2: switch(2){
case bit_is_set(PINB,3):
PORTB ^= 1 << PINB4;
PORTB ^= 1 << PINB5;
goto vrni2;
case bit_is_set(PINB,2):
PORTB ^= 1 << PINB4;
goto vrni2;
default:
goto vrni2;
}}
NE vem zakaj mi javlja to napako. Ali morda delam napako v definiciji swicha "Switch(1), čeprav prej sem imel vneseno SWITCH(PORTB) pa je bila zadeva enako. Kaj še moram definirati, da bo to steklo skozi.
Povem naj, da sem še začetnik v tem programiranju mi bom zelo hvaležen konkretne pomoči. Hvala |
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 5.65 Kraj: Črnomelj
|
Objavljeno: Ned Sep 29, 2013 5:40 pm Naslov sporočila: |
|
|
Treba bo nekoliko drugače.
Nekako tako:
Koda: |
switch(bit_is_set(PINB, 3)) {
case 1: { //bit_is_set je vrnil 1
PORTB ^= 1 << PINB4;
PORTB ^= 1 << PINB5;
goto vrni2;
};
case 0: { //bit_is_set je vrnil 0
PORTB ^= 1 << PINB4;
PORTB ^= 1 << PINB5;
goto vrni2;
}
}
|
_________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
pogorevc Član

Pridružen-a: Pet 16 Avg 2013 23:07 Prispevkov: 53 Aktiv.: 0.37
|
Objavljeno: Pon Sep 30, 2013 11:27 am Naslov sporočila: |
|
|
Hoj
Hvala. Sedaj pa deluje zadeva. Sem razumel koncept. Ali morda veš kako je pa recimo glede samih vhodov na atmegi glede napetosti. Ko sem jaz se začel učit sem videl, da je tip na youtube napisal program, da je recimo PINB0 vhod in PINB1 izhod. Na pin0 je nastavil tipko na pin1 pa led diodo. ON je vezal tipko iz pin0 direkt na maso
atmege in programsko dal na vhod 5v. Dobro to razumem, da se dejansko napaja sam atmega. Kako pa je recimo če želim direkt priklučiti nek senzor ali napravo,ki proizvaja neko napetost na vhod krmilnika recimo PINB0 in skupno maso. Ali lahko prejema atmega zunanjo napetost ali ga to uniči? Ali jo bo zaznal kot absolutno 1 če bo vanj pritekla napetost 5v? |
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 5.65 Kraj: Črnomelj
|
Objavljeno: Pon Sep 30, 2013 11:31 am Naslov sporočila: |
|
|
pogorevc je napisal/a: |
Ali morda veš kako je pa recimo glede samih vhodov na atmegi glede napetosti. Ko sem jaz se začel učit sem videl, da je tip na youtube napisal program, da je recimo PINB0 vhod in PINB1 izhod. Na pin0 je nastavil tipko na pin1 pa led diodo. ON je vezal tipko iz pin0 direkt na maso. |
Ja, je pin uporabil kot vhod, in mu nastavil PULL UP upor, ki je vgrajen v atmegi.
pogorevc je napisal/a: |
Kako pa je recimo če želim direkt priklučiti nek senzor ali napravo,ki proizvaja neko napetost na vhod krmilnika recimo PINB0 in skupno maso. Ali lahko prejema atmega zunanjo napetost ali ga to uniči? Ali jo bo zaznal kot absolutno 1 če bo vanj pritekla napetost 5v? |
Če senzora daje enke (5V) in ničle (0V) potem se nimaš kaj sekirat, da boš skuril.
Če pa senzor vrne napetost med 0 - 5V (analogno napetost) boš pa potreboval AD pretvornik, ki ga ima atmega vgrajenega. _________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.64 Kraj: Ljubljana
|
Objavljeno: Pon Sep 30, 2013 11:33 am Naslov sporočila: |
|
|
Upoštevaj tudi, da ti "switch" spremembe stanja med samo rutino ne zazna. V tem primeru se uporabi "if" stavek. |
|
Nazaj na vrh |
|
 |
pogorevc Član

Pridružen-a: Pet 16 Avg 2013 23:07 Prispevkov: 53 Aktiv.: 0.37
|
Objavljeno: Pon Okt 21, 2013 7:51 pm Naslov sporočila: primer na switch |
|
|
LP.
Aha razumem zanima me ali recimo prepoznal Atmega32 taksnole kodo? Kako je recimo z and in ali vrati itd. Če želim recimo da nek izhod odpre v primeru da je več vhodov aktivnh? tukaj dajem primer pa me zanima ali bo delovalo oz. kako se resi drugače?
Koda: |
switch(1){
case 1: if (bit_is_set(PINB,3)&bit_is_set(PINB,2));
PORTB ^= 1 << PINB5;// bo grelec 1 vklopil
break;
default:
break;
}
|
Ali bo razumel taksno kodo in v primeru, da ne bo pogojev sel na case 2? |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.40
|
Objavljeno: Pon Okt 21, 2013 8:08 pm Naslov sporočila: |
|
|
Vsak normalen prevajalnik bo javil napako pri "switch(1)". ATMEGA32 pa itak ne pozna ukaza "switch"... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
 |
pogorevc Član

Pridružen-a: Pet 16 Avg 2013 23:07 Prispevkov: 53 Aktiv.: 0.37
|
Objavljeno: Tor Okt 22, 2013 9:14 am Naslov sporočila: |
|
|
A potem ga ne prepozna kot switch. Kako pa potem recimo resujemo primere z AND ali OR vrati. Ko imamo recimo vec ukazov na napisati. Kateri atmega pa prepozna potem switch? |
|
Nazaj na vrh |
|
 |
pogorevc Član

Pridružen-a: Pet 16 Avg 2013 23:07 Prispevkov: 53 Aktiv.: 0.37
|
Objavljeno: Tor Okt 22, 2013 9:21 am Naslov sporočila: |
|
|
Kako je pa recimo z IF stavki. ALi lahko recimo navedem nek If pogoj in kasneje zadaj še enega? Ali bo ob primeru, da prvi ne izvši šel preverjat drugega itd ali je potreben obvezno ELSE IF stavek zasljednji?
void podprogram(){
if (bit_is_set(PINB,3)){// Pogoj če bo senzor 2 aktiven bosta oba grelca vklopila
PORTB ^= 1 << PINB4;
PORTB ^= 1 << PINB5;}
if (bit_is_set(PINB,2)){// Pogoj če bo senzor 1 aktiven bo grelec 1 vklopil
PORTB ^= 1 << PINB4;}
} |
|
Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 18.40
|
Objavljeno: Tor Okt 22, 2013 9:31 am Naslov sporočila: |
|
|
Malo mešaš hruške in jabolka. Stavek switch nima nobene veze z ATMEGA32 (ali katerim koli drugim procesorjem, če smo že pri tem), saj ta ne izvaja kode na nivoju C-ja, ampak ima nabor svojih ukazov. Prevajalnik je tisti, ki program v C prevede v ukaze, ki so razumljivi procesorju.
Switch() je pač del jezika C in ima povsod enako funkcijo, ne glede na procesor. V tvojem primeru je bil problem pri parametru, ki je konstanta (1). V tem primeru sam stavek ne naredi nič...
Toplo ti priporočam, da se najprej naučiš sam C in se nato spraviš na mikrokrmilnike, drugače se boš samo z glavo z zid zaletaval. Na C++ pa kar pozabi, vsaj na tamalih mikrokrmilnikih. V par kB spomina pač ni dovolj prostora za objekte... _________________ 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: 497 dni
Powered by phpBB © 2001, 2005 phpBB Group
|