cyklus switch

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 …:

}

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

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

.
.
.
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 :

.
.
.
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.

ses si jistej ? (samo zalezi na prekladaci ale v mim pripade rozhodne ne)

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

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ý ?

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.

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.