Gå til innhold

C: Porter og bitmanipulering


Anbefalte innlegg

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

Lenke til kommentar
Videoannonse
Annonse

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

Lenke til kommentar

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...