Sida 18 av 23

Re: Val av microprocessor, RGB LED styrning

Postat: 5 februari 2011, 20:44:57
av jesse
jag tror att det ska vara <<= istället för bara << och |= istället för bara |. Annars tycker kompilatorn att man utför en operation utan att lagra resultatet någonstans. man kan t.ex också skriva a+b; det betyder inte a=a+b;, utan a och b adderas och resultatet kastas. Kompilatorn brukar skriva en varning om man har en sådan sats, där det står "statement with no effect" eller liknande - dvs. satsen gör ingenting. Men jag blev lite osäker när jag såg det i din kod... har inte sett det förut i C-kod.

>Sedan är ju frågan vilket som blir den snabbaste varianten av switch case satsen och den sista?
Det kan nog vara ganska lika tror jag, men jag tror faktiskt att switch-satsen förlorar. Men det blir ju betydligt smidigare kod med det senare exemplet.

Har du provat debuggern i Avrstudio4? Du vet att du kan se bitarna på utgångarna i fönstret till höger.

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 09:04:56
av dragon9226
Aha. det kan ju vara därför det inte fungerar.

Debuggern har jag provat, men inte tyckt att jag har så mycket användning för.
Men kollar man mer på vilka portar som går på så kan det nog vara bra.

Tack för svaren :)

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 15:31:51
av jesse
Jag frågade också om du fick några varningar när du kompilerade. Det borde du ha fått, men jag fick inget svar om det. Jag testade idag i Avrstudio att skriva

Kod: Markera allt

			tim4 << 1;
och kompilatorn skrev vid kompileringen:
../main.c: In function '__vector_16':
../main.c:251: warning: value computed is not used
dvs. "det beräknade resultatet används ej".

Har man gjort allt riktigt ska det stå i rutan längst ner:
Build succeeded with 0 Warnings...

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 15:52:58
av dragon9226
Oj, sorry.
Som du sa så blev det varningar på dem alla.
Vilket jag inte trodde var något problem, men det låter ju bättre om det blir 0 varningar.

Ska testa dessa nya koder i morgon, då jag har lektion och lite tid att använda.
Måste tyvärr plugga lite Fysik B nu. Vilket i och för sig är intressant.

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 16:09:18
av sodjan
> Som du sa så blev det varningar på dem alla.
> Vilket jag inte trodde var något problem,

"Trodde" ??

Är det inte bättre att du överlåter till de som du ber
om hjälp av att bedöma det ?

Sen så beror det ju även mycket på vilka varningar man får.
Sådana som man förstår, vet vad de betyder, vet varför man
får den och att de är förväntade så OK, då vet man vad man gör.
Annars gör man normalt bäst i att kolla upp det ordentligt...

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 17:38:31
av dragon9226
Sorry, min varning var inte riktigt samma. Den var "statement with no effect" vilket man borde reagera på...

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 18:05:40
av sodjan
Ja, om avsikten med att skriva den från första början
var att den också skulle ha någon "effekt", så visst... :-) :-)

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 20:54:09
av jesse
Litet tips inför i morgon:

Har du funderat på hur lång tid varje rad visas innan nästa?
Och om alla rader visas lika lång tid? Vad händer med sista raden till exempel? Släcks den någonsin?

Re: Val av microprocessor, RGB LED styrning

Postat: 6 februari 2011, 21:20:10
av dragon9226
Smart där.
Borde ha någon för av släckning. Respektive fördröjning mellan radbytena så det visas lika länge.
Tackar :)

Re: Val av microprocessor, RGB LED styrning

Postat: 7 februari 2011, 10:38:28
av dragon9226
Sitter och knåpar lite. Och skriver som i det sista exemplet du gav.
När man har flera färger som ska sättas, ex: lila = röd+blå, ska man ha kommatecken mellan tilldelningarna i if-satsen?

Kod: Markera allt

			if (monster[pixelnr] & 5) red |= 0b00000001 , blue |= 0b00000001;	//Lila
}
Enligt att jag inte får något error eller någon varning så borde det funger (kan inte testa på lampan just nu) men är det korrekt att göra så?

Re: Val av microprocessor, RGB LED styrning

Postat: 7 februari 2011, 11:03:51
av dragon9226
Försökte också lägga in en progmem "storage". Som ni tidigare skrivit om.
Ska den ligga i main eller utanför som refrech();?

Skrev så här:

Kod: Markera allt

uint8_t PROGMEM monster[3,48] = {
          { 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 } ,                // mönster nr 0
          { 4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7 } ,                // mönster nr 1
          { 1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8 }                  // mönster nr 2 
     };
Men får error: "expected ']' before ',' token

(Har även lagt till "#include <avr/pgmspace.h>")

Re: Val av microprocessor, RGB LED styrning

Postat: 7 februari 2011, 12:29:18
av jesse
Hej igen.

if-satsen: du behöver aldrig skriva if-satser för färgnummer 3,5,6 och 7! Rätt färger sätts enbart med röd,grön och blå, dvs 1,2 och 4. Så du behöver aldrig skriva if (monster[pixelnr] & 5)... Endast de tre raderna räcker:

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;
Tänk dig nu att monster[nr]=5, dvs du vill ha lila färg. Vad händer i de tre if-satserna? Här är det binär logik som gäller på bitnivå. Så vi omvandlar siffrorna till binära tal för att se hur de ser ut:

5 = 0b101 = lila
1 = 0b001 = röd
2 = 0b010 = grön
4 = 0b100 = blå

i if-satsen har vi "bitvis och"-operanden. Om monster[nr] = 5 (dvs 0b101) så blir resultatet i de tre if-satserna:
if (monster[pixelnr] & 1) blir sant eftersom 0b101 & 0b001 = 0b001 ... blå sätts till etta
if (monster[pixelnr] & 2) blir falskt eftersom 0b101 & 0b010 = 0b000 ...
if (monster[pixelnr] & 4) blir sant, eftersom 0b101 & 0b100 = 0b100 ... röd sätts till etta
och resultatet blir lila ( = röd och blå)!

Annars, om du skulle behöva skriva mer än en sats i en if-sats, så måste de vara inom klammrar {} och stå på var sin rad:

Kod: Markera allt

    if (monster[pixelnr] & 5) { //Lila
        red |= 0b00000001;
        blue |= 0b00000001;
    }   
uint8_t PROGMEM monster[3,48] = { ... skall vara uint8_t PROGMEM monster[3][48] = {
Ha gärna en bok om C-programmering framför dig när du jobbar så har de exempel på sådana här enkla saker.

#include skall stå överst i programmet och PROGMEM ska stå före main().

Re: Val av microprocessor, RGB LED styrning

Postat: 7 februari 2011, 17:21:26
av dragon9226
Nu har jag knåpat ihop ett fungerande program.
Och försökte lägga till användning av PROGMEM.
Men detta resulterar bara i att alla pixlar blir röda, utom en, vilket jag inte har sagt med siffrorna... (Inga errors eller varnings).

Kod: Markera allt

void refrech() {	// SKRIV ALGORITM HÄR
	
	for(int varv = 0; varv < 10000; varv++){
	pixelnr = 0;
	ROWNR = 0b00000001;	
		for(int y = 0; y < 6; y++){	//x och y är pixelkoordinater (x 0-7) (y 0-6) 
			for(int x = 0; x < 8; x++){
				red >>= 1;
				green <<= 1;
				blue <<= 1;
				colour = pgm_read_byte(monster [monsterval][(x+y*x)]);
				if (colour & 1) blue |= 0b00000001;	//Blå
				if (colour & 2) green |= 0b00000001;	//Grön
				if (colour & 4) red |= 0b10000000;	//röd
				pixelnr++;
			}
			ROW = ROWNR;
			RED = red;
			GREEN = green;
			BLUE = blue;
			ROWNR  <<= 1;
			_delay_ms(1);
		}
	}
}

uint8_t PROGMEM monster[3][48] = {
          { 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 } ,                // mönster nr 0
          { 1,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7,4,7,8,3,2,9,8,7 } ,                // mönster nr 1
          { 1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8,1,2,7,4,5,6,3,8 }                  // mönster nr 2 
     };
Den enda skillnaden som blir om jag byter ut "x+y*x" i anropet är att alla pixlar i stället blir röda. Även om jag ändrar så det inte finns någon röd pixel i det valda mönstret. Mönstret väljs genom att sätta variabeln monsterval till en siffra. Denna ska kunna kommas åt av hela programmet. '

Kod: Markera allt

            monsterval = 0;
				refrech();				//Anropar refrech för att få nytt mönster
				_delay_ms(1000);
Vad kan vara felet?

Re: Val av microprocessor, RGB LED styrning

Postat: 8 februari 2011, 13:29:17
av jesse
hmmm, byter ut x+y*x mot vad?
ska det inte vara x+y*8 ?

Kod: Markera allt

            colour = pgm_read_byte(monster [monsterval][(x+y*x)]);
Jag tror att du ska skicka en pekare till variabeln , det gör du genom att skriva & före variabelnamnet:

Kod: Markera allt

            colour = pgm_read_byte(&monster [monsterval][(x+y*8)]);

Re: Val av microprocessor, RGB LED styrning

Postat: 8 februari 2011, 14:12:43
av dragon9226
Klart det ska vara en 8, vilken tabbe....
Jaha, ska det vara ett & tecken, det sak jag testa.
Tackar!