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 »

Aha, en bra lista med grejer att fixa programvara till :P

Den största förändringen för det befintliga programmet är väl (förutom byte av processor) att lysdioderna nu styrs direkt via utgångarna utan shiftregister. Så det blir att tänka lite logiskt kring hur du tänder / släcker de lysdioder du önskar och bygga en interfacefunktion för detta. Processorn måste ju fortfarande ha en matris i minnet med informationen som ska skickas ut.

Personligen hade jag nog lagt ett timerinterrupt 1000 gånger per sekund eller så, då jag kör ett "radbyte" för varje gång interruptet körs. Den ska ju tända en rad åt gången, om det ska vara komplexa mönster. Vill du sedan ha starkare ljus måste du ju kunna tända flera rader samtidigt, på bekostnad av mönstrets komplexitet.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

En interface som behandlar vilka utgångar som används borde jag klara att knåpa ihop.
En sådan går ju i och för sig göra på mängder av sätt, som också blir olika snabba. Men det klarar jag troligen själv.

Det jag har svårt för är:
hur jag definerar en viss port. typ: #define RAD0 (1<<PA0) ???
och vad för kommando man använder för att aktivera en viss port? ((tillägg) hur man sedan använder den porten)

Det blir ju inte riktigt som på det andra kortet där man skickar en åtta-bitars sträng till shiftregistret.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Aha!
Kollade lite på hur jag skrivit i det tidigare programmet och hur schemat till det såg ut.
Då insåg jag att defineringen av rad/ kolumn inte är alls svår.

Ex:
#define RAD1 (1<<PA1)

#define - för att definera något
RAD1 - namnet man vill "kalla" porten
1 eller 0 - om porten ska vara in eller utgång när den aktiveras (1 för utgång och 0 för ingång???)
<< - typ tilldela
PA1 - Processorns egna namn på porten

Stämmer detta?


och angående aktivering av en pinn är jag lite fundersam.
Det skulle kunna vara
RAD1 = 0b11111111; - för aktivering
RAD1 = 0b00000000; - för deaktivering.

Men det känns inte helt rätt. Men kanske?
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 »

Nej du är fel ute.

Du väljer om en pinne ska vara ingång eller utgång med:

Kod: Markera allt

DDRA = 0b00000011; //Alla pinnar på PORTA blir ingångar utom PA0 och PA1
eller t.ex

Kod: Markera allt

#define MINPINNE (1<<PA3)
DDRA &= ~(MINPINNE); //PA3 Ingång
DDRA |= MINPINNE; //PA3 Utgång
Varför man gör så kan du klura ut genom att läsa lite om bitwise AND/OR.
#define - för att definera något
RAD1 - namnet man vill "kalla" porten
1 eller 0 - om porten ska vara in eller utgång när den aktiveras (1 för utgång och 0 för ingång???)
<< - typ tilldela
PA1 - Processorns egna namn på porten
RAD1, namnet du vill kalla pinnen.
1 eller 0, nej det kan bara vara 1 där i normalfall.
<<, skifta 1:an från ovan "PA1" gånger. Se nedan.
PA1, en konstant som innehåller vilket nummer pinnen PA1 har i Port A. (PA1 har t.ex värdet 1)

För att ge ett exempel kan vi ta:
#define MP (1<<PA3)

Det är exakt samma sak som:
#define MP (0b00000001 << 3)

Alltså:
#define MP 0b00001000
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Ok.
Så för bestämmande av vilka pinnar på resp. port som ska vara in/ut så används:
DDRA* = 0b00001111; - 0= ingång, 1=utgång

*Det kan vara DDRA, DDRB, DDRC, DDRD osv. Beroende på vilken port.

Och för att sätta ett namn på en specifik pinne så används exempelvis:
#define RAD0 (1<<PA0); - Alltså får pinne noll i port A namnet "RAD0".
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 »

Ja korrekt uppfattat. :)
OBS att det inte finns nåt som säger att RAD0 är låst till Port A annat än att du ser det genom att du använt PA0 i din #define (och inte PB0, PC0 osv). Det handlar helt enkelt om hur du använder konstanten senare. Och du ska inte ha nåt semikolon i slutet av #define.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Justja.
Men betäckningarna använder jag för att veta vad de är kopplade till.
Så jag vet om det är en rad, en grön, röd eller blå kolumn, eller en annan komponent.
För vilken port det tillhör spelar väll ingen roll?

Och vad har man för kommando för att sedan aktivera en specifik pinne?
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 »

Det brukar inte heta "kommando" i C. Man brukar prata om satser eller instruktioner. (eller?)

Men vänta lite nu. (tur att jag laddat ner schemat på min hårdisk)

Visst kan du göra så att du sätter enstaka pinnar till den nivå du vill ha. Men fördelen med en 8-bitars microprocessor är ju att den kan hantera åtta bitar åt gången. När du ska tända ett visst mönster av lysdioder och färger så sätter du ju inte bara en enda pinne. Du sätter ALLA pinnar på port A,C,D och F. Om de ska vara nolla eller etta beror på den data (mönster) du har.

Att skicka ut åtta bitar samtidigt på PORTA gör man bara genom att skriva PORTA = 0b11001100; så har du fixat alla åtta pinnarna samtidigt. Etta tänder, nolla släcker. bit0 är den sista biten (dvs nollan längt till höger) och bit7, den högsta, är siffran (1) efter 'b'.

Därför är mitt tänk nåt i stil med:

Kod: Markera allt

uint8_t redpattern; // ett åttabitars tal - varje bit motsvarar en kolumn.
uint8_t greenpattern;
uint8_t bluepattern;
uint8_t selectedRows; // varje bit från bit0 till bit5 motsvarar en rad. bit 6-7 används ej.


// sätt mönster
PORTA = redpattern;
PORTC = greenpattern;
PORTD = bluepattern;
PORTF = selectedRows;
Nu sätter du allt på en gång, och slipper pilla med enskilda bitar på utgångarna.

(Du kanske skulle försöka läsa på lite mer om bitar och bytes, hur bitarna ligger organiserade i en byte, dvs. det binära talsystemet, så att du förstår vad de olika variablerna innehåller för data. En byte är alltså ett åtta bitars binärt tal. För att du ska förstå vad du gör måste du veta exakt vilken bit som är vad och vad den har för betydelse i just ditt program.)

Jag har ritat ett exempel här:
RGB2.jpg
(edit: missade bit6 i "redpattern". Ska vara 0b01000010.)

(edit2: lade till en bild som visar sambandet mellan bitarna i variablerna och vilka pinnar som aktiveras:)
RGB3.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av jesse 11 december 2010, 18:13:34, 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 »

Det där var ju smart.
Det blir ju mycket smidigare att skicka en hel port i taget, i stället för en pinne i taget.

Jag ber om ursäkt att jag glömt lite sedan vi/jag höll på med det gamla kortet.

Då vet jag hur jag ska bygga upp huvuddelen av programmet.
Då är det bara de extrafunktionerna som behöver kodas.
Som knapptryckningar, kristall och klocka. Som Swech skrev.
Swech skrev: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
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 »

Ta en sak i taget bara. Svårt att programmera allt på en gång. Sen när grejerna fungerar var och en för sig blir det dags att knyta ihop dem. Om man försöker få allt att fungera med en gång brukar det gå åt skogen.

Angående I²C (som heter TWI hos Atmel) så finns det bibliotek för det i avr-libc som heter <util.twi.h>. Det kanske kan vara till hjälp. (Jag använder inte alltid avr-libc bibliotek för all hårdvara, det funkar jättebra utan och kan t.o.m. vara lite förvirrande ibland, men ibland kan de vara till hjälp. Jag har aldrig kört I²C så jag vet inte hur man gör.

Annars finns det en nybörjarguide här: The AVR TWI (I²C) Interface. Det står lite om hur du sätter konfigurationsregistren för TWI under "How It's Done".

Över huvud taget verkar AVRbeginners ha en hel del bra guider.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

OK.
Får ta och läsa på om det när jag kommer dit.

Jag håller för övrigt på och löder. Och har lött alla (-) trådar samt alla röda trådar.
Så nu kan jag manuellt, med att batteri, tända alla grupper.
Dock så har jag problem med en av grupperna mitt i, ingen av ledsen i den gruppen vill lysa (alla andra grupper fungerar fin fint.)....
Jag har konstaterat:
*Ledsen fungerar (troligen, tog ut en och den fungerade när den inte satt i kretsen (den röda leden i RGB:n))
*Alla andra grupper på den röda tråden fungerar (och på den (-) tråden)
*De andra färgerna i den gruppen fungerar, även om man använder den (-) tråden.

Vad kan detta bro på?
(Kanske dock är svårt att säga om man inte kan undersöka den själv... Men fråga något så kan jag kolla. Jag har dock ingen multimeter hemma...)
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 »

ledsen? :verysad: hehe

Du sa att du aktiverar dem manuellt... är LEDsen kopplade till transistorerna? I så fall kan det vara något med den gruppens transistor som är skumt...

eller, nej... transistorerna sitter väl på processorkortet, och det är väl inte ens i närheten. :humm:
Kanske nån kortslutning eller kontaktproblem nånstans i så fall.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Mm...
Kretskortet är inte med i leken ännu.
Jag tar ett 9v batteri ett par resistorer och lite tråd.
Dessa lägger jag emot trådarna som sitter i ett rutnät till ledsen.
dragon9226
Inlägg: 144
Blev medlem: 8 september 2010, 14:26:12

Re: Val av microprocessor, RGB LED styrning

Inlägg av dragon9226 »

Nu har jag hittat felet och åtgärdat det.
Det var en led som var trasig, (den röda leden i en av dem).

Så nu ska alla grupper fungera.
Då blir det bara att fortsätta med de andra färgerna =)
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 även börjat knåpa lite på programmeringen.
Där har jag två funderingar:

Går det att spara en metod på det externa minnet? (Kommer inte ihåg om det heter metod i C...)
Så att man kan göra specifika för t.ex. bokstäver eller liknande. Som blir smidiga att anropa.

Jag funderade även lite på om man behöver definera alla pinnar? ex: #define BLUE2 (1<<PD2)
För om man inte använder de kommandot, och i stället använder PORTD = 0b111000;, behöver man fortfarande göra den definitionen?
Skriv svar