Val av microprocessor, RGB LED styrning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 tror varken PIC eller AVR är bättre än den andra.

Jag kan inget om PIC och ännu mindre om PIC asembler. Däremot bollar jag gärna idéer på teoretisk nivå, eller vad man ska kalla det - programstruktur, algoritmer etc... man kan ju alltid diskutera exempel i pseudokod. Det fungerar ju oavsett processortyp eller programspråk.

Det kan ju vara en fördel om ni är flera som jobbar med PIC, att välja den - då kan ni ju hjälpas åt / diskutera lösningar med varandra. Sen vet jag inte hur mycket tid en rektor har att hjälpa en enskild elev med så detaljerade studier.

Så PIC eller AVR? Som en åsna mellan två hötappar.

Men fördelen med att programmera i C är väl att du har börjat med Java, och att C liknar java. Assembler kräver dessutom stenkoll på varje detalj du gör, hålla reda på hur vartenda register används, göra alla beräkningar och funktioner i 8-bitars operationer osv... En enda liten grej fel och det funkar inte. Så att göra ett så pass komplicerat program som du tänkt kan bli ganska krångligt i assembler. Dock ingen omöjlighet.
sodjan skrev:Ja, jag antog väl kanske inte att någon annan skulle skriva koden... :-)
Min tanke var inte att skriva färdigt koden. Jag ville bara ge något att stå på - en utgångspunkt att starta med.

Oavsett om du väljer PIC eller AVR så kommer du att bli tvungen att lära dig mycket, som kommer att vara värdefull kunskap i framtiden, såvida inte jag eller nån annan skriver programmen åt dig. Då lär du dig inte mycket. Det är därför jag vill stiga lite åt sidan nu, för att se hur du löser problemen. Men jag kommer givetvis gärna med tips om du fastnar, om du skulle välja att fortsätta med AVR.

EDIT: det finns ingen anledning att gå över till assembler om du ska fortsätta använda AVR. Enda anledningen att byta till assembler var väl om du skull använda skolans material - och det handlar ju bara om PIC.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Jaha, är skolans om PIC.
Det hade jag inte förstått. Men det är väll ingen större skillnad på dem, så det ska väll fungera?

Över till exempelkoden.
Skulle någon kunna skriva en kort exempelkod på hur man gör någon enkel uträkning och kanske hur man göra en repetitionssatts i assembler?
Alltså något som skulle fungera i en PIC. Kod i största allmänhet. Men jag kan ju kolla lite på exemplena du länkade till också, så det kanske räcker?
Om inte någon är väldigt sugen på att skriva lite.
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 »

Jaha, är skolans om PIC.
Det hade jag inte förstått
Ja, du skrev det själv:
Skolan har kört på 16F877 microprocessorer, från Microchip.com. Tror ni dessa kan vara tillräckligt kraftfulla för mitt projekt?
16F877 är en PIC.
Skulle någon kunna skriva en kort exempelkod...
Du vill väldigt gärna att folk gör saker åt dig. Jag tror det är flera här nu som vill se din kod. Vad har du skrivit? Jag har lagt ner flera timmar på att skriva kod åt dig så att du kan experimentera med den och lära dig saker, men istället kastar du den på soptippen och vill att någon ska skiva ny kod åt dig. Du är lite för bekväm. Läs lite bland alla de miljoner exempel du kan finna på nätet, och testa något av dem.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Aj, aj kapten!
Jag känner också som du säger, att man blir väldigt lat när det är massor med personer som kan svara på frågor.
I stället för att söka själv. Jag ska försöka bättra mig.
Jag har klurat en del på den första kod biten du skrev och lite på den andra. Men ska göra mer när jag får tid, kanske blir lite mindre om jag går över till PIC och asembler.
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 »

Det är ju inte heller så att du *måste* byta till assembler bara för att du
byter till PIC processorer. Det bara lät som att det var den enklaste vägen
eftersom du då också för hjälp och stöd lokalt på skolan. *Det* kan vara
värt mer än eventuella skillnader mellan AVR/PIC eller C/assembler.

Det är näst intill omöjligt att peka ut den rätta vägen med rak arm.
T.ex så var det ju knappast något här på forumet som från början kände
till att det fanns stöd att hämta lokalt på skolan (för just PIC).
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Att det fanns stöd på skolan visste inte jag häller, ända till igår...
Detta på grund av att vi har en hel del nya lärare som inte visste om detta.

Jag tänkte prata mer med rektorn på måndag och kolla på studiematerialet de har, och sedan bedömma vad som är rimligt.
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 »

Lista gärna vad skolan har för material (utrustning, böcker o.s.v), det är
inte osannolikt att det finns någon här som kanske har erfarenhet av dom.
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 »

Tycker det är konstigt om man inte har någon som kan C-programmering på skolan. Det är ju det mest allmänna programmeringsspråket som finns. Men jag kan förstå om materialet för just PIC är baserat på assembler, då man kommer mycket närmare processorn och hur den är uppbyggd.

Ungefär så här ligger det till:

Det finns massor av olika sorters microcontrollers och en massa olika tillverkare. Varje tillverkare har en eller flera varumärken. Bland 8-bitars controllers, vilka är de enklaste att lära sig, är AVR från Atmel och PIC från Microchip de allra vanligaste.

Assemblerkoden skiljer sig åt ganska mycket mellan olika märken, men själva programspråket C är ju detsamma oavsett vilken processor man använder.

Likheter och skillnader:

Båda typerna har tre sorters minnen: (1) Flashminne där programmet lagras, (2) SRAM där variabler lagras, samt EEPROM där man kan lagra data som ska bevaras.

Alla processorer har s.k. register, där de lagrar tillfällig data som de använder vid bearbetning. Antalet register kan variera, men i AVR är det vanligt med 32 st 8 bitars register. All data som ska bearbetas (adderas , jämföras etc) måste (vanligtvis) först hämtas in i ett register i CPU. I assembler benämns dessa register r0 - r31 men man kan också tilldela dem egna namn.

Sedan har microcontrollers ett antal kontrollregister som används till kommunikation med kringutrustningen - både internt och externt. Det är ett antal minnesadresser där varje adress har en speciell funktion. Exempel i AVR är t.ex några adresser som heter DDRB, PINB och PORTB. Skriver man data till dessa så påverkar man den enhet som heter "port B" i processorn. På så vis kan man programmera vissa pinnar på processorn som digitala utgångar eller ingångar (DDRB), läsa in data från ingångarna (PINB) eller skicka ut data på utgångarna (PORTB). Hur detta fungerar kan du läsa i databladet eller kolla något enkelt exempel. PIC har motsvarande funktioner, men med helt andra namn för samma funktioner (jag har hört talas om t.ex TRISA t.ex.)

Båda typerna har ungefär samma slags inbyggd kringutrustning som t.ex. Timers (används till en massa saker, bl.a till att utföra uppgifter med vissa tidsintervall, generera toner (ljud) mer mera), Analog-till-digital-omvandlare, UART (seriell asynkron kommunikation , t.ex. RS232 - används ofta för kommunikation med PC), SPI (3-trådars seriell dataöverföring, används för att skicka data till andra kretsar, även shiftregister), I2C ännu en form av seriell kommunikation osv...

Assemblerkoden: Assemblerinstruktionerna är helt olika till namnet och kanske syntax också, men funktionen är ganska detsamma ändå. PIC har vissa instruktioner som inte AVR har och vice versa. Därför, om man lär sig assembler för AVR så går det inte att använda på PIC. Däremot har man lärt sig grunderna i hur en 8-bitars processor arbetar kan man lättare lära sig att skriva assembler även för andra processorer. I assembler väljer man själv vilka register man ska använda för att lagra och beräkna data. Man får själv skapa utrymme i SRAM för lagring av variabler osv.

Programmera i C: Processorn fungerar likadant oavsett om du arbetar i assembler eller i C. dvs. du måste fortfarande sriva till DDRB eller PORTB om du ska skicka ut data på "port B". Men C underlättar eftersom du kan hantera 16 eller 32 bitars heltal och använda formler utan att behöva krångla med detaljer. Man behöver inte bry sig om CPU-registren alls - detta tar kompilatorn hand om och sköter själv. Du behöver inte bekymra dig om SRAM-minnet (så länge det räcker till): när du deklarerar variabler så ordnas utymme i SRAM automatiskt för dessa variabler.

exempel i assebler:
beräkning: läs in data från port A, addera 15 och multiplicera med 4, skicka ut svaret på port B:
( r16 är ett internt 8-bitars register i CPU som ofta används för temporär lagring av data)

Kod: Markera allt

; först konfigurera in- och utgångarna

; alla 8 bitar i port A ska vara ingångar
LDI r16, 0x00
OUT DDRA,r16
; alla bitar i port B ska vara utgångar
LDI r16, 0xff
OUT DDRB, r16

; läs in data från port A
IN r16, PINA
; addera tre
LDI r17, 3
ADD r16,r17

; multiplicera med fyra
lsl r16 ; logic shift left = alla bitar flyttas ett steg åt vänster, vilket binärt ger multiplikation med två.
lsl r16 ; en gång till

; resultatet finns nu i registret r16
; skicka ut det på port B
OUT PORTB,r16

END: rjmp END ; stanna här.
Assemblerkoden ovan är specifik för just AVR och kan inte användas på andra processorer. AVR har sitt eget assemblerspråk. För PIC hade det sett annorlunda ut (någon får gärna ta samma exempel för en PIC för att man ska se skillnaden).

samma sak i C: läs in data från port A, addera 15 och multiplicera med 4, skicka ut svaret på port B:

Kod: Markera allt

int main(void) {
    unsigned char temp; // ett 8-bitars positivt heltal

    // konfigurera portar
    DDRA = 0x00;
    DDRB = 0xff;

    // läs in från port A
    temp = PINA;

    //  beräkna resultat och skicka ut till port B
    PORTB = (temp + 3)*4;

    while(1); // stanna här
}
Även om programspråket C fungerar på PIC lika bra som AVR, så skulle ovanstående program inte fungera på en PIC. Varför? Jo, för att i PIC så heter DDRA,DDRB,PINA,PORTB osv.. något helt annat (och ibland används de på ett annat sätt också). Därför måste man vara väl bekant med processormodellen för att kunna skriva ett program till den.


Per Foyers bok "Mikroprocessorteknik" är en utmärkt bok där han mycket pedagogiskt och enkelt förklarar hur en processor fungerar, hur ALU, minne, kringutrustning fungerar osv. Man lär sig hur kontrollregistren fungerar och man lär sig AVR assembler. Från sidan 1-76 är boken generell, dvs ger allmän grundkunskap som inte är specifik för just AVR. Där man går igenom hårdvara, binära tal, binära heltal och negativa tal, hexadecimala tal, minneshanering, allmänt om programmeringsspråk med mera. Från sidan 77 och framåt användar man sedan en AVR för olika exempel.[/
i]
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 »

> Tycker det är konstigt om man inte har någon som kan C-programmering på skolan.

Dels så vet vi inte om det är så, och sannolikt är det inte heller så.
Frågan är om de har kunskap och verktyg (kompilatorer m.m.) för
programmering i C på just *mikrokontrollers* och i just detta fall PIC.

Det finns ibland en missuppfattning att man inte behöver veta hur processorn
fungerar bara för att man programmerar i C. Det är fel.

Och problemet är inte att lära sig assembler eller C, utan det är
att lära sig *programmera* mikrokontrollers överhuvudtaget.

> men själva programspråket C är ju detsamma oavsett vilken processor man använder.

Nja, det är nog inte så enkelt som det låter. C är inte ens "detsamma" mellan olika
kompilatorer för *samma* processorfamilj. D.v.s om man "C" då menar *hela* miljön,
inte enbart de rena C specifika prylarna vilka sannolikt är i stort sett desamma. Men
det är ju bara "skalet" så att säga, sen ska det fyllas med med något också. Lite
senare ditt inlägg så backar du ju även en del på just denna punkt... :-)
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 »

Visst , C är bara "skalet". Men det kan ju vara bra att kunna, eftersom det kan användas i många olika sammanhang. Det var så jag menade.

Men för att kunna fylla det med vettigt innehåll, så är det ju som du säger - då måste man kunna sin processor.

Med assemblerprogrammering blir man expert på att manipulera bitar och kombinera 8-bitars operationer för att skapa 16- och 32 bitars funktioner osv... och man blir expert på att hantera CPU register och minnesadresser.

Med C kan man hoppa över lite av den biten (men inte helt), för att kunna koncentrera sig på högre funktioner, på själva *uppgiften*.

Vad som är "bäst" kan nog TS bara svara på själv. Och det beror mycket på vad man har runt om sig: verktyg osv... Nu har ju TS fixat både WINAVR, AVRISP-programmerare och en processor med en LED_matris. Det som fattas nu är egentligen grundläggande förståelse för hur ett shiftregister fungerar, och hur man skapar timing och bra algoritmer för att skicka ut data till lysdioderna. Jag tror inte det underlättar i det läget att byta både processor och språk för att börja om från "noll".

Samma hinder kommer att uppstå oavsett plattform: hur man skapar timingen, hur man skickar data till shiftregistren (vilket nästan är klart) samt de högre funktionerna som skapar olika mönster. Och han måste fortfarande lära sig hur ett shiftregister fungerar.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Det låter faktiskt sant, med att dit blir jobbigt att börja från noll, med tanke på att jag redan skaffat en del grejer, och börjat lära mig.
Ska satsa på att fortsätta programmeringen, och lära mig om shiftregister.

(Tillägg):
Nu har jag bestämt mig, det blir C och AVR. Då jag redan börjat lära mig. (Hade jag vetat om att skolan har grejer mm. från början, hade jag valt det, men nu blir det C och AVR).
Nu ska jag sätta mig in ordentligt i programmeringen och allt annat.

Tack alla!
För all hjälp och info!

PS.
Jag hoppas på att kunna fortsätta samarbetet med er!
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hej igen!
Nu har jag börjat klura på programmeringen. Och med hjälp av det ni tidigare skrivit kunnat få fram sju olika färger, hoppa mellan olika rader, göra en regnbåge som står stilla och som rör sig. Med det sistnämnda kan jag välja en eller flera rader och göra ett mönster, fast ska man göra detta på flera rader (med olika mönster på olika rader) för att få fram exempelvis bokstäver, så blir det inte så effektivt... Då det bara flimrar...
En annan sak är att jag inte vet hur man släcker en led i en rad. Vilket gör att hela raden (kan vara olika färger i.o.f.s) måste vara tänd.

Jag har skrivit i skicka_data för att hantera färger, se en del av den nedan:
void skicka_data(int red, int green, int blue) { // SKRIV ALGORITM HÄR

if (red == 1 && green == 0 && blue == 0){ //RÖD
PORTB = STROBE | OUTPUT_RED; // sätt utgången "grön" till etta.
_delay_ms(1);
PINB = CLOCK; // toggla klockan - dvs skicka ut färgkombinationen till shiftregistren
_delay_ms(1);
PINB = CLOCK;
}
}
Och för att anropa detta gjorde jag så här:
PORTA = 0b00000011; //Väljer vilka rader som ska tändas (Nu 7 och 8)
skicka_data(0, 1, 0); //Väjer vilka färger som ska tändas (R, G, B), etta för aktiv färg
_delay_ms(1);
skicka_data(0, 1, 0);
_delay_ms(1);
skicka_data(0, 1, 0);
_delay_ms(1);
skicka_data(1, 0, 0);
_delay_ms(1);
skicka_data(1, 0, 0);
_delay_ms(1);
skicka_data(0, 1, 0);
_delay_ms(1);
skicka_data(0, 1, 0);
_delay_ms(1);
skicka_data(0, 1, 0);
_delay_ms(1);
Detta är smidigt om man ska göra ränder som är samma på en eller flera rader, utan att byta mellan olika mönster på raderna.

Har ni några funderingar kring detta eller idéer på förbättringar eller utökningar. Eller på hur man släcker en led i en rad, eller något annat, så skriv gärna några rader.
MVH
Dragon9226
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: Val av microprocessor, RGB LED styrning

Inlägg av E85 »

Du kan ju testa nåt sånt här kanske:

Kod: Markera allt

uint8_t i;
for(i = 0; i < 8; i++)
{
	PORTA = (1 << i); //Väljer rad
	skicka_data((i < 3 ? 1 : 0), 0, 0);
	skicka_data((i > 1 ? 1 : 0), 0, 0);
	skicka_data((i < 5 ? 1 : 0), 0, 0);
	skicka_data((i > 2 ? 1 : 0), 0, 0);
	skicka_data((i > 6 ? 1 : 0), 0, 0);
	skicka_data((i < 1 ? 1 : 0), 0, 0);
	skicka_data((i > 0 ? 1 : 0), 0, 0);
	skicka_data((i > 5 ? 1 : 0), 0, 0);
}
och skicka_data() behöver inte vara så avancerad.. prova nånting sånt här istället:

Kod: Markera allt

void skicka_data(int red, int green, int blue)
{
	PORTB = STROBE | (red > 0 ? OUTPUT_RED : 0) | (green > 0 ? OUTPUT_GREEN : 0) | (BLUE > 0 ? OUTPUT_BLUE : 0);
	_delay_us(100);
	PINB = CLOCK; // toggla klockan - dvs skicka ut färgkombinationen till shiftregistren
	_delay_us(100);
	PINB = CLOCK;
}
OBS det där ger bara av eller på bland färgerna... så krävs lite mer avancerat om du vill kunna bestämma ljusstyrka på färgerna.
Det här var bara nåt jag slängde ihop snabbt för att du ska få lite olika dioder lysande på olika rader på arrayen. Kanske inte ens funkar men du kan ju prova...
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Aha!
Ditt förslag på skicka_data var ju lite smartare än mitt. Det där var en smart funktion från C =)
Bara en fråga, vad för enhet är _delay_us(100) (Microsekunder 1/1000000, tillägg) i? För _delay_ms(1) är ju millisekunder (1/1000s).

Ditt färgexempel var också intressant. Det borde göra så att 8*8 rader skickas ut. Dessa kommer väl antingen vara röda eller "ingen" färg, den som råkar ligga där innan?
Men om man lägger till lite, eller flyttar några av dessa: (i < 3 ? 1 : 0), så borde det bli andra färger också. Så att de andra färgerna kan bli ettor också.
Jag kan dock inte testa detta för än i eftermiddag, då jag inte har led displayen i skolan.

Stämmer detta?

Vid dimning skulle det fungera med att ha en variabel till när man anropar skicka_data? Som bestämmer ljusstyrkan.
Sedan får man ändra lite på själva skicka_data så att den hanterar den fjärde variabel, och bestämmer ljusstyrka.
Men hur sjusterar man ljusstyrkan?
Senast redigerad av dragon9226 5 oktober 2010, 10:59:22, redigerad totalt 1 gång.
ds77
Inlägg: 2461
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: Val av microprocessor, RGB LED styrning

Inlägg av ds77 »

us är mikrosekunder och ms är millisekunder... sen hur stor del av en sekund vadera är får du klura på själv.
Skriv svar