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 

switch statement za ATMEGA32

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
pogorevc
Član
Član



Pridružen-a: Pet 16 Avg 2013 23:07
Prispevkov: 53
Aktiv.: 0.37

PrispevekObjavljeno: Ned Sep 29, 2013 5:32 pm    Naslov sporočila:  switch statement za ATMEGA32 Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 5.65
Kraj: Črnomelj

PrispevekObjavljeno: Ned Sep 29, 2013 5:40 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
pogorevc
Član
Član



Pridružen-a: Pet 16 Avg 2013 23:07
Prispevkov: 53
Aktiv.: 0.37

PrispevekObjavljeno: Pon Sep 30, 2013 11:27 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 5.65
Kraj: Črnomelj

PrispevekObjavljeno: Pon Sep 30, 2013 11:31 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Tomazp
Član
Član



Pridružen-a: Sob 02 Feb 2008 13:24
Prispevkov: 559
Aktiv.: 2.64
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 30, 2013 11:33 am    Naslov sporočila:   Odgovori s citatom

Upoštevaj tudi, da ti "switch" spremembe stanja med samo rutino ne zazna. V tem primeru se uporabi "if" stavek.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
pogorevc
Član
Član



Pridružen-a: Pet 16 Avg 2013 23:07
Prispevkov: 53
Aktiv.: 0.37

PrispevekObjavljeno: Pon Okt 21, 2013 7:51 pm    Naslov sporočila:  primer na switch Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.40

PrispevekObjavljeno: Pon Okt 21, 2013 8:08 pm    Naslov sporočila:   Odgovori s citatom

Vsak normalen prevajalnik bo javil napako pri "switch(1)". ATMEGA32 pa itak ne pozna ukaza "switch"...
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
pogorevc
Član
Član



Pridružen-a: Pet 16 Avg 2013 23:07
Prispevkov: 53
Aktiv.: 0.37

PrispevekObjavljeno: Tor Okt 22, 2013 9:14 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
pogorevc
Član
Član



Pridružen-a: Pet 16 Avg 2013 23:07
Prispevkov: 53
Aktiv.: 0.37

PrispevekObjavljeno: Tor Okt 22, 2013 9:21 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.40

PrispevekObjavljeno: Tor Okt 22, 2013 9:31 am    Naslov sporočila:   Odgovori s citatom

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
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 -> Elektronika za začetnike Č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: 497 dni


Powered by phpBB © 2001, 2005 phpBB Group