wie in code zu realisieren?

Gast #145897
Lesenswert?

ich habe ein problem bei einem dimmer ( unter c)
ich versuche 8 lampen paralell zu dimmen.

ich lese helligkeitswerte für alle lampen ein sowie ihren zustand ob
an(gedimmt) oder aus.

jetzt muss ich die werte der helligkeit sortieren. der höchste
(dimm)wert wird als ersten angeschaltet. davon abgezogen der
zweithöchste (dimm)wert...(usw).
jetzt habe ich jedoch das prob, das ich dabei die ausgabe nicht mehr
auf der angestrebten pin rausschiebe, sondern der höchste auf den
ersten, den nächsten auf den zweiten,...

kann mir jemand bei diesem problem in allgemein gehaltenem code (egal
welcher uc) helfen? denn bei meinen recherchen habe ich gemerkt, das
nahezu alle bei denen das projekt gescheitert ist, das selbe prob
haben.

vielen dank im vorraus
mfg
tüddel
Gast #145898
Lesenswert?

>jetzt muss ich die werte der helligkeit sortieren.

Aha. Und wieso?

>der höchste(dimm)wert wird als ersten angeschaltet. davon abgezogen
>der zweithöchste (dimm)wert...(usw).

Keine Ahnung was das heissen soll: "davon abgezogen ...".
Soll das jetzt der Sortieralgorithmus sein oder was?

>jetzt habe ich jedoch das prob, das ich dabei die ausgabe nicht mehr
>auf der angestrebten pin rausschiebe, sondern der höchste auf den
>ersten, den nächsten auf den zweiten,...

Wenn ich Deinen wirren Worten folgen kann, soll das heißen, nachdem Du
die Dimmwerte sortiert hast, liegt auf dem ersten Pin immer die hellste
Lampe, auf dem zweiten Pin die zweithellste, usw.
Das willst Du aber offenbar nicht. Habe ich das richtig verstanden?

Fragen:
Wie dimmst Du die Lampen eigentlich? Per PWM?
Welchen Mikrocontroller benutzt Du?
Und wieso willst Du die Helligkeitswerte sortieren?

Gib mal ein paar genauere Informationen.


Jochen
Gast #145900
Lesenswert?

@Jochen Pernsteiner

ich benutze eine phasenabschnittssteuerung.

ich sortiere die helligkeitswerte (da ich ja nicht parallel arbeiten
kann), da ein heller wert vor einem dunklerem wert gezündet wird.
hell = langer-, dunkler = kurzer abschnitt. ;-)

das hat zwar nichts mit dem uc zu tun, nennen tu ich ihn aber mal ;-)
msp430f1x9 oder msp430x1x1x (takung: 8MHz)

ist das besser?
Gast #145901
Lesenswert?

//Timerroutine
static unsigned char i;

i++;

if (i < lampe_1_soll)
{
PORT_X = 0; //Lampe aus
}
else
{
PORT_X = 1; //Lampe an
}
...

wenn die Lichtwerte in einem Array vorliegen:

static unsigned char i;
unsigned char j;

i++;
for (j=0;j<8;j++)
{
if (i < lampe_soll[j])
PORT_aus;
else
PORT_ein;
dieser kleine Vergleich kann durchaus im Hauptprogramm laufen. Wenn
nicht, Timeroverflow auf ca. 10KHz stellen. Das sind immer noch ca. 50
Updates pro Sekunde.

MW
Gast #145902
Lesenswert?

Hi Leute

Mein Vorschlag: Eine Struktur, die Pin und Zeit speichert. Daraus baust
du dir ein Array mit einem Element pro Dimmer.

struct Dimmer {
  unsigned int port;    // uC-Port
  unsigned int mask;    // Maske für Pin (port &= mask;)
  unsigned short time;  // Zünd-Zeitpunkt (oder was auch immer)
};

struct Dimmer aDimmer[ANZ_DIMMER];

Sortieren brauchst du das Array beim Aufstarten oder wenn sich ein
Zeit-Wert ändert.

FG

Tom
Gast #145903
Lesenswert?

ich würde es auch mit einem struct machen

typedef struct dimmer
{
  byte port;               // port // byte = unsigned char
  byte data;               // wert den die dimmung erhalten soll
  byte stelle;             // 0-7 (schätze ich) um festzulegen wer als

                           // erstes , zweites, drittes,...
                           // gezündet werden soll
  unsigned int fire;       // uint zum zündzeitpunkt zu bestimmen
  BOOL aktiv;              // ist port "an" oder "aus"
}dimmer;

sind natürlich noch einige funktionen zum z.b. sortioeren uä nötig.
frage ist nur, ob der das noch von der rechenleistung her schafft

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren