forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
cyklus switch

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Velda
Anonymní





PříspěvekZaslal: 23 listopad 2014, 0:01    Předmět: cyklus switch Citovat

Nemaam žadnou zkušenost stím to cyklem...

co mam zadat do zavorek za switch abych kontrolovam vstupy na PORTA

ktery byl sepnut. A jak za case zadat pin vstupu?




switch ( .....)
{

case ...:

}
Návrat nahoru
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 23 listopad 2014, 10:44    Předmět: Citovat

kód:
switch(PORTA){
  case 0b0000001: //blabla
                          break;
  case 0b0000010: //blabla
                          break;
  case 0b0000100: //blabla
                          break;
}

_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 739

PříspěvekZaslal: 23 listopad 2014, 11:07    Předmět: Citovat

SWITCH není cyklus, ale násobné rozhodování (vlastně několikanásobný IF).
Příklad asi napoví víc :
kód:

.
.
.
if (PROMENNA==0)
{
  Provádí;
  se;
  akce;
  pro;
  proměnná=0;
}
if (PROMENNA==1)
{
  Provádí;
  se;
  akce;
  pro;
  proměnná=1;
}
if (PROMENNA==2)
{
  Provádí;
  se;
  akce;
  pro;
  proměnná=2;
}
if (PROMENNA==3)
{
  Provádí;
  se;
  akce;
  pro;
  proměnná=3;
}
if (PROMENNA==4)
{
  Provádí;
  se;
  akce;
  pro;
  proměnná=4;
}
.
.
.



a tady je totéž pomocí SWITCH :
kód:

.
.
.
switch (PROMENNA)
{
    case 0:  Provádí;
             se;
             akce;
             pro;
             proměnná=0;
             break;

    case 1:  Provádí;
             se;
             akce;
             pro;
             proměnná=1;
             break;

    case 2:  Provádí;
             se;
             akce;
             pro;
             proměnná=2;
             break;

    case 3:  Provádí;
             se;
             akce;
             pro;
             proměnná=3;
             break;

    case 4:  Provádí;
             se;
             akce;
             pro;
             proměnná=4;
             break;

    case 5:  Provádí;
             se;
             akce;
             pro;
             proměnná=5;
             break;

    default: Provádí;
             se;
             akce;
             pro;
             všechny;
             ostatní
             hodnoty;
             break;
}
.
.
.



příkaz BREAK je nutný, jinak se bude provádět vše, co je dál. Tedy pokud je proměnná 3, provede se akce pro proměnnou 3 a kdyby tam nebyly ty BREAKy, tak se provede i 4, 5 a default. Položka default není povinná. Pokud tam nebude, neprovede se v ostatních případech nic. Rozdíl je jednak v přehlednosti zápisu, ale hlavně v tom, že v případě IFů se proměnná vyhodnocuje při každé podmínce (provádí se každý IF zvlášť), v případě SWITCHe se proměnná vyhodnocuje pouze jednou.

Takže pokud zvládneš zapsat podmínku do IF, zvládneš zapsat i podmínku do SWITCHe.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 887
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 23 listopad 2014, 11:30    Předmět: Citovat

citace:
ale hlavně v tom, že v případě IFů se proměnná vyhodnocuje při každé podmínce (provádí se každý IF zvlášť), v případě SWITCHe se proměnná vyhodnocuje pouze jednou.
ses si jistej ? (samo zalezi na prekladaci ale v mim pripade rozhodne ne)
kód:
20:                switch(i){
  0035    0821     MOVF 0x21, W
  0036    1903     BTFSC 0x3, 0x2
  0037    284B     GOTO 0x4b
  0038    3A01     XORLW 0x1
  0039    1903     BTFSC 0x3, 0x2
  003A    284D     GOTO 0x4d
  003B    3A03     XORLW 0x3
  003C    1903     BTFSC 0x3, 0x2
  003D    284F     GOTO 0x4f
  003E    3A01     XORLW 0x1
  003F    1903     BTFSC 0x3, 0x2
  0040    2851     GOTO 0x51
  0041    3A07     XORLW 0x7
  0042    1903     BTFSC 0x3, 0x2
  0043    2853     GOTO 0x53
  0044    3A01     XORLW 0x1
  0045    1903     BTFSC 0x3, 0x2
  0046    2855     GOTO 0x55
  0047    3A03     XORLW 0x3
  0048    1903     BTFSC 0x3, 0x2
  0049    2857     GOTO 0x57
  004A    2859     GOTO 0x59

_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 739

PříspěvekZaslal: 23 listopad 2014, 13:27    Předmět: Citovat

Jsem si jistej. Samozřejmě záleží na inteligenci překladače, případně na jeho nastavení. Ty jsi sem hodil překlad SWITCHe, překlad IFů je stejný ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
colombo
Profesionál
Profesionál


Založen: 11.4.2008
Příspěvky: 50

PříspěvekZaslal: 27 listopad 2014, 12:48    Předmět: Citovat

v C jak u HiTEch tak XC8 od Microchipu je zápis s IF ve výsledku kratší. Empiricky ověřeno. pokud šetříte pamětí, potom IF. Dokonce bude i nějaký ten cyklus rychlejší. Jediný rozdíl je skutečně v tom, že u Switch bez Break se provádí následující kód, což někdy může zase výhodou.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Vlastik_123
Nováček
Nováček


Založen: 29.2.2012
Příspěvky: 6
Bydliště: Ostrava

PříspěvekZaslal: 07 prosinec 2014, 13:11    Předmět: Citovat

MiloPS3 napsal:
kód:
switch(PORTA){
  case 0b0000001: //blabla
                          break;
  case 0b0000010: //blabla
                          break;
  case 0b0000100: //blabla
                          break;
}


Takto to můžeš testovat jen pokud zajistíš, že v jednu chvíli bude sepnut jen jeden vstup. Jinak bys tam musel mít 255 case. Jednodušší je testovat jednotlivé bity portu, tam máš jen 8 podmínek. Např:

#define bit_get(adr, bit) ((adr) & (1<<bit)) // hodnota bitu (váha)

a pak ti stačí testovat takto:

if (bit_get(PORTA, 0) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 1) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 2) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 3) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 4) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 5) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 6) == 1) {proveď něco při 1;} else {proveď něco při 0;}
if (bit_get(PORTA, 7) == 1) {proveď něco při 1;} else {proveď něco při 0;}

a tím máš zajištěno, že se ti projede vždy celý port a odchytíš na něm jakoukoli změnu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2018 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)