>Jag har inte hunnit testa det Jesse skrev sist om invertering, och jag förstod inte helt hur det skulle göras.
Det märker du när du testar

(observera tecknet för bitvis NOT som betyder att inverera alla bitar i en variabel:
~ )
Pyssla lite med koden, skriv om olika värden osv. för att se vad som händer. Det är det bästa sättet att lära sig. Om du inte förstår exakt vad som händer kommer du inte senare kunna göra ett program som styr alla dioder.
>Detta skulle kunna skickas via exempelvis: AKTIVERA_LED(r, 6, 15);
Detta kommer i ett senare skede när du fixat grundfunktionerna. Orsaken att det inte går att göra direkt på ett enkelt sätt är flera. (1) dels måste du ha en minnesmatris i SRAM som innehåller data för alla dioder, för att , när du ändrar data för
en diod, måste shifta ut data för alla andra dioder samtidigt. (2) Som det är nu så sätter du utgångarna statiskt, dvs. fasta nivåer.
Det gör att du bara kan tända samma lysdioder med samma färg i alla rader. För att kunna variera färg mellan raderna krävs att programmet i hög hastighet skickar ut data för varje rad om och om igen... Där är vi inte än på länge. För att förstå varför så gör följande tankeexperiment:
Överkurs:
antag att du aktiverar "röd" i kolumn 1 och "grön" i kolumn 2. Sedan aktiverar du rad 4 och rad 7. Vilka lysdioder kommer att lysa? dioderna anges som (rad:kolumn): diod(4:1) lyser rött, diod(4:2) lyser grönt. Samma mönster upprepas i alla andra aktiverade rader, så i rad 7 får du diod(7:1) = röd och diod(7:2) = grön.
Vad du till exempel kan göra när du fått mitt exempel att fungera som
shiftar ut tre färger i de tre första kolumnerna, så kan du utöka detta till att omfatta alla åtta kolumner. Antingen fortsätter du att upprepa koden åtta gånger , eller så skriver du en loop. Om en kod upprepas ofta är det dags att skriva en funktion. Därför kan följande funktion vara praktisk: (du känner igen kodsnutten från tidigare exempel, fast nu är
konstanten OUTPUT_RED utbytt mot
variabeln colour:
Kod: Markera allt
// funktion för att skicka ut en bit på shiftregister
void shifta_en_bit(char colour) {
PORTB = STROBE | colour; // sätt färg - "strobe" skall alltid vara på.
_delay_ms(1);
PINB = CLOCK; // toggla klockan
_delay_ms(1);
PINB = CLOCK;
}
då kan du lätt sätta färgen för fem kolumner eller fler:
Kod: Markera allt
shifta_en_bit(RED);
shifta_en_bit(GREEN);
shifta_en_bit(WHITE);
shifta_en_bit(YELLOW);
shifta_en_bit(BLACK);
PORTA = 0b11111111 // tänd alla rader!!!
(jag har bytt ut OUTPUT_RED mot enbart RED osv... dessutom har jag lagt till fler färger, t.ex. YELLOW - dessa extra färger definierar jag utifrån hur färger adderas:

(det jag kallade "violett" är egentligen magenta)
#define YELLOW RED & GREEN
#define WHITE RED & GREEN & BLUE
*** hur definieras BLACK ? ***
För att något ska synas måste minst en rad vara aktiverad. Jag skrev
PORTA = 0b11111111; Det är binär representation av raderna, och tänder alla rader. Att det är skrivet binärt spelar ingen som helst roll för processorn - du kunde lika gärna skrivit 255 (decimalt) eller 0xff (hexadecimalt) eller använt de fördefinierade rad-konstanterna:
PORTA = RAD1|RAD2|RAD3|RAD4|RAD5|RAD6|RAD7;. Resultatet blir exakt detsamma. Du skulle också kunna ändra rad automatiskt: Nedanstående kodsnutt byter rad automatiskt. Jag har dessutom definierat ett
macro,
sett_rad(radnr)för att koden ska bli mer lättläst.
Kod: Markera allt
// definierar en macro som tänder EN rad med lysdioder och samtidigt släcker alla andra rader.
// radnr ska vara ett tal mellan 0 och 7 som anger radens nummer
#define sett_rad(radnr) PORTA = (1 << radnr)
shifta_en_bit(BLUE);
while (1) {
for (char i = 0; i<8 ; i++) {
sett_rad(i);
_delay_ms(200);
}
}
Då rör det på sig !!!
(det blir mycket om C-programmering här - använd några timmar att sätta dig in i alla nya begrepp)
>Eller kanske AL(r, 6, 15); så det blir kort.
Undvik alla sådana förkortningar! Det blir bara svårt att tolka när man inte vet vad förkortningen står för. Det är mycket lättare att förstå vad funktionen gör om den heter aktivera_led(); än om den heter al();. Funktioner skrivs alltid med små bokstäver, ibland med en stor bokstav i mitten, t.ex aktiveraLed();