Sida 14 av 23

Re: Val av microprocessor, RGB LED styrning

Postat: 10 december 2010, 10:31:00
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 10 december 2010, 10:46:05
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 12:05:58
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?

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 12:23:21
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

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 13:04:57
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".

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 13:15:38
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 14:34:54
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?

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 14:56:41
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

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 15:40:30
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

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 17:43:33
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 18:09:15
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...)

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 18:17:19
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 11 december 2010, 19:21:56
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.

Re: Val av microprocessor, RGB LED styrning

Postat: 13 december 2010, 18:26:07
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 =)

Re: Val av microprocessor, RGB LED styrning

Postat: 14 december 2010, 08:04:19
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?