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 »

Aha, det är där det svaga ljuset kommer ifrån.
Jag ska försöka att få bort det, då det inte var meningen, dock som sagt kan det vara en kol effekt i vissa lägen.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Hej alla glada!
Nu börjar jag äntligen komma igång med projektet igen.
Komponenter och kretskort är införskaffat. Kretskortet är delvis lött, (de komplicerade delarna).
Jag har även tillverkat en "fixtur-platta", i en cnc-maskin, och i denna har jag nu monterat 192 RGB-leds.

Så nu är det bara lödande av kopplingstråd och kretskort som återstår, samt programmeringen då självklart.

Programmeringen blir nog den klurigaste delen, men med lite studerande så ska det nog gå ihop sig.

Jag funderar på att lägga upp schemana, för de intresserade att se.


Om bara dygnet kunde ha fler timmar =)
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Se scheman i nästa inlägg.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av dragon9226 8 december 2010, 17:20:08, redigerad totalt 1 gång.
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 »

Det där schemat har ju bara 64 RGB-dioder. Men kul att det har hänt en massa sen sist.
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är sa du något.
Jag ber så mycket om ursäkt, såg nu att jag råkat lägga ut fel scheman...

Här kommer det riktiga schemana:
Swp139 page1-4 rev0.pdf
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Val av microprocessor, RGB LED styrning

Inlägg av Micke_s »

Youtube suger, clippet är borta för det finns musik från sony... :(

En spontan sak som du kan lägga till på schemat är ett spi-eeprom typ 25LC08 eller liknade, då kan du lagra sekveser utanför processorn. Bara key3 du behöver flytta.
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 »

Det sitter en Mega128 på kortet. 64k word flash
Det bör räcka en stund

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.
Det där lät lite komplicerat.
Behöver man skriva något speciellt i koden för att använda det minnet?
Eller används det automatiskt när man lägger in en kod som inte får plats i processorn?

Tack för att du såg att klippet inte låg kvar.
Jag har nu bytt musik på det, till något som fans på hemsidan som förslag, så nu ska det fungera igen.

Är det något speciellt jag bör ändra i den gamla koden, så att det fungerar på det nya kortet?

Här är koden jag har från tidigare:

Kod: Markera allt

//---------------- standardbibliotek ------------------
   #define F_CPU 8000000
   #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 green, char blue) {	// SKRIV ALGORITM HÄR
	
	
	for (char i=0;i<8;i++) { // åtta varv
       // "output" är den variabel vars databitar kommer att skickas ut på PORTB.
        char output = 0b11111111; // ettställ alla bitar först
      // kolla bit nr 7 i var och en av de tre färgerna
        if (red & (1<<7)) output &= OUTPUT_RED;
        if (green & (1<<7)) output &= OUTPUT_GREEN;
        if (blue & (1<<7)) output &= OUTPUT_BLUE;
      // shifta bitarnas position ett steg år vänster (bit 6 blir bit7 osv..)
        red = (red << 1);
        green = (green << 1);
        blue = (blue << 1);
    // skicka ut data för en kolumn
    // variablen "output" innehåller nu data för alla tre färger
        PORTB = STROBE | output; // denna funktion skickar ut datan till shiftregistren
		_delay_us(1);
    	PINB = CLOCK; // toggla klockan - dvs skicka ut färgkombinationen till shiftregistren
    	_delay_us(1);
    	PINB = CLOCK;
		_delay_us(1);

    }


}

/**** 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


	PORTA = 0b11111111;		//aktiverar alla rader

    while(1) { // ...loopa för evigt...
		// raden nedan tänder följande färger i ordning kolumn 0 till kolumn7
		// svart,röd,blå,grön,gul,violett,vit,magenta,svart

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

			PORTA = 0b00011000;
			skicka_data(0b00111100, 0b00111100, 0b00000000 );// red, green, blue
			_delay_ms(1);
		}
	}
    }
}
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Val av microprocessor, RGB LED styrning

Inlägg av Micke_s »

jo, man behöver skriva speciell kod. Det var bara ett förslag om inte kortet redan är tillverkat.

Fast man behöver inte använda det om man inte vill, behöver inte ens löda dit det...

Edit: det var för framtida bruk om det behövs mycket minne....
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 det något speciellt jag bör ändra i den gamla koden, så att det fungerar på det nya kortet?
Då får du först berätta vad du gjort för ändringar på det nya kortet som inte var med på det gamla. Det är ju en omväg för oss andra att lusläsa ditt schema för att berätta för dig vad du ändrat på.

Men du har ju en hel del att göra. T.ex. kommunicera med klockan som du har satt dit.

Jag kan tipsa lite om hur du utnyttjar flashminnet för lagring av konstanter.
Nu vet jag inte exakt i vilket format din data kommer att vara, men det är mindre viktigt - principen är detsamma oavsett typ.

Du börjar att med att inkludera filen
pgmspace.h genom att skriva

Kod: Markera allt

	#include <avr/pgmspace.h> 
Sedan kan du lätt definiera konstanter i flashminnet bara genom att dekarera variabler med attributet PROGMEM:

Det är kanske meningslöst att deklarera enstaka variabler i flashminnet, men bara för att det är det enkaste exemplet börjar jag med det:

int16_t PROGMEM value = 500;

Nu är det så knepigt att dessa konstanter uppfattas av kompilatorn som vanliga variabler MEN DET ÄR DE INTE! Siffran 500 lagras någonstans i Flashminnet. Adressen till platsen pekas ut av *value. Så därför kan du aldrig använda dem som man brukar med variabler. Du kan alltså inte skriva någon av nedanstående rader utan att det blir tokfel (då kommer kompilatorn att ordna så att processorn läser / skriver i SRAM-minnet istället för Flashminnet och det funkar inte:

Kod: Markera allt

int16_t  a = value; // tilldela värdet till a - FEL!
value = a; // också fel!
Hur ska du då kunna läsa av värdet i "value"? Jo, det finns olika funktioner för det, beroende på vad value har för typ. Mer exakt info om dessa finns om du läser hjälpen för AVR-biblioteken. Men om det är en 16-bitars variabel använder du: int16_t a = pgm_read_word(&value);

Åttabitars: int8_t a = pgm_read_byte(&value);

&-tecknet måste du ha där för att visa att det är ADRESSEN till värdet som ska skickas!

Men för att kunna utnyttja flashminnet till stora mängder data behöver du ju ha arrayer som du kan adressera t.ex. med pekare:

Kod: Markera allt

int16_t PROGMEM limits[VV_ANTAL] =	{5100, 5050, 5000,3460, 3480, 3500,	5100, 2000,  500,	125, 99,99, 999, 800, 100,  199 ,199 ,  3,  800  }; // här lagras data i Flashminnet

int16_t *flashpekare = (int16_t*)&limits; // pekare definieras som pekar på arrayens början

#define ANTAL (sizeof(limits) / 2) // antal 16-bitars parametrar
for (uint8_t i = 0; i<ANTAL; i++) { // en loop som går igenom alla element i arrayen
	int16_t data = pgm_read_word(flashpekare+i);
        // kod här som använder datan...
}
EDIT: skrivit färdigt inlägget + ändrat fel (& stället för *) samt länkade till avr-libc
Senast redigerad av jesse 9 december 2010, 18:31:18, redigerad totalt 3 gånger.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Val av microprocessor, RGB LED styrning

Inlägg av snigelen »

> Stjärnan måste du ha där för att visa att det är ADRESSEN till värdet som ska skickas!
Du menar:

Kod: Markera allt

int16_t a = pgm_read_word(&value);
dvs & för adressen.

> 5100, 2000, 500, 125 X, 99.9 X,99.9 X,

X:en och flyttalen förstår jag inte.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Några av de saker som är nytt är:
Klocka
Extern kristall
Tryckknappar

Mer än så vet jag inte...
Då det inte är jag som har konstruerat kretskortet, och jag har inte närstuderat det ännu eller lött några av de komponenter som än så länge sitter på det.
Så, om Swech, som har konstruerat kortet, skulle kunna hjälpa mig att säga vilka nya delar som kräver kod så ska vi kunna lösa detta.

Tack för kod bitarna =)
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 kretskortet redan färdigt eller går det att göra ändringar? Jag skulle t.ex. lagt till kondensatorer på tryckknapparna mot kontaktstuds... men det ämnet har ju diskuterats många gånger förut i det här forumet så det kanske vi inte behöver ta om igen här. Men du kan ju kolla dom trådarna. Likaså hur man bäst läser av dem.


klockan får du studera hur du ska göra genom att läsa databladet. Swech kanske skickade med några referenser eller t.o.m. drivrutiner / kodsnuttar för att ansluta till klockan? Den kommunicerar ju med I²C-interface - i databladet för ATmegan så kallas det istället för "Two-wire Serial Interface", men är samma sak.
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 »

Kortet är etsat och klart. Dragon har fått ett bestyckat ex.
Nytt mot föregående är:

Processor bytt till Mega128. Det är alltså gott om minne för att göra sekvenser m.m.
16Mhz kristall
3 tryckknappar slutande mot jord, förutsätter intern pullup. Avstudsning görs enklast i mjukvara.
i2c klocka med externt 3V CR2032 batteri samt 32khz kristall
Direktdrivning av rader/kolumner, alltså inga skiftregister.
Schemat visar 6x8 lysdioder. Vid varje diod har dragon tänkt att parallellkoppla 4 dioder
Det blir 192 dioder totalt. Styrbart i grupper om 2x2

------------
övrigt
Mosi/miso är växlade till IDC kontakten. Dragons kort är patchat, schemat är ej uppdaterat.
Resistorvärden är ökade till transistorer.
5V regulatorn klarar > 1 A men övrigt så som diod samt PTC är maxad till 1A.
Likaså den nätadapter som dragon har klarar max 1A. Att köra alla dioder med vitt samtidigt kan därför ligga precis på gränsen. Om detta blir ett problem så måste diod+ptc bytas ut samt ny adapter användas.

Jag har verifierat att processorn funkar, med 16Mhz
Utgångssteg har testats - ok
Knappar samt i2c klocka är ej monterade, montering samt test skall dragon fixa

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

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Det där var precis vad vi behövde.
Tack för den fina och utförliga listan. =)

Med tanke på överbelastningen, på 1A, så tänkte jag så att man borde kunna "blinka" exempelvis halva-halva, med en så hög frekvens att det inte syns,
men så att alla inte är tända samtidigt.
Det borde väll kunna fungera? om man vill ha hela vit.
Skriv svar