Sari la conținut
ELFORUM - Forumul electronistilor

Tehnica de programare


MihaiStoica

Postări Recomandate

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
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • MihaiStoica

    5

  • bogdanm

    2

  • Cristiano

    1

  • Arcer

    1

Top autori în acest subiect

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

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

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări