MihaiStoica Postat Noiembrie 14, 2005 Partajează Postat Noiembrie 14, 2005 Stimati colegiO problema de care m-am lovit este aceea de a defini o variabila de tip caracter ai carei biti componenti sa fie biti individuali ai diferitelor porturi. La ce imi trebuie ? Simplifica extraordinar de mult cablajul.Multam fain Link spre comentariu
Arcer Postat Noiembrie 14, 2005 Partajează Postat Noiembrie 14, 2005 in C sau asm? Link spre comentariu
MihaiStoica Postat Noiembrie 15, 2005 Autor Partajează Postat Noiembrie 15, 2005 In C Link spre comentariu
bogdanm Postat Noiembrie 15, 2005 Partajează Postat Noiembrie 15, 2005 In C nu merge direct. Dar poti avea rutine de read/write in care sa te joci individual cu fiecare bit din port. Daca vrei ca la fiecare acces de memorie (de exemplu a = c, unde c este o variabila ipotetica cu biti repartizati la diverse porturi) compilatorul sa stie cum sa acceseze c, ma tem ca C-ul standard nu iti da posibilitatea sa faci asta. Poate exista vreo extensie pentru compilatorul tau specific de C, dar nici asta nu prea cred. Link spre comentariu
MihaiStoica Postat Noiembrie 15, 2005 Autor Partajează Postat Noiembrie 15, 2005 Multumesc.Ei bine, am gasit o solutie bazata pe definiri si mascari. Sincer vorbind nu este prea eleganta, dar merge Link spre comentariu
Cristiano Postat Noiembrie 15, 2005 Partajează Postat Noiembrie 15, 2005 Alternativa: struct eight_bits{ unsigned char bit0 :1; unsigned char bit1 :1; unsigned char bit2 :1; unsigned char bit3 :1; unsigned char bit4 :1; unsigned char bit5 :1; unsigned char bit6 :1; unsigned char bit7 :1;};union chartype{ unsigned char byte; struct eight_bits part;};typedef union chartype my_char;my_char c;c.byte = 'A';RB4 = c.part.bit5;RB5 = c.part.bit8;RA2 = c.part.bit3;//etcori:void output_char(mychar* x) { RB4 = x->part.bit5; RB5 = x->part.bit8; RA2 = x->part.bit3; //etc }si in program:my_char* c;c->byte = 'A';output_char(c); Link spre comentariu
MihaiStoica Postat Noiembrie 16, 2005 Autor Partajează Postat Noiembrie 16, 2005 Cristiano, solutia propusa este eleganta. M-am gandit si eu la ceva asemanator (este aproape evident ca definirea unei structuri se impune) insa am avut in minte o bucatica de cod vazuta undeva, candva, in care bitii erau definiti ca biti si nu ca niste variabile de tip caracter. Daca il gasesc il postez pe site. Oricum, multam fain Link spre comentariu
MihaiStoica Postat Noiembrie 16, 2005 Autor Partajează Postat Noiembrie 16, 2005 Scuze, in graba n-am vazut caracterul : din definitia structurii Link spre comentariu
bogdanm Postat Noiembrie 16, 2005 Partajează Postat Noiembrie 16, 2005 Tipul de date 'bit' nu exista in standardul C. Oricum ai face, tot trebuie sa 'jonglezi' singur cu bitii ca sa construiesti un char. Solutia data de Cristiano este eleganta, fara indoiala, dar sunt convins ca in general poti genera cod mai bun decat compilatorul chiar direct din C, in conditiilie in care gasesti o secventa de masti/shift-uri care sa poata fi aplicata pe configuratia ta particulara de biti/porturi.Ceea ce e posibil sa fi vazut este o definie a unui tip de date 'bit' in C++ si apoi un tip de date 'byte' (de exemplu) definit ca o colectie de biti. Dar asta e alta poveste, si in opinia mea nu merita in nici un fel sa-ti bati capul cu asa ceva, decat daca vrei sa demonstrezi cat de bine te pricepi la programare. Ca altfel o mica functie cu cateva shiftari/masti se descurca mult mai bine. Link spre comentariu
ciocead4 Postat Noiembrie 16, 2005 Partajează Postat Noiembrie 16, 2005 Ca altfel o mica functie cu cateva shiftari/masti se descurca mult mai bine.Eu as pune mai degraba niste macro-uri in locul functiei, pentru a evita stiva:#define bit_get(p,m) ((p) & (m)) #define bit_set(p,m) ((p) |= (m)) #define bit_clear(p,m) ((p) &= ~(m)) #define bit_flip(p,m) ((p) ^= (m)) #define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m)) #define BIT(x) (0x01 << (x)) Asa cum a spus Bogdan operatiile cu biti sunt dependente de platforma, cel mai bine ar fi sa te uiti in codul asm generat de compilator daca ai atins nivelul de optimizare dorit. Revenind la intrebarea initiala, a compune un tip de data (char in cazul tau) pentru a simplifica PCB-ul nu-i intotdeauna o solutie buna; eu prefer sa "complic" PCB-ul uneori, doar ca sa citesc valoarea portului intr-o instructiune atomica sau un numar restrans de instructiuni asm (numar nedependent de marimea "operanzilor"). Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum