Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
MihaiStoica

Tehnica de programare

Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Multumesc.Ei bine, am gasit o solutie bazata pe definiri si mascari. Sincer vorbind nu este prea eleganta, dar merge

Share this post


Link to post
Share on other sites

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);

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.