Gå til innhold

C: Porter og bitmanipulering


Anbefalte innlegg

Skrevet

Heisann.

 

Har noen oppgaver i C hvor man skal få lamper til å lyse blant annet utifra hvilke brytere som er inne. Jobber med en ATMega128, 8bit.

 

"Deklarer og initialiser variablene ”teller” og ”tellerkopi” til null og gå deretter i evig løkke. I løkka skal du øke verdien av ”teller” med 1, manipulere ”teller”, vise resul¬tatet på lampene."

 

Oppgave 1:

 

Les teller og vis bitene på lamper, bortsett fra L0 som alltid skal være slukket.

NB! Du skal ikke manipulere selve variablen teller, bare det som vises på lampene(tellerkopi).

 

Koden ser slik ut:

 

#include <avr/io.h>x
#include <util/delay.h>


int main(void)
{
DDRA = 0x00;
DDRB = 0xff;
char teller = 0;
char tellerkopi = 0;

while(1)
{
 teller ++;
 tellerkopi = teller;
 tellerkopi=tellerkopi|0x01;
 PORTB = tellerkopi;
}
}

 

Jeg har tegnet opp et eksempel på hvordan dette da vil se ut:

 

VHCWZKz.jpg

 

Såvidt jeg kan se blir dette riktig. Alle verdiene er like som utgangspunktet, bortsett fra L0 som er 1 (slukket).

 

Så er det neste oppgave, som gjør at jeg blir ganske mindfucked.

 

Les teller og kopier bit 1-4 ut på LEDs L3-L6. Alle andre LEDs skal være slukket uansett verdien på de øvrige bitene.

 

Her ser koden ser slik ut:

 

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA = 0x00;
DDRB = 0xff;
char teller = 0;
char tellerkopi = 0;

while(1)
{
 teller ++;
 tellerkopi = teller;
 tellerkopi<<2;
 tellerkopi=~tellerkopi;
 tellerkopi=tellerkopi|0x87;
 PORTB = tellerkopi;
}
}

 

Her forstår jeg ikke hvorfor man i det hele tatt skal invertere. Hvis jeg tar samme eks som i sted:

 

zEGHGSY.jpg

 

Da har jeg endt opp slik at L3-L6 viser det motsatte av det bit 1-4 gjorde i utgangspunktet. Hvorfor er dette riktig? Oppgaven ber jo om at bit 1-4 skal vise samme verdi, men på L3-L6 i stedet. Dette er jo ikke tilfelle? Hvorfor kunne jeg ikke bare ha gjort det slik:

 

- Flytter alt to mot venstre

- Manipulerer med 10000111

 

Og voila. Da vil jeg jo være i mål? L3-L6 viser det som opprinnelig var på bit 1-4, mens resten er slukket. Ser bare ikke hvorfor man skal invertere osv, og ende opp med verdier som er motsatt av utgangspunktet.

 

 

Hvis noen skjønner hva jeg prøver å si her og kan forklare meg hvorfor det er slik, blir jeg veldig takknemlig. :)

Videoannonse
Annonse
Skrevet

Hvis "1" er slukket, bør du ikke invertere i første oppgave også? Slik at resultatet blir 10100011 for eksempelet ditt?

Skrevet

Svaret er enkelt at utgangen er invertert. Med din skisserte løsning på slutten viser L3-L6 motsatt av innholdet til bit 1-4.

Skrevet

Nei, det er avhengig av hva som er på output. Feks så har leds på stk500 interverte leds. Oppgave 1 er også feil, i ditt eksempel vil L7, L5 og L1 lyse, når meningen med oppgaven var å få L2, L3, L4 og L6 til å lyse når tellerkopi har verdien 0x5C (ditt eksempel).

Skrevet

Meningen med oppgaven er vel at L0 alltid skal være slukket, mens L1-L6 skal være uendret? Ser ikke hvordan det er feil.

 

Er oppgave 2 riktig da?

Skrevet

Ja l0 skal være slukket, men du skal vise verdien til teller, ikke la de være uendret. dvs du må invertere teller før du OR 0x01 og skriver ut på porten.

 

oppg2 er riktig

 

 

  • Liker 1

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...