Val av microprocessor, RGB LED styrning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Tror ni detta skulle fungera?
Som en enkel version av programmet.

Kod: Markera allt

//---------------- standardbibliotek ------------------

   #include <avr/io.h>
   #include <util/delay.h>
   #include <util/delay_basic.h>

   #define CLOCK (1<<PB1)

   #define ROW0 (1<<PF0) // motsvarar pinne PA0 - dvs rad 0
   #define ROW1 (1<<PF1)
   #define ROW2 (1<<PF2)
   #define ROW3 (1<<PF3)
   #define ROW4 (1<<PF4)
   #define ROW5 (1<<PF5)

   #define RED0 (1<<PA0)
   #define RED1 (1<<PA1)
   #define RED2 (1<<PA2)
   #define RED3 (1<<PA3)
   #define RED4 (1<<PA4)
   #define RED5 (1<<PA5)
   #define RED6 (1<<PA6)
   #define RED7 (1<<PA7)

   #define GREEN0 (1<<PC0)
   #define GREEN1 (1<<PC1)
   #define GREEN2 (1<<PC2)
   #define GREEN3 (1<<PC3)
   #define GREEN4 (1<<PC4)
   #define GREEN5 (1<<PC5)
   #define GREEN6 (1<<PC6)
   #define GREEN7 (1<<PC7)

   #define BLUE0 (1<<PD0)
   #define BLUE1 (1<<PD1)
   #define BLUE2 (1<<PD2)
   #define BLUE3 (1<<PD3)
   #define BLUE4 (1<<PD4)
   #define BLUE5 (1<<PD5)
   #define BLUE6 (1<<PD6)
   #define BLUE7 (1<<PD7)


void skicka_data(char red, char green, char blue) {	// SKRIV ALGORITM HÄR
	
	PORTA = red;
	PORTC = green;
	PORTD = blue;
	
    _delay_us(1);
	
}

/**** huvudprogrammet ****/
int main(void) {

   // initiering av portar
    DDRF = 0b00000000; // alla pinnar på port F ska vara ingångar	        rad
    DDRA = 0b11111111; // alla pinnar på port A ska vara utgångar	röd
    DDRC = 0b11111111; // alla pinnar på port C ska vara utgångar	grön
    DDRD = 0b11111111; // alla pinnar på port D ska vara utgångar	blå

	PORTF = 0b11111111;		//aktiverar alla rader

    while(1) { // ...loopa för evigt...

		for (int y = 0; y < 3; y++){
			PORTF = 0b00011000;
			skicka_data(0b00011000, 0b00011000, 0b00000000 );// red, green, blue
			_delay_ms(500);
		
			for (int i = 0; i < 100; i++){
				PORTF = 0b00111100;
				skicka_data(0b00011000, 0b00011000, 0b00000000 );// red, green, blue
				_delay_ms(1);

				PORTF = 0b00011000;
				skicka_data(0b00111100, 0b00111100, 0b00000000 );// red, green, blue
				_delay_ms(1);
			}
		}
		
    }
}
Skriv gärna kritik på denna kod, vad som är fel, tankar och idéer.

MVH
Dragon9226
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 »

Nej, du behöver inte definiera pinnarna om inte definitionen ska användas. I sådant fall brukar jag ändå skriva en kommentar i början av programmet om vad porten används till så att du inte måste leta upp schemat varje gång du vill veta (t.ex. i samband med att du definierar om oinnarna ska vara in - eller utgångar:

Kod: Markera allt

// portar
DDRD = 0xff; // PORTD är 8 utgångar som styr blåa LEDs. etta = tänd, nolla = släckt. 
Externt minne? ehh.. det har jag ingen koll på, men om programminnet i ATmega128 inte är för litet så ska hela programmet (inklusive alla funktioner) få plats där. Varför skulle en viss funktion inte duga att ha i det vanliga programminnet? (det heter alltså funktion i C, inte metod).

(edit: hoppsan, ett inlägg kom till medans jag skrev: svaret gäller ditt näst sista inlägg)
(edit2: stället för att definiera alla åtta pinnar individuellt kan du ju istället definera hela porten till ett passande namn, t.ex. #define BLUEPORT PORTD )
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 »

Tror ni detta skulle fungera?
Jättesvårt att säga bara genom att titta på koden. Fungerar det att kompilera koden? FUngerar det att köra den i processorn? Blir det som du tänkt dig? Om det blir fel nånstans i de stegen så kanske du själv hittar felet (för du ser felmeddelandet eller "symtomen") annars får du fråga specifikt om det som inte funkar.

EDIT: men ett fel ser jag direkt: DDRF = 0b00000000; // rad ska vara DDRF = 0b00111111; // sex utgångar - rad

De ska vara utgångar, eftersom de styr transistorerna som ska välja vilka rader som ska vara aktiverade.

(EDIT: ändrat 0x00... till 0b00...)
Senast redigerad av jesse 15 december 2010, 20:56:14, redigerad totalt 1 gång.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Ok, men det var inte riktigt så jag menade.
Alltså inte; om det är något stavfel eller liknande.

Men mer om jag tänkt rätt i principen.

Är denna definering och initiering av in- och utgångar korrekt?

Kod: Markera allt

   #define ROW PORTF
   #define RED PORTA
   #define GREEN PORTC
   #define BLUE PORTD

    ROW = 0b00111111; // alla pinnar på port F ska vara utgångar	rad
    RED = 0b11111111; // alla pinnar på port A ska vara utgångar	röd
    GREEN = 0b11111111; // alla pinnar på port C ska vara utgångar	grön
    BLUE = 0b11111111; // alla pinnar på port D ska vara utgångar	blå

Tillägg/ändring:
Men tack för det bra och snabba svaren. =)
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 »

Bara ett litet fel: När du skriver BLUE = 0b11111111; så blir det ju inte DDRD = 0b11111111; utan det blir PORTD = 0b11111111; så DDRD kan du inte byta ut mot BLUE. Däremot i funktionen sedan Använder du BLUE = blue; Jag hade nog gett dem lite längre namn, så man vet vad ordet betyder. BLUEPORT eller PORT_BLUE istället för bara BLUE till exempel.

Annars är nog principen inget fel på... Man kan ju göra på många olika sätt.
T.ex så kan du ju ha med även rad PORTF inne i själva funktionen. Det kan ju vara både en fördel och en nackdel.

(EDIT: ändrat 0x1111.... till 0b1111....)
Senast redigerad av jesse 15 december 2010, 20:55:20, redigerad totalt 1 gång.
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 »

När det gäller "principen", hur du lägger upp själva programmet, så är ett flödesschema värdefullt. Då slipper man alla små detaljer, men ser till att allt hänger ihop logiskt i stor skala. Sedan kan man gå in och programmera varje del för sig. Något jag skrivit om tidigare i den här tråden är ju objekt och objektorienterat tänkande. Kan vara av intresse då en "bild" du vill visa med dioderna kan betraktas som ett objekt: hur ska det representeras bäst i minnet? Hur ska det beskrivas bäst i programmet?

Exempel på flödesschema:

Bild
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 »

Jesse: Sen så skriver man inte 0x00000000 heller utan det ska vara 0b00000000...
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 »

Är visst lite slarvig ibland. Du har rätt givetvis. Lika bra att jag ändrar i inlägget ovan. :oops:
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hoppsan, då vet jag en till som var slarvig :P
Jag såg inte ens att det var fel...

Är strax klar med lödningen av led:sen så snart kan jag äntligen testa med kortet =)
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 »

Ja, det är ju en fördel med ett forum - inläggen granskas med kritiska ögon :)
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Jag har funderat på hur jag ska definera den externa kristallen. Jag har försökt hitta något i databladet, som dock är 388s...

Med en interna så är det som jag förstått exempelvis så här: #define F_CPU 8000000 för att använda intern 8 MHz osilator

Men hur definerar man en extern? på 16MHz?

(Tillägg)
Kom att tänkte på att när man ska definera in/ut gångar, så skriver man: RED = 0b11111111;
Detta skriver man i main utanför loopen. Men borde inte detta tända de röda?
Som samma kod gör om man har det som tändkommando???
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 »

>Kom att tänkte på att när man ska definera in/ut gångar, så skriver man: RED = 0b11111111;
>Men borde inte detta tända de röda?

Jo, det hade det ju gjort om pinnarna varit satta som utgångar, vilket du inte har gjort innan. Men om du läste mitt inlägg lite längre upp så påpekade jag också att det var fel:
Bara ett litet fel: När du skriver BLUE = 0b11111111; så blir det ju inte DDRD = 0b11111111; utan det blir PORTD = 0b11111111; så DDRD kan du inte byta ut mot BLUE.
Jag kanske var otydlig, men vad jag menar är att du givetvis måste skriva DDRD = 0b1111111; där.

Kristallen: Du kör väl med AVRStudio 4 antar jag?
Där sätter man frekvensen (oavsett om den är intern eller extern) under "projekt" => "configuration options", där du väljer vilken processor du använder (device) och vilken frekvens den går på (Frequency) i Hz... dvs 16000000. Då kommer det att skapas ett macro som heter F_CPU och som innehåller frekvensen i Hz. Det kan du använda i programmet för att beräkna tider med mera... Det används även i _delay_ms() och _delay_us().


Men för att verkligen få processorn att byta från intern RC-oscillator till oscillator med kristall så måste du programmera "fuses" , som du gör direkt mot processorn genom "program AVR" => "connect" och väljer rätt där... exakt vad du ska välja kan jag inte utantill och jag har ingen programmerare i närheten just nu att prova på... Men du ska i varje fall inte välja extern oscillator! Det är inte detsamma som extern kristall! Du ska välja "kristall", full swing och med så lång uppstartstid som möjligt, tror det är 65 mS. Om du väljer detta så måste du ha en kristall riktigt monterad på kortet, annars kommer processorn inte att fungera. Det kan hända att swech redan har programmerat processorn att använda kristallen, det är bäst att du kollar med honom först. Det kan bli väldigt fel (processorn slutar fungera för alltid) om du gör fel här!
Användarvisningsbild
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

Inlägg av Swech »

Kristallen är ditlödd och vald i fuses. Har testat också, den funkar fint.

Dragon926 Pilla inte med fuses. Se bara till att ange i ditt program att hastigheten
är 16MHz. Jesse har säkert redan skrivit hur detta görs. Själv kör jag inte C....

Swech
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Ok, då vet jag.
Tack för ditt snabba svar Swech =)

Då låter jag bli fuses. Har ställt in den på 16Mhz
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hej hopp!
Nu har jag lött allt och kopplat in kretskortet.

Efter lite klurande med Avr Studio 4 så fick jag in det simpla programmet i processorn.
Det fungerar!
Lite glapp någon stans när jag lyfter det, då processorn bara sitter i sladdarna.

Det ända jag funderar över är att det lyser ganska svagt när man tänder alla av en färg.

:D :D :D
Skriv svar