Toon posts:

bits gewijs poort aanpassen

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ben een atmega32 aan het programmeren maar nu krijg ik een probleem met de aansturing van een poort. de taal die gebruikt word is C, de compiler is avr gcc

ik heb bv PortC deze bestaat uit pinnen 0,1,2,3,4,5,6,7
deze stuurt meerdere 7 segments displays aan via een ca6161 en een 74hc138

als ik nu PORTC de laatste 5 pinnen wil veranderen in een waarde bv allemaal 1 en de eerste 3 in 0
dan kan ik dus doen PORTC=248.
maar als ik de status van de eerste 3 niet weet. kan ik niet een &= omdat dan de eerste onbekenden overschreven kunnen worden.

heb dus bv 101 01101 en ik wil dus de laatste 5 hoog maken dus 248 er bij. het resulataat moet dus 10111111 worden.
als ik dus zou doen PORTC|=248;
heb dus
10101101
00011111
----------------
10111111


en nu wil ik de eerste 3 veranderen in 000 en de laatste 5 ongemoeid laten

1011111
???????
------------
00011111 <--- dit moet het dus worden nu
dan worden toch de laatste overschreven of zie ik het verkeerd

heb het wel werkend nu door elk bit afzonderlijk te bekijken maar echt mooi is het niet. is hier een mooie oplossing voor ?

[ Voor 28% gewijzigd door Verwijderd op 24-06-2005 22:18 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:25

Tomatoman

Fulltime prutser

Meld eerst eens over welke programmeertaal je het hebt. Verder beslaan de sleutelwoorden tot de oplossing uit (bitwise) AND, OR en NOT.

[ Voor 10% gewijzigd door Tomatoman op 24-06-2005 22:11 ]

Een goede grap mag vrienden kosten.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Wat tomatoman zegt. Zonder taal kunnen we je niet helpen. Hoe dan ook, dit geldt: 10101101 | 00011111 == 10111111

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TjardE
  • Registratie: September 2002
  • Niet online
Even kort AND en OR uitlegje misschien :

0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1

voorbeeld :

110011
011001 AND
----------
010001

Dat voorbeeld wat je gaf met dat optellen gaat niet helemaal op want als iets b.v. 100 is en je telt er 1 bij op dat wordt het 101. Als het b.v. 101 was en je telt er 1 bij op is het 102. Dus dat houdt in dat je eerst iets moet doen met je beginsituatie voordat je er iets bij kunt optellen.

Dus de situatie was b.v. 101 11001

en je wilt de laatste 5 veranderen dan kan je de situatie van de eerste 3 vinden door AND te doen met 111 00000

dus :

101 11001
111 00000 AND
---------------
101 00000

En dan pas kan je er jouw waarde bij "optellen".

Dit optellen is eigenlijk ook de OR functie

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1

voorbeeld

01100
10010 OR
---------
11110

Even in het gewoon nederlands.. Met de AND functie kun je bitjes maskeren of hard uitzetten. Met de OR functie kun je ze aanzetten.

Jouw functie zou dus eigenlijk zoiets moeten worden als :(eerste 3 bitjes op 101 zetten en laatste 5 ongemoeid)

waarde = waarde AND 0xb 000 11111 OR 0xb 101 00000 (waarbij 0xb = binair)

Sorry voor de brakke uitleg, maar hoop dat je er zo iets mee kan.

[ Voor 4% gewijzigd door TjardE op 24-06-2005 22:37 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:25

Tomatoman

Fulltime prutser

tjarde schreef op vrijdag 24 juni 2005 @ 22:34:
[...]

Sorry voor de brakke uitleg, maar hoop dat je er zo iets mee kan.
Valt volgens mij wel mee. :)

Dan nog even NOT: daarmee verander je de waarde van iedere bit. Voorbeeldje:

NOT 11101001 = 00010110

Een goede grap mag vrienden kosten.


  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Eerste 3 op nul forceren en de laatset 5 ongemoeid is:
x&=1F

Verwijderd

Verwijderd schreef op vrijdag 24 juni 2005 @ 21:23:
heb dus bv 101 01101 en ik wil dus de laatste 5 hoog maken dus 248 er bij. het resulataat moet dus 10111111 worden.
als ik dus zou doen PORTC|=248;
heb dus
10101101
00011111
----------------
10111111
Je zegt hier dat 248 00011111 is, maar binair werkt niet zoals decimaal. Dit lees je van rechts naar links toe. De waarde 248 is in binair 11111000. Misschien dat hier jouw probleem zit. Je verwacht andere uitkomsten en daarom denk je dat ze fout zijn.

Verwijderd

Verwijderd schreef op zaterdag 25 juni 2005 @ 08:50:
[...]


Je zegt hier dat 248 00011111 is, maar binair werkt niet zoals decimaal. Dit lees je van rechts naar links toe. De waarde 248 is in binair 11111000. Misschien dat hier jouw probleem zit. Je verwacht andere uitkomsten en daarom denk je dat ze fout zijn.
Volgens mij haal jij nu links en rechts door elkaar...

Verwijderd

Verwijderd schreef op zaterdag 25 juni 2005 @ 11:15:
[...]

Volgens mij haal jij nu links en rechts door elkaar...
Maar hij heeft wel gelijk, vooralsnog "lees" ik nooit binaire code maar moet ik het altijd wel gaan omrekenen enzo, 248 is 11111000

B11111000 = 2^7 + 2^6 + 2^5 + 2^4 + 2^3 = 128 + 64 + 32 + 16 + 8 = D248

Tja en of je van links naar rechts leest? dezelfde principes gelden voor alle X-tallige stelsels, alleen moeten we omrekenen omdat we gewend zijn aan het 10-tallige stelsel

  • Master4Disaster
  • Registratie: Oktober 2002
  • Laatst online: 01-12-2025
tjarde schreef op vrijdag 24 juni 2005 @ 22:34:
...

Dat voorbeeld wat je gaf met dat optellen gaat niet helemaal op want als iets b.v. 100 is en je telt er 1 bij op dat wordt het 101. Als het b.v. 101 was en je telt er 1 bij op is het 110 (2 past niet echt in een binair stelsel. Dus dat houdt in dat je eerst iets moet doen met je beginsituatie voordat je er iets bij kunt optellen.

Dus de situatie was b.v. 101 11001 (waarom worden er spaties gezet tussen het 4e en het 5e bit?)

...
Allereerst is 0001 1111 in decimalen 31, het LSB wordt in schrijftaal altijd rechts neergezet.
Ten tweede is een combinatie van beide functies nogal onzinnig omdat er altijd 0001 1111 uitkomt.

Wat misschien handig is om te weten dat dit soort afzonderlijke bewerkingen wel vaker wordt gedaan door AND en OR te gebruiken met een bitmask. Bij een AND bitmask worden alle bits met een 0 in het mask gecleared en de rest ongemoeid gelaten. Bij een OR bitmask worden alle bits met een 1 in het mask geset en de rest ongemoeid gelaten.

Ook is nog XOR beschikbaar met een bitmask en zijn nog NOT en schuiffuncties (>>, <<) als bitwise operations beschikbaar in C of ASM.

[ Voor 8% gewijzigd door Master4Disaster op 25-06-2005 11:52 ]

If Linux doesn't have the solution, you have the wrong problem.


  • TjardE
  • Registratie: September 2002
  • Niet online
iemand wijzigde tjarde's bericht en zette er de (in bold) opmerkingen bij:
...

Dat voorbeeld wat je gaf met dat optellen gaat niet helemaal op want als iets b.v. 100 is en je telt er 1 bij op dat wordt het 101. Als het b.v. 101 was en je telt er 1 bij op is het 110 (2 past niet echt in een binair stelsel. Dus dat houdt in dat je eerst iets moet doen met je beginsituatie voordat je er iets bij kunt optellen.

Dus de situatie was b.v. 101 11001 (waarom worden er spaties gezet tussen het 4e en het 5e bit?)
Nee, 2 past niet in binair stelsel nee, maar daar ging het niet om het was decimaal bedoeld om aan te geven dat optellen niet zomaar opgaat.

En die spaties heb ik ertussen gezet om de scheiding aan te geven tussen de bits die wel en degene die niet moeten veranderen.

[ Voor 11% gewijzigd door TjardE op 28-06-2005 22:27 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:25

Tomatoman

Fulltime prutser

Er staan inmiddels 10 reacties en linux_freak heeft sinds zijn startpost niets meer van zich laten horen. Betekent dit dat het probleem is opgelost?

Een goede grap mag vrienden kosten.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Master4Disaster schreef op zaterdag 25 juni 2005 @ 11:49:
[...]
Allereerst is 0001 1111 in decimalen 31, het LSB wordt in schrijftaal altijd rechts neergezet.
Ten tweede is een combinatie van beide functies nogal onzinnig omdat er altijd 0001 1111 uitkomt.
In schrijftaal idd wel ja. Maar in de processor hoeft dat dus niet zo te zijn. Vandaar het Endian probleem tussen verschillend platformen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1