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