Val av microprocessor, RGB LED styrning
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Ok, här kommer bilder från kortet jag lånat:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Val av microprocessor, RGB LED styrning
Det där kortet måste du kunna sätta dig in i och förstå. Det är enkelt. Och du måste lära dig att förstå ett enkelt shiftregsiter. Att lära sig hur ett shiftregister fungerar är en bra start om du också ska lära dig processorn. Det hör till den grundläggande kunskapen om man ska förstå digitalteknik.
Nackdelen med swech kort är att det inte finns en enda lysdiod som är direktkopplad till någon processorpinne. För att få något att fungera på det kortet måste man shifta ut bitar seriellt från processorn - något som kan vara lite krångligt att få till i början om man inte prorammerat en processor förr. Men du får fråga Swech om varför output-enable pinnarna på shiftregistren är oanslutna? Det ska de inte vara!
Du behöver studera mer grundläggande saker först, och lägga åt sidan de detaljerade frågorna om dimning osv. till en början. Har du installerat WINAVR och AVRStudio4? Kan du ansluta programmeraren och få kontakt med programmet? (läsa av processorns ID t.ex)? Lånat en bok om C-programmering och skrivit några rader.... (om du inte vill prova assembler först).
Exempel på en programsnutt som kanske kan vara till hjälp:(koden är ej genomgången och testad)
)
När du lärt dig att tända och släcka en lysdiod genom att programmera processorn , kan du gå vidare och försöka tända och släcka en rad , ändra färg osv... blinka i olika hastigheter...
Processorn heter Attiny461.
* Läs Per Foyer's bok "Mikrokontrollers" och kolla samtidigt i databladet för Attiny461.
Kanske AVR-programmering för nybörjare kan hjälpa, eller försök hitta andra liknande guider på nätet.
Och så läs lite om shiftregister (kan vara bra att förstå även om du inte ska använda sådana själv sedan): här är lite kunskapatt ta in om shiftregister. Och givetvis databladet för 4094.
Det gäller att plugga lite nu. När du väl lärt dig symbolerna i ritningen och hur kretsarna fungerar är det inte så svårt.
Nackdelen med swech kort är att det inte finns en enda lysdiod som är direktkopplad till någon processorpinne. För att få något att fungera på det kortet måste man shifta ut bitar seriellt från processorn - något som kan vara lite krångligt att få till i början om man inte prorammerat en processor förr. Men du får fråga Swech om varför output-enable pinnarna på shiftregistren är oanslutna? Det ska de inte vara!
Du behöver studera mer grundläggande saker först, och lägga åt sidan de detaljerade frågorna om dimning osv. till en början. Har du installerat WINAVR och AVRStudio4? Kan du ansluta programmeraren och få kontakt med programmet? (läsa av processorns ID t.ex)? Lånat en bok om C-programmering och skrivit några rader.... (om du inte vill prova assembler först).
Exempel på en programsnutt som kanske kan vara till hjälp:
Kod: Markera allt
//---------------- standardbibliotek ------------------
#include <avr/io.h>
#include <util/delay.h>
#include <util/delay_basic.h>
/* definiera pinnar på processorn .
* (1<< BIT) tilldelar VÄRDET av en bit.
* T.ex BIT=5 ger värdet 32. */
// färger
#define OUTPUT_BLUE (1<<PB3)
#define OUTPUT_GREEN (1<<PB4)
#define OUTPUT_RED (1<<PB5)
// shiftregister - styr lysdiodernas färger i kolumner
#define CLOCK (1<<PB2) // shiftregister klocka (SCK)
#define STROBE (1<<PB6) // shiftregister strobe (STR)
// lysdioder - rader
#define RAD0 (1<<PA0) // motsvarar pinne PA0 - dvs LED0 i schemat.
#define RAD1 (1<<PA1)
#define RAD2 (1<<PA2)
#define RAD3 (1<<PA3)
#define RAD4 (1<<PA4)
#define RAD5 (1<<PA5)
#define RAD6 (1<<PA6)
#define RAD7 (1<<PA7) // motsvarar pinne PA7 - dvs LED7 i schemat.
// funktion som skickar ut data till shiftregistren
// red,blue,green innehåller var och en 8 bitar data.
// varje bit tänder en LED i den kolumnen
void skicka_data(char red, char blue, char green) {
// SKRIV ALGORITM HÄR
}
/**** huvudprogrammet ****/
int main(void) {
// initiering av portar (se kapitel 12 i databladet - särskilt 12.2.1)
DDRA = 0b11111111; // alla pinnar på port A ska vara utgångar
DDRB = 0b11111111; // alla pinnar på port B ska vara utgångar
// skicka ut en bit på shiftregister
PORTB = STROBE | OUTPUT_RED; // sätt röd färg
_delay_ms(1);
PINB = CLOCK; // toggla klockan
_delay_ms(1);
PINB = CLOCK;
while(1) { // ...loopa för evigt...
// tänd och släck olika diodrader med fördröjning emellan...
PORTA = RAD5; // tänd rad 5
_delay_ms(300);
PORTA = RAD6; // tänd rad 6
_delay_ms(300);
PORTA = RAD7; // tänd rad 7
_delay_ms(300);
PORTA = RAD1|RAD2|RAD3;
_delay_ms(500);
}
}
)
När du lärt dig att tända och släcka en lysdiod genom att programmera processorn , kan du gå vidare och försöka tända och släcka en rad , ändra färg osv... blinka i olika hastigheter...
Processorn heter Attiny461.
* Läs Per Foyer's bok "Mikrokontrollers" och kolla samtidigt i databladet för Attiny461.
Kanske AVR-programmering för nybörjare kan hjälpa, eller försök hitta andra liknande guider på nätet.
Och så läs lite om shiftregister (kan vara bra att förstå även om du inte ska använda sådana själv sedan): här är lite kunskapatt ta in om shiftregister. Och givetvis databladet för 4094.
Det gäller att plugga lite nu. När du väl lärt dig symbolerna i ritningen och hur kretsarna fungerar är det inte så svårt.
Senast redigerad av jesse 27 september 2010, 15:52:24, redigerad totalt 1 gång.
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Ok, det där lät intressant. Jag har näst intill bestämt mig för att använda shiftregister, då det verkar smidigt, och inte allt för svårt.
Jag hittade en bra hemsida, (dock för arduino) som snackar om shiftregister:
http://www.arduino.cc/en/Tutorial/ShiftIn
Svar på frågor:
Jag har inte installerat programmen, men planerar att göra det snart, nu när jag vet vad de heter.
Jag har lånat en bok i C programmering, vilket verkar vara ganska likt Java. Och beställt en bok i mikroprocessortekning på biblioteket.
Om jag tolkar dig rätt är 4094 ett shiftregister.
Så nu sätter jag igång och börjar plugga.
Jag hittade en bra hemsida, (dock för arduino) som snackar om shiftregister:
http://www.arduino.cc/en/Tutorial/ShiftIn
Svar på frågor:
Jag har inte installerat programmen, men planerar att göra det snart, nu när jag vet vad de heter.
Jag har lånat en bok i C programmering, vilket verkar vara ganska likt Java. Och beställt en bok i mikroprocessortekning på biblioteket.
Om jag tolkar dig rätt är 4094 ett shiftregister.
Så nu sätter jag igång och börjar plugga.
Re: Val av microprocessor, RGB LED styrning
>Om jag tolkar dig rätt är 4094 ett shiftregister.
Precis. Det kanske var lite oklart. Men Om du kollar ditt schema (del2) så står det 4094 finstilt under varje "fyrkant" som ska föreställa ett shiftregister.
WINAVR finns att ladda ner här.
Det innehåller allt man behöver för programmering, men jag har alltid använt AVRStudio 4 eftersom det var det programmet jag använde först (och som fungerar ihop med alla AVR-programmerare). AVRStudio 4.18 kan man ladda ner på Atmel's hemsida. Om du installerar AVRStudio bör du också installera uppdateringarna, AVRStudio SP1 och SP2.
Precis. Det kanske var lite oklart. Men Om du kollar ditt schema (del2) så står det 4094 finstilt under varje "fyrkant" som ska föreställa ett shiftregister.
WINAVR finns att ladda ner här.
Det innehåller allt man behöver för programmering, men jag har alltid använt AVRStudio 4 eftersom det var det programmet jag använde först (och som fungerar ihop med alla AVR-programmerare). AVRStudio 4.18 kan man ladda ner på Atmel's hemsida. Om du installerar AVRStudio bör du också installera uppdateringarna, AVRStudio SP1 och SP2.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Val av microprocessor, RGB LED styrning
De är inte oanslutna på kortet, patchat
Schemat är inte
uppdaterat med patchen, tack för påminnelsen jesse
Swech

uppdaterat med patchen, tack för påminnelsen jesse
Swech
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Den där koden ser ju fin ut =)
Jag förstår faktiskt en del =)
1. Vad för algoritm ska skrivas i "skicka_data"? Vad ska man ha skicka_data till?
För som jag förstod det så tänder och släcker man led:sen i while satsen i main.
2. Och om jag fattade rätt så tände du hela rader och inte enskilda leds?
3. Och när PORTA byter till att vara lika med en annan rad, så slutar den förra lysa?
4. Detta kommando "PORTA = RAD1|RAD2|RAD3;" för att tända 3 rader samtidigt, och detta "PORTA = RAD7;" för att tända en rad?
5. Hur gör man för att tända en specifik led i en kolumn/ rad? (för om jag förstod rätt, så tändes hela rader.)
6. Blir det en kombination typ så här?:
PORTB = OUTPUT_BLUE;
PORTA = RAD7;
Tack så otroligt mycket Jesse
Jag förstår faktiskt en del =)
1. Vad för algoritm ska skrivas i "skicka_data"? Vad ska man ha skicka_data till?
För som jag förstod det så tänder och släcker man led:sen i while satsen i main.
2. Och om jag fattade rätt så tände du hela rader och inte enskilda leds?
3. Och när PORTA byter till att vara lika med en annan rad, så slutar den förra lysa?
4. Detta kommando "PORTA = RAD1|RAD2|RAD3;" för att tända 3 rader samtidigt, och detta "PORTA = RAD7;" för att tända en rad?
5. Hur gör man för att tända en specifik led i en kolumn/ rad? (för om jag förstod rätt, så tändes hela rader.)
6. Blir det en kombination typ så här?:
PORTB = OUTPUT_BLUE;
PORTA = RAD7;
Tack så otroligt mycket Jesse
Re: Val av microprocessor, RGB LED styrning
>För som jag förstod det så tänder och släcker man led:sen i while satsen i main.
>2. Och om jag fattade rätt så tände du hela rader och inte enskilda leds?
3. Och när PORTA byter till att vara lika med en annan rad, så slutar den förra lysa?
4. Detta kommando "PORTA = RAD1|RAD2|RAD3;" för att tända 3 rader samtidigt, och detta "PORTA = RAD7;" för att tända en rad?
precis.
Men vad jag gör är att jag enbart skickar ut en bit på shiftregistret, mde den här koden:
Vad jag inte förklarat är vilka eller hur många lysdioder som kommer att lysa i de rader som tänds. Åtminstone en lysdiod (den första) i varje rad kommer att lysa när man aktiverar raderna senare. Om dom andra lyser eller inte kan man inte veta, eftersom ingen data skickats ut till dessa. Exakt varför det blir så kan ju vara något att fundera på (en nöt att knäcka). Det krävs alltså mer programmering för att få alla eller vissa utvalda lysdioder att lysa i de rader som väljs.
>Hur gör man för att tända en specifik led i en kolumn/ rad? (för om jag förstod rätt, så tändes hela rader.)
För att göra det måste man skicka ut specifik data till shiftregistren. Det var det jag tänkte man skulle göra i funktionen "skicka data". Bara det att jag inte orkade skriva den. Eftersom funktionen aldrig anropas från main så fyller den ingen funktion som det är nu. (Och även om den anropats nånstans hade inget utförts pga att kod saknas)
>2. Och om jag fattade rätt så tände du hela rader och inte enskilda leds?
3. Och när PORTA byter till att vara lika med en annan rad, så slutar den förra lysa?
4. Detta kommando "PORTA = RAD1|RAD2|RAD3;" för att tända 3 rader samtidigt, och detta "PORTA = RAD7;" för att tända en rad?
precis.
Men vad jag gör är att jag enbart skickar ut en bit på shiftregistret, mde den här koden:
Kod: Markera allt
// skicka ut en bit på shiftregister
PORTB = STROBE | OUTPUT_RED; // sätt röd färg
_delay_ms(1);
PINB = CLOCK; // toggla klockan
_delay_ms(1);
PINB = CLOCK;
>Hur gör man för att tända en specifik led i en kolumn/ rad? (för om jag förstod rätt, så tändes hela rader.)
För att göra det måste man skicka ut specifik data till shiftregistren. Det var det jag tänkte man skulle göra i funktionen "skicka data". Bara det att jag inte orkade skriva den. Eftersom funktionen aldrig anropas från main så fyller den ingen funktion som det är nu. (Och även om den anropats nånstans hade inget utförts pga att kod saknas)
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Ok.
Tack så mycket än en gång far att du ger dig tid att hjälpa mig Jesse.
Något som vore underbart schysst vore om du skrev "klart" programmet, så att det fungerar, och att du anropar skicka_data (från main) och gör ett kort exempel där, (ex. som du gjorde i main), så att jag förstår hur man ska skriva och hur det fungerar. (Vilka "kommandon" jag ska användas.)
Detta skulle göra att jag sedan kan klura ut hur man gör med mönster mm.
Det borde inte krävas så mycket mer text va?
Tack på förhand =)
Tack så mycket än en gång far att du ger dig tid att hjälpa mig Jesse.
Något som vore underbart schysst vore om du skrev "klart" programmet, så att det fungerar, och att du anropar skicka_data (från main) och gör ett kort exempel där, (ex. som du gjorde i main), så att jag förstår hur man ska skriva och hur det fungerar. (Vilka "kommandon" jag ska användas.)
Detta skulle göra att jag sedan kan klura ut hur man gör med mönster mm.
Det borde inte krävas så mycket mer text va?
Tack på förhand =)
Re: Val av microprocessor, RGB LED styrning
>Något som vore underbart schysst vore om du skrev "klart" programmet.
Nej, det vill jag faktiskt inte. Dels tar det faktiskt en del tid, dels vill jag att du själv gör något också. Du kan ju grunderna i programmering från Java, så du får sätta dig och fundera och prova själv. Först får du ju testa den kodsnutt som finns för att se om den fungerar i verkligheten (jag kan inte lova det, eftersom jag inte själv kan testa den). Sen är det bara att bygga vidare på den (och läsa på om shiftregistren) , ändra i koden, se vad som händer osv... Det är en utvecklingsprocess som ingen annan kan göra åt dig. Jag tror att du kommer att lyckas om du anstränger dig lite.
Nej, det vill jag faktiskt inte. Dels tar det faktiskt en del tid, dels vill jag att du själv gör något också. Du kan ju grunderna i programmering från Java, så du får sätta dig och fundera och prova själv. Först får du ju testa den kodsnutt som finns för att se om den fungerar i verkligheten (jag kan inte lova det, eftersom jag inte själv kan testa den). Sen är det bara att bygga vidare på den (och läsa på om shiftregistren) , ändra i koden, se vad som händer osv... Det är en utvecklingsprocess som ingen annan kan göra åt dig. Jag tror att du kommer att lyckas om du anstränger dig lite.

-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Jag lyckades få ditt program att gå igenom med en liten justering
Och nu tänkte jag lägga in det i processorn.
Då kommer en ruta fram (se nedan):
Då tänkte jag att de skulle vara smidigt att köra Auto, (Då jag inte vet alla andra grejer man kan ställa in), då kommer man hit (se bilden)
och då undrar jag dels vilka boxar ska kryssas i?
och vilken fil ska jag ladda in? (Det som kommer upp när man trycker start)
Den andra frågan undrar jag då det inte finns någon fil med den filtypen, som skapats.
Det finns bara en .aps, en .aws och en .c. och den söker en .hex...
Så hur ska jag göra?
(Tillägg)
Jag letade runt lite till och hittade mer info om hur man ska göra för att programmera, men jag får fortfarande ingen .hex fil i projektmappen...
Och nu tänkte jag lägga in det i processorn.
Då kommer en ruta fram (se nedan):
Då tänkte jag att de skulle vara smidigt att köra Auto, (Då jag inte vet alla andra grejer man kan ställa in), då kommer man hit (se bilden)
och då undrar jag dels vilka boxar ska kryssas i?
och vilken fil ska jag ladda in? (Det som kommer upp när man trycker start)
Den andra frågan undrar jag då det inte finns någon fil med den filtypen, som skapats.
Det finns bara en .aps, en .aws och en .c. och den söker en .hex...
Så hur ska jag göra?
(Tillägg)
Jag letade runt lite till och hittade mer info om hur man ska göra för att programmera, men jag får fortfarande ingen .hex fil i projektmappen...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Val av microprocessor, RGB LED styrning
strunta i Auto - det är krångligare, och du kan ändå inte använda det innan du fyllt i uppgifterna i de andra flikarna.
börja med main - välj där vilken processortyp det är frågan om.
kolla sedan processorns ID - den ska stämma, och det är också en bekräftelse på att du får kontakt med processorn.
sedan går du till "program". På en rad ska du fylla i källfil för Flashmine. leta upp hexfilen: gå in i mappen för ditt projekt. gå ner i mappen defalut, där ska finnas en fil med "projektnamn.hex". Välj den filen. Klicka sedan på "program flash".
börja med main - välj där vilken processortyp det är frågan om.
kolla sedan processorns ID - den ska stämma, och det är också en bekräftelse på att du får kontakt med processorn.
sedan går du till "program". På en rad ska du fylla i källfil för Flashmine. leta upp hexfilen: gå in i mappen för ditt projekt. gå ner i mappen defalut, där ska finnas en fil med "projektnamn.hex". Välj den filen. Klicka sedan på "program flash".
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Aha!
Nu hittar jag, och det fungerar perfekt.
Raderna tänds en eller flera åt gången. Eller var det kolumnerna?
Nu hittar jag, och det fungerar perfekt.
Raderna tänds en eller flera åt gången. Eller var det kolumnerna?
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Nu har jag fastnat lite...
Jag kan tända rader, en eller flera samtidigt.
Men färgerna lyckas jag inte få någon som helst kontroll över.
Jag har ändrat fram och tillbaka på allt som har med färger att göra, men jag hittar inget mönster i hur det fungerat...
(Tillägg)Färgerna blir inte alltid det samma även fast jag skrivit likadant, men testat något annat i mellan, alltså måste något sparas från det förra testet eller nått?
Jag har funderat lite på skicka_data men inte kommit fram till hur du tänkt? med char, och vilka kommandon man använder för att välja, var det rad? så att en led lyser?
eller färg? (Då variablerna heter red, green och blue?)
Anropet borde se ut typ så här : skicka_data(a, b, c); där a, b och c antingen är en charvariabel eller ett täcken. (Från main)
(Tillägg)Kom på nu, när jag sovit och fått ny energi, att man med hjälp av charvariablerna borde man kunna säga till skicka_data vilka färger som ska vara tända eller inte.
Detta med hjälp av t.ex. if-satser, men då skulle jag behöva veta vilket kommando som används för att släcka och kanske tända en led. (Tända en led borde kunna vara något med: PORTB = STROBE | OUTPUT_RED;). (STROBE förstår jag inte vad den gör...)
Kan någon ge något tipps? behöver inte vara långa grejer utan bara något som gör att jag fattar lite mer.
Jag kan tända rader, en eller flera samtidigt.
Men färgerna lyckas jag inte få någon som helst kontroll över.
Jag har ändrat fram och tillbaka på allt som har med färger att göra, men jag hittar inget mönster i hur det fungerat...
(Tillägg)Färgerna blir inte alltid det samma även fast jag skrivit likadant, men testat något annat i mellan, alltså måste något sparas från det förra testet eller nått?
Jag har funderat lite på skicka_data men inte kommit fram till hur du tänkt? med char, och vilka kommandon man använder för att välja, var det rad? så att en led lyser?
eller färg? (Då variablerna heter red, green och blue?)
Anropet borde se ut typ så här : skicka_data(a, b, c); där a, b och c antingen är en charvariabel eller ett täcken. (Från main)
(Tillägg)Kom på nu, när jag sovit och fått ny energi, att man med hjälp av charvariablerna borde man kunna säga till skicka_data vilka färger som ska vara tända eller inte.
Detta med hjälp av t.ex. if-satser, men då skulle jag behöva veta vilket kommando som används för att släcka och kanske tända en led. (Tända en led borde kunna vara något med: PORTB = STROBE | OUTPUT_RED;). (STROBE förstår jag inte vad den gör...)
Kan någon ge något tipps? behöver inte vara långa grejer utan bara något som gör att jag fattar lite mer.
-
- Inlägg: 144
- Blev medlem: 8 september 2010, 14:26:12
Re: Val av microprocessor, RGB LED styrning
Jag läste lite på det Jesse tidigare skrev i sitt prototyp program, och såg detta:
OUTPUT_GREEN = 0001000;
Skulle detta göra att den 4:e raden öppnas för grön? och resten släcks.
Eller ska man använda hexadecimalt?
Tänkte testa lite med detta när jag kommer hem.
Då kom jag på tanken, om hur skicka_data kan "anropa" shiftregistret. Det skulle kunna vara ungefär så här:jesse skrev:// funktion som skickar ut data till shiftregistren
// red,blue,green innehåller var och en 8 bitar data.
// varje bit tänder en LED i den kolumnen
void skicka_data(char red, char blue, char green) {
// SKRIV ALGORITM HÄR
}
OUTPUT_GREEN = 0001000;
Skulle detta göra att den 4:e raden öppnas för grön? och resten släcks.
Eller ska man använda hexadecimalt?
Tänkte testa lite med detta när jag kommer hem.
Re: Val av microprocessor, RGB LED styrning
Hmm, ja alltså du behöver gå igenom rad för rad i koden och förstå exakt vad dom gör innan du går vidare.
OUTPUT_GREEN = 0001000;
Den raden är inte korrekt på något vis.
Om vi går upp lite i koden hittar vi:
#define OUTPUT_GREEN (1<<PB4)
Det betyder att man definerar ett makro, alltså att kompilatorn byter ut OUTPUT_GREEN mot (1<<PB4) överallt hädanefter i koden. Din kodrad blir alltså:
(1<<PB4) = 0001000;
Det blir väldigt märkligt. Du måste förstå lite mer hur skiftregistret fungerar. Du ska "klocka in" bitarna en och en, inte skriva in alla på en gång.
Och ett annat tips:
minvariabel = 0b01010101; //binärt värde
minvariabel = 0xFF; //hexadecimalt
OUTPUT_GREEN = 0001000;
Den raden är inte korrekt på något vis.
Om vi går upp lite i koden hittar vi:
#define OUTPUT_GREEN (1<<PB4)
Det betyder att man definerar ett makro, alltså att kompilatorn byter ut OUTPUT_GREEN mot (1<<PB4) överallt hädanefter i koden. Din kodrad blir alltså:
(1<<PB4) = 0001000;
Det blir väldigt märkligt. Du måste förstå lite mer hur skiftregistret fungerar. Du ska "klocka in" bitarna en och en, inte skriva in alla på en gång.
Och ett annat tips:
minvariabel = 0b01010101; //binärt värde
minvariabel = 0xFF; //hexadecimalt
Senast redigerad av E85 29 september 2010, 17:02:19, redigerad totalt 1 gång.