převod port bitů na číslo PIC18F14k22

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#16 Příspěvek od Ladin »

Jirko diky za radu, to uz je pro me dost slozite k pochopeni, ale snad to casem pochopim :D ... nicmene ten kod od rnbw mi prijde perfektni akorat to nemuzu rozchodit, vubec to nereaguje, cecko me obcas privadi k silenstvi :parmen:

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

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#17 Příspěvek od Ladin »

Aha tak uz to mam, misto LAT musi byt PORT, uz to chodi, diky vsem!

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#18 Příspěvek od mtajovsky »

Přijel jsem z weekendu a vidím - pánové, co tu řešíte za složitosti? :) 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;
Naposledy upravil(a) mtajovsky dne 27 dub 2015, 23:11, celkem upraveno 6 x.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#19 Příspěvek od rnbw »

Toto ale bude davat rozne vysledky na little- a big-endian CPU.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#20 Příspěvek 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ě.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“