Val av microprocessor, RGB LED styrning
Re: Val av microprocessor, RGB LED styrning
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.
>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.
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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
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
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
och kompilatorn skrev vid kompileringen:
Har man gjort allt riktigt ska det stå i rutan längst ner:
Kod: Markera allt
tim4 << 1;
dvs. "det beräknade resultatet används ej".../main.c: In function '__vector_16':
../main.c:251: warning: value computed is not used
Har man gjort allt riktigt ska det stå i rutan längst ner:
Build succeeded with 0 Warnings...
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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.
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
> 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...
> 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...
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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
Ja, om avsikten med att skriva den från första början
var att den också skulle ha någon "effekt", så visst...

var att den också skulle ha någon "effekt", så visst...


Re: Val av microprocessor, RGB LED styrning
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?
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?
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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
Borde ha någon för av släckning. Respektive fördröjning mellan radbytena så det visas lika länge.
Tackar

-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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?
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å?
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
}
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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:
Men får error: "expected ']' before ',' token
(Har även lagt till "#include <avr/pgmspace.h>")
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
};
(Har även lagt till "#include <avr/pgmspace.h>")
Re: Val av microprocessor, RGB LED styrning
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:
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:
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().
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;
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;
}
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().
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
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).
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. '
Vad kan vara felet?
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
};
Kod: Markera allt
monsterval = 0;
refrech(); //Anropar refrech för att få nytt mönster
_delay_ms(1000);
Re: Val av microprocessor, RGB LED styrning
hmmm, byter ut x+y*x mot vad?
ska det inte vara x+y*8 ?
Jag tror att du ska skicka en pekare till variabeln , det gör du genom att skriva & före variabelnamnet:
ska det inte vara x+y*8 ?
Kod: Markera allt
colour = pgm_read_byte(monster [monsterval][(x+y*x)]);
Kod: Markera allt
colour = pgm_read_byte(&monster [monsterval][(x+y*8)]);
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Klart det ska vara en 8, vilken tabbe....
Jaha, ska det vara ett & tecken, det sak jag testa.
Tackar!
Jaha, ska det vara ett & tecken, det sak jag testa.
Tackar!