Stránka 2 z 2
Napsal: 24 dub 2015, 13:07
od Ladin
Jirko diky za radu, to uz je pro me dost slozite k pochopeni, ale snad to casem pochopim
![Very Happy :D](./images/smilies/icon_biggrin.gif)
... nicmene ten kod od rnbw mi prijde perfektni akorat to nemuzu rozchodit, vubec to nereaguje, cecko me obcas privadi k silenstvi
co mam zase spatne?
Kód: Vybrat vše
.
.
.
void main(void) {
TRISAbits.TRISA0 = 1;
TRISAbits.TRISA1 = 1;
TRISAbits.TRISA2 = 1;
TRISCbits.TRISC0 = 1;
TRISCbits.TRISC1 = 1;
TRISCbits.TRISC2 = 1;
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
TRISCbits.TRISC5 = 1;
.
.
.
int stupne;
while (1){
stupne = (LATC & 0b111111) << 3 | (LATA & 0b111);
writenumH (stupne,70,145,64,0); //funkce pro vypis cisla na lcd
}
}
kdyz privedu napeti na piny RA0 - RA2, RC0 - RC5 vubec se stupne nezmeni (stale 0), neco chybi v nastaveni portu pro digitalni vstup?
Diky
Napsal: 24 dub 2015, 13:19
od Ladin
Aha tak uz to mam, misto LAT musi byt PORT, uz to chodi, diky vsem!
Napsal: 27 dub 2015, 23:00
od mtajovsky
Přijel jsem z weekendu a vidím - pánové, co tu řešíte za složitosti?
![Smile :)](./images/smilies/icon_smile.gif)
Pokud chci dostat data z portu do proměnné, je to snad obyčejné přiřazení
Kód: Vybrat vše
unsigned char c = PORTA; // vsechny bity
unsigned char d = PORTB & MASKA; // kde maska "propusti" bity na pozicich, kde ma sama log. 1
Pokud by se mělo výsledné slovo skládat ze skupin bitů nějak na přeskáčku, tak lze použít bitová pole. Následující prográmek složí výsledné 16 bitové slovo ze 3 skupin bitů o délkách 3, 6 a 7 bitů. Pro jednoduchost jsou jako data použity konstanty.
Kód: Vybrat vše
typedef struct
{
unsigned dolni_3 : 3; // bity 0-2
unsigned strednich_6 : 6; // bity 3-8
unsigned nejvyssich_7 : 7; // bity 9-15
}BitFields;
typedef union
{
BitFields as_bit_fields;
unsigned short int as_short_int;
}InData;
int main(int argc, char* argv[])
{
InData data;
data.as_bit_fields.nejvyssich_7 = 0xc0;
data.as_bit_fields.strednich_6 = 0x7f;
data.as_bit_fields.dolni_3 = 0x07;
unsigned short int result = data.as_short_int;
return 0;
}
Potřebné shifty a maskování zařídí překladač automaticky. Výsledek je v proměnné result = 0x81ff. Všmněte si, že i když přiřazení:
Kód: Vybrat vše
data.as_bit_fields.strednich_6 = 0x7f;
přesahuje svou konstantou 0x7f délku pole 6 bitů, je automaticky oříznuto na 6 bitů a výsledek 0x81ff je stejný jako pro přířazení:
Kód: Vybrat vše
data.as_bit_fields.strednich_6 = 0x3f;
Napsal: 27 dub 2015, 23:09
od rnbw
Toto ale bude davat rozne vysledky na little- a big-endian CPU.
Napsal: 27 dub 2015, 23:14
od mtajovsky
Jste si jistý? BitFields by se mělo složit podle váhy bitů, ne podle grafické polohy. Shifty taky ve skutečnosti realizují aritmetické operace a ne posuv.
Edit: tak asi ano, bude to závislé, je to cena za jednoduchost. Pokud by to vadilo, pak se to musí udělat skutečně ručně.