Val av microprocessor, RGB LED styrning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hej!
Det är möjligt att ni har mycket att göra och inte hunnit svara.

Men jag börjar bli lite fundersam, med tanke på att jag inte fått något svar sedan mitt senaste inlägg.
Har jag gjort helt fel och inte alls som Jesse tänkte? Eller var det helt rätt och ni blev helt förstummade? :?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Val av microprocessor, RGB LED styrning

Inlägg av sodjan »

Jag såg det men orkade inte läsa igenom och försöka förstå det.
Det är ju ditt projekt och ditt problem att motivera oss... :-)
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Japp. 8)

Någon som svarar i alla fall :)
Jag vet inte hur insatt du är i projektet och kodning (i C och annat). Men du får gärna komma med åsikter och idéer.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

Sodjan är proffs på programmering :)

Det behövs en hel del tänkande för att sätta sig in i det du skrev, och det kan hända att jag kollade igenom inlägget snabbt en kväll och tänkte att jag kunde svara senare... och så glömde jag av det. :vissla:
Har jag gjort helt fel och inte alls som Jesse tänkte? Eller var det helt rätt och ni blev helt förstummade?
Nja... alltså rätt eller fel... det kan ju inte vi säga egentligen. Du får ju prova bit för bit och se om det fungerar. Om jag ska testa allt först så blir ju jag tvungen att skriva ett program jag också, som jag dessutom inte har någon möjlighet att testa, eftersom jag inte har ditt kretskort.

Ta det du skrev senast, och använd det som grund när du utarbetar programmet.
Men gör bara en liten sak åt gången och testa i processorn så att du ser om det fungerar eller inte. Sedan bygger du på, bit för bit.

Det kan vara svårt, men man måste ändå försöka för att komma nån vart... jag trodde du hade använt tiden sen förra inlägget att göra färdig koden och väntade på resultatet :)
I anropet skickas ljusstyrka och tid, (eventuellt skickar man här också data för dimning, om man lyckas få till en automation för detta i funktionen. Då behövs om den ska upp/ner dimmas, tiden avgörs av hur länge den bilden ska visas.).
verkar OK. Börja med ljusstyrka och tid. Automatik för dimning kan man lägga till senare, så att man inte krånglar till det i onödan till en början.

Eller rättare sagt: Om jag hade gjort det här programmet hade jag till en början struntat i ljusstyrka också och koncentrerat mig på att mönstret ska visas riktigt med 100% ljusstyrka. När det funkar lägger jag till parametern ljusstyrka, kanske ett heltal mellan 0 och 100.
Den plockar ut åtta nummer för att avgöra vilka färger på respektive plats som ska tändas. (Här kommer troligen for-sats 2, och eventuellt for-sats 3.)
Det kan nog fungera, men fundera på vad jag skrivit om bithantering. Du kan skicka data med tre bytes för en rad: röd (åtta bitar), blå (åtta bitar) och grön (åtta bitar). Det blir i praktiken tre instruktioner:

Kod: Markera allt

RED = red[row];
GREEN = green[row];
BLUE=blue[row];
Nu kanske du inte skulle ha data lagrat i tre färg-arrayer, utan allt i en enda. Då kommer siffrorna antagligen efter varandra i en viss ordning, som du måste bestämma exakt i förväg. Exempel på data för ett 6 x 8 mönster:

Kod: Markera allt

uint8_t monster[] = { rad0_röd, rad0_grön, rad0_blå,      rad1_röd, rad1_grön, rad1_blå,     rad2_röd, rad2_grön, rad2_blå    .... osv...    till rad5_blå };
Istället för rad4_blå etc. så skriver du fem bitar, t.ex.

Kod: Markera allt

uint8_t monster[] = { 0b00110,0b00110,0b00000,     0b11001,0b00000,0b11000,    osv... };
For-satts nr 1 används för att stega igenom pixlarna radvis.
Jag antar att du inte tänker använda interrupt i den här versionen. Då blir det for-loopar. Men då är for-sats nr 1 inte den som går igenom rad för rad, utan den som anger hur länge mönstret ska visas (tid). Inuti denna kommer for-satsen som stegar fram rad för rad. Varje gång du börjar på rad noll måste du börja läsa arrayen från början igen. Enklast är nog att du före den for-satsen skapar en index-variabel , t.ex. uint8_t j = 0; som du sedan inkrementerar varje gång du läser ett tal:

Kod: Markera allt

RED = monster[j++];
GREEN = monster[j++];
BLUE=monster[j++];
om du istället vill arrangera arrayen med siffror för varje LED:s färg så får du vara smart och tänka bitvis även här.
istället för att rada upp färgerna i slumpvis ordning t.ex röd=1, grön=2, blå=3, gul = 4 vit = 5 osv. så finns det ett logiskt mönster:

Kod: Markera allt

svart = rgb 0,0,0 = 0b000 = 0
röd = rgb 1,0,0  = 0b100 = 4
grön = rgb 0,1,0 = 0b010 = 2
blå = rgb 0,0,1 = 0b001 = 1
gul = rgb 1,1,0 = 0B110 = 6
...osv... 
Om du förstår det här så vet du vilken siffra färgen "cyan" ska ha.
Bild

problemet med att göra så är ju att du inte tänder lysdioderna en och en. Du tänder alla röda samtidigt, sedan alla gröna och sedan alla blå. Då blir det besvärligt att plocka ut data från arrayen och arrangera dem rätt... du kan ju försöka, men det är krångligt! Därför är det mycket bättre om man kan arrangera datan färg för färg istället för diod för diod...
I huvud for-satsen borde man också kunna ha en if-sats eller liknande, som reagerar om dimnings-talet inte är noll. Denna stegar då upp eller ned hur mycket svart paus det ska vara emellan raderna.
Den bör nog också samtidigt stega hur länge färgen ska vara tänd.
Detta borde kunna fungera som dimning för hela skärmen samtidigt.
Det ska nog fungera bra.
Men jag är fortfarande tveksam till att du ska dimma varje enskild LED olika. För att det ska funka måste ditt program vara verkligt effektivt och skyffla data snabbt som sjutton. Koncentrera dig på ALLA led samtidigt. Och innan du dimmar alls - se till att rita mönstret.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Ok.
Det där ser fin fint ut.

Två funderingar.
Färgerna:
Man borde väll kunna skicka dem som siffror mellan 0 och 7 i en array, med uint8_t?
Och sedan kollar funktionen medhjälp av ett antal "if" och "else if" vilka färger som ska aktiveras på den pixeln och lägger in det i tre 8 bitar.
I dem stegas ettorna och nollorna med varje pixel ett steg. När de gått 8 steg skickas raden ut och nästa körs?

Angående dimmningen så var tanken att dimma hela skärmen.
Men det fungerar ju inte att justera lystiden, utan bara släckt tiden, på hela skärmen samtidigt. (Så man tänder alla rader efter varandra, och har sedan en kort paus och börjar om.)
Om man inte justerar lystiden på en rad i taget?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

>Färgerna:du kan nog göra så, jag tyckte det verkade besvärligt men det funkar säkert.

>Om man inte justerar lystiden på en rad i taget?

Jag hade nog valt all reglera lystiden för varje enskild rad. Då blir pauserna kortare och risken för "blinkeffekt" blir mindre. Men å andra sidan blir det då viktigare att koden är snabb, annars påverkas lys eller släck-tiden... men det borde funka vilket som.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hej.
Jag tänkte att jag skulle göra så att jag skapar en ny fil Ledmatis_6x8_v2 (i stället för v1) när jag ska bygga om programmet.
Men detta fungerar inte. Jag sparar filen, trycker "Build" det fungerar, men när jag trycker debug så drar den upp den gamla versionen (v1).
Vilket på något sätt gör att det inte skapas någon .hex fil för v2....

Vad tror ni?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

Jag har också haft strul med det. Går kanske att fixa på något sätt, men jag har gjort så här när jag vill spara gamla versioner: jag tar helt enkelt en kopia av hela mappen där projektet ligger, och lägger till datum och/eller versionsnummer på mappnamnet. Den går sedan att öppna som ett eget projekt och går att bygga vidare på om man vill. Jag lägger också alltid in versionsnummer i en kommentar i början på en av filerna.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Ok, ditt sätt verkar fungera.
Nu sitter jag och knåpar på det nya programmet, och jag tror det går fint.

Men jag lyckas inte definiera en array (för tal mellan 0-7) som finns i hela programmet...
Enligt error (får att få bort det) måste jag sätta uint8_t framför monster[] i main, där jag ska skriva in nya mönstersiffror...

Tanken är att man ska definiera monster[] i main, anropa refrech(){} funktionen som automatiskt använder monster[] då det finns tillgängligt för hela programmet.
Men jag lyckas inte helt...
Vad tror ni kan vara felet?

monster[] är satt som: uint8_t monster[48] = {0, 0, 0, 0.......}; innan programmet startar (där andra globala variabler definieras).

Tillägg:
Kan man definiera en array så här: (i main)

Kod: Markera allt

monster[] = {0,1,2,3,4,5,6,7, 
		  0,1,2,3,4,5,6,7, 
		  0,1,2,3,4,5,6,7, 
		  0,1,2,3,4,5,6,7, 
		  0,1,2,3,4,5,6,7, 
		  0,1,2,3,4,5,6,7};
eller måste man skriva något mer för att kunna ha dem på olika rader?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

1) DU KAN BARA DEFINIERA VÄRDENA i en array en gång. Det är själva "initieringen".
2) Din array ska vara en global variabel - den deklareras utanför main - dvs. före int main() {

Men dina mönsterdata är värden som aldrig ska ändras på! Därför är det inte bra att deklarera dem som vanliga variabler, för då fyller de på RAM-minnet som är väldigt begränsat på en AVR. Eftersom de dessutom deklareras med konstanter i början av programmet kommer de dessutom att fylla upp flashminnet (=programminnet) med samma data.

Därför ska du deklarera arrayerna i FLASHMINNET istället för i SRAM. Jag har beskrivit exakt hur du gör i inlägg tidigare.

Eftersom du då måste ha en array för varje mönster så är det smartast att arrayerna är i två dimensioner: den ena visar vilket mönster du valt, den andra pekar ut databytes med färginformationen i mönstret:

Kod: Markera allt

uint8_t PROGMEM monster[3][20] = { // 3 = antal mönster, 20 = antal databytes i varje mönster
 // mönster noll
   {   0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7}
 // mönster ett
   {   0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7}
 // mönster två
   {   0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7,
        0,1,2,3,4,5,6,7}
// slut på mönster
}
När du läser data från denna array använder du alltså

Kod: Markera allt

colour = pgm_read_byte(monster[nummer,i]);
- här är då "nummer" numret på det mönster som ska visas, och "i" är loopvariabeln som går igenom data.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Det blir säker mycket bra att sätta dem i progmem.
Men jag tänkte att i teststadiet så kan man ju definera innan anropet.

Men detta error blir:
excepted exspression before '{' token

så här ser koden ut där felet "placeras":

Kod: Markera allt

while(1) { // ...loopa för evigt...
				monster[0] = {0,1,2,3,4,5,6,7, 
							 0,1,2,3,4,5,6,7, 
							 0,1,2,3,4,5,6,7, 
							 0,1,2,3,4,5,6,7, 
							 0,1,2,3,4,5,6,7, 
							 0,1,2,3,4,5,6,7};
				refrech();// red, green, blue
				
	}
(I main)

utanför main och funktionerna står tidigare:

Kod: Markera allt

uint8_t monster[48] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
När jag lägger till #define monster på raden innan blir det 9 fel i stället för 1.
Antingen så måste jag ha #define och på något sätt lösa de andra problemen. För att det första blockerar de andra.
Eller så är det bara att lösa det första och inte ha #define.

Det här blev kanske lite krongligt. men vi får se om ni förstår.

Vad kan jag göra åt problemet?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

Felet vid while(1) { beror antagligen på ett annat fel längre upp (att du glömt semikolon nånstans t.ex.)
#define monster kan du inte skriva om du sedan ska använda ordet som namnet på en array. Vad tänkte du göra när du skrev #define monster? "#define" deklarerar ett macro och har inget med arrayer att göra.

Du behöver inte fylla på med nollor i början. Alla globala variabler får automatisk nollor som startvärde om du inte skriver i något annat där. Det räcker med uint8_t monster[48];

Programmeringsspråket C fungerar inte så att man kan tilldela alla värden samtidigt i en array, förutom just vid deklarationen (en enda gång). Kan tyckas klumpigt, men så är det.

Enda sättet jag kommer på är i så fall att du tilldelar varje enskild variabel för sig:

Kod: Markera allt

uint8_t monster[48];
int main() {
...

monster[0] = 7;
monster[1] = 4;
monster[2] = 3;
....osv...
Nu finns det ju faktiskt en fördel att använda en array i SRAM kom jag på - och det är om du t.ex. ska generera automatiska mönster matematiskt - då behöver du ramminne att lägga resultatet i.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Nu har jag skrivit ett program, som dock inte fungerar helt...
Jag har klurat fram och tillbaka och testat allt möjligt.
Men när jag väl får alla rader att lysa är det bara 5/8 kolumner som lyser.

Skriver koden, så får vi se om ni förstår något. Om ni hittar fel eller tycker jag gjort helknäppt.

Kod: Markera allt



//---------------- standardbibliotek ------------------
   // #define F_CPU 8000000   för att använda intern 8 MHz osilator
   #include <avr/io.h>
   #include <util/delay.h>
   #include <util/delay_basic.h>

   #define CLOCK (1<<PB1)

   #define ROW PORTF
   #define RED PORTA
   #define GREEN PORTC
   #define BLUE PORTD
   
   uint8_t steg;
   uint8_t pixelnr;
   uint8_t tid = 1;
   uint8_t ROWNR;
   uint8_t monster[48];
   uint8_t red = 0b11100000;
   uint8_t green = 0b00011100;
   uint8_t blue = 0b00000011;

void refrech() {	// SKRIV ALGORITM HÄR

	for(uint8_t z = 0; z < tid; z++){		//Om man vill köra mönstret mer än 1 varv
		ROWNR = 0b00000001;					//Bestämmer vilken rad som ska skickas ut, stegas upp var 8:e pixel.
		pixelnr = 0;						//Bestämmer vilken mönsterpixel som ska plockas ut och användas
		steg = 0;							//Används för att ha koll på var 8 pixel, när red/green/blue är fulla ska de skickas ut.
		for(;pixelnr < 48; pixelnr++){		//När pixelnr går över 47 så tar det slut.   (pixelnr < 8*ROWNR+8 &&)
			if(monster[pixelnr] < 4){
				if(monster[pixelnr] < 2){
					if(monster[pixelnr] < 1){ //0 = Svart  
						red >> 1;
						green << 1;
						blue << 1;
					}
					else{				//1 = blå
						red >> 1;
						green << 1;
						blue << 1;
						blue | 0b00000001;
					}
				}
				else{
					if(monster[pixelnr] < 3){ //2 = grön  
						red >> 1;
						green << 1;
						blue << 1;
						green | 0b00000001;
					}
					else{				//3 = turkos
						red >> 1;
						green << 1;
						blue << 1;
						green | 0b00000001;
						blue | 0b00000001;
					}
				}
		

			}
			else{
				if(monster[pixelnr] < 6){ 
					if(monster[pixelnr] < 5){ //4 = röd
						red >> 1;
						green << 1;
						blue << 1;
						red | 0b10000000;
					}
					else{				//5 = lila
						red >> 1;
						green << 1;
						blue << 1;
						red | 0b10000000;
						blue | 0b00000001;
					}
				}
				else{					
					if(monster[pixelnr] < 7){ //6 = gul
						red >> 1;
						green << 1;
						blue << 1;
						red | 0b10000000;
						green | 0b00000001;
					}
					else{				//7 = vit
						red >> 1;
						green << 1;
						blue << 1;
						red | 0b10000000;
						green | 0b00000001;
						blue | 0b00000001;
					}
				}
			}
			if(pixelnr == 7+steg){ // Skickar var 8:e steg ut en rad
				//red = 	0b11111111;  - Används för vid vissa test, för att kunna sätta alla pixlar på en rad
				//green = 0b00000000;
				//blue = 	0b00000000;

				ROW = ROWNR;				//Tänder en rad
				RED = red;					//Tänder de röda som skas vara tända på raden
				GREEN = green;				//Tänder de gröna som skas vara tända på raden
				BLUE = blue;				//Tänder de blå som skas vara tända på raden
				steg = steg+8;				//Bestämmer vilken nästa pixel för radbyta är. Tillsammans med ovanstående if-sats.
				_delay_us(10);
			
				ROWNR << 1;					//Stegar till nästa rad, 
			}
		}	
	}
}

/**** huvudprogrammet ****/
int main(void) {

   // initiering av portar (se kapitel 12 i databladet - särskilt 12.2.1)
    DDRF = 0b00000000; // alla pinnar på port F ska vara utgångar	rad
	DDRA = 0b11111111; // alla pinnar på port A ska vara utgångar	röd
    DDRC = 0b11111111; // alla pinnar på port C ska vara utgångar	grön
	DDRD = 0b11111111; // alla pinnar på port D ska vara utgångar	blå

	PORTF = 0b11111111;		//aktiverar alla rader	

    while(1) { // ...loopa för evigt...
				monster[0]  = 2; monster[1]  = 1; monster[2]  = 2; monster[3]  = 3; monster[4]  = 4; monster[5]  = 5; monster[6]  = 6; monster[7]  = 7;
				monster[8]  = 2; monster[9]  = 1; monster[10] = 2; monster[11] = 3; monster[12] = 4; monster[13] = 5; monster[14] = 6; monster[15] = 7;
				monster[16] = 2; monster[17] = 1; monster[18] = 2; monster[19] = 3; monster[20] = 4; monster[21] = 5; monster[22] = 6; monster[23] = 7;
				monster[24] = 2; monster[25] = 1; monster[26] = 2; monster[27] = 3; monster[28] = 4; monster[29] = 5; monster[30] = 6; monster[31] = 7;
				monster[32] = 2; monster[33] = 1; monster[34] = 2; monster[35] = 3; monster[36] = 4; monster[37] = 5; monster[38] = 6; monster[39] = 7;
				monster[40] = 2; monster[41] = 1; monster[42] = 2; monster[43] = 3; monster[44] = 4; monster[45] = 5; monster[46] = 6; monster[47] = 7;
				//^Tillfälligt för teststadiet, för att kunna byta mönster - ska senare finnas i PROGMEM
				//0 = svart, blå = 1, 2 = grön, 3 = cyan, 4 = röd, 5 = magenta, 6 = gul, 7 = vit - enligt tidigare förslag om färglogik.
				refrech();				//Anropar refrech för att få nytt mönster
				_delay_ms(1000);
				
	}

}
Hoppas mina kommentarer är förståeliga, fråga gärna annars.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Val av microprocessor, RGB LED styrning

Inlägg av jesse »

vad gör de här raderna:

Kod: Markera allt

                  red >> 1;
                  green << 1;
                  blue << 1;
                  blue | 0b00000001;
Det är inte så att du får någon varning när de kompileras? ( klicka på "clear project" och kompilera igen, annars finns det risk att du inte ser alla varningar). Jag har aldrig sett den formen förut... vad har du tänkt att de ska göra?
(En annan sak: varför rullar röd åt motsatt håll än grön och blå , << istället för >> ? )

Det ska möjligen inte vara

Kod: Markera allt

                  red >>= 1;
                  green <<= 1;
                  blue <<= 1;
                  blue |= 0b00000001;
                  
Dessa gör du ju likadant varje varv - så de behöver ju inte vara inuti if-satserna åtta gånger. Det räcker med en gång före if-satserna.

If-satserna är lite oöverskådliga. Eftersom du ska ha fram en av åtta siffror (0-7) kan du anväda switch - case:

Kod: Markera allt

switch(monster[pixelnr]) {
    case 0: // svart
        kod...
        break;
    case 1: // röd
        kod...
        break;
    case 2: // grön
        kod...
        break;        
}
Men kollar man färglogiken i siffrorna så kan man göra smarta if-satser:

BLÅ motsvarar 1
grön motsvarar 2
röd motsvarar 4

Då kan du göra så här:

Kod: Markera allt

red <<= 1;
green <<= 1;
blue <<= 1;
if (monster[pixelnr] & 1) blue |= 1;
if (monster[pixelnr] & 2) green |= 1;
if (monster[pixelnr] & 4) red |= 1;
... så har du laddat färgerna för en LED och är redo för nästa varv.
(kan du se logiken i det sista exemplet här och att den gör exakt samma sak som alla dina if-satser?)

EDIT: har ändrat och lagt till en massa!
Nu kanske det förvisso är så att dina if-satser är korrekta och fungerar, men jag orkar inte gå igenom alltihop och lusläsa om det är något fel nånstans i alla dem. Därför är en kompaktare kod att föredra. Och det blir också lättare för dig att se om det är fel nånstans.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hm.
Ja, lite kompaktare vore ju bra.

Angående att röd går åt andra hållet:
Det beror på att de röda, av någon anledning, sitter i fel ordning. (tvärt emot grön och blå).

red >> 1; //Flyttar tidigare pixlar på rödraden ett steg åt höger. Sker 8 ggr, ger 8 pixlar.
green << 1; //Flyttar tidigare pixlar på grönraden ett steg åt vänster. Sker 8 ggr, ger 8 pixlar.
blue << 1; //Flyttar tidigare pixlar på blåraden ett steg åt vänster. Sker 8 ggr, ger 8 pixlar.
blue | 0b00000001; //Tanken var att de två uint8_t skulle slås ihop, så att "|" är lika med eller och ger att den nya nollan blir en 1, för att tända den blå pixeln.

Ska man skriva "red <<= 1;" för att de åtta bitarna ska flyttas ett seg åt vänster? eller fungerar det med "red << 1;"?
Ska det på samma sätt vara "blue |= 0b00000001;" för att kolla eller mellan blue och 0b00000001?
Teoretiskt ex:
(blue =) 0b00011000 |
0b00000001
= 0b00011001
??

Angående det sista exemplet så blir det så här?:
Om monster[pixelnr] är lika med 1 så läggs blue ihop med 0b00000001. Så som tidiggare exempel visar?

Sedan är ju frågan vilket som blir den snabbaste varianten av switch case satsen och den sista?
Skriv svar