www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED blinken lassen per Taster


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte gerne eine LED blinken lassen, sollange der Taster gedrückt 
ist:
    if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
      {
        PORTC |= (1 << PC0);        // LED an PB0 umschalten
        _delay_ms (200);
        PORTC &= ~(1 << PC0);        // LED an PB0 umschalten
        _delay_ms (200);
      }

Kann man das irgendwie eleganter lösen?
So in etwa das man in einer Zeile definiert das sich der letzte Zustand 
ändern soll.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum liest du nicht einfach mal die Artikel, die dir angeboten werden?

http://www.mikrocontroller.net/articles/Bitmanipul...

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
  {
    PORTC ^= (1 << PC0);        // LED an PB0 umschalten
    _delay_ms (200);
  }
PORTC &= ~(1 << PC0);        // LED an PB0 ausschalten (high-aktiv)
//PORTC |= (1 << PC0);        // LED an PB0 ausschalten (low-aktiv)

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups.... Mist...
while(1)
{
  if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
    {
      PORTC ^= (1 << PC0);        // LED an PB0 umschalten
      _delay_ms (200);
    }
  PORTC &= ~(1 << PC0);        // LED an PB0 ausschalten (high-aktiv)
  //PORTC |= (1 << PC0);        // LED an PB0 ausschalten (low-aktiv)
}

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh... noch ein Fehler:
if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH

Die Bedingung ist erfüllt, wenn der Pin auf LOW liegt !

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Magnetus schrieb:
> Ups.... Mist...
>
>
> while(1)
> {
>   if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
>     {
>       PORTC ^= (1 << PC0);        // LED an PB0 umschalten
>       _delay_ms (200);
>     }
>   PORTC &= ~(1 << PC0);        // LED an PB0 ausschalten (high-aktiv)
>   //PORTC |= (1 << PC0);        // LED an PB0 ausschalten (low-aktiv)
> }
> 

Das wird allerdings ein kurzes 'Blinken' wenn die Taste gedrückt wird. 
Ich bezweifle, dass man das sehen wird. Kein Mensch kann eine LED, die 
nur µs auf 'aus' geht, von einer durchgehend leuchtenden LED 
unterscheiden :-)

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert so nicht.
Die Schleife wird ja nie verlassen sollange die Taste gedrückt wird.
Somit auch kein blinken.

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok... noch ne Korrektur:
while(1)
{
  if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
    {
      PORTC ^= (1 << PC0);        // LED an PB0 umschalten
      _delay_ms (200);
    }
  else
    {
      PORTC &= ~(1 << PC0);        // LED an PB0 ausschalten (high-aktiv)
      //PORTC |= (1 << PC0);        // LED an PB0 ausschalten (low-aktiv)
    }
}

Solange die if-Bedingung erfüllt ist, wird die LED im 1/5 Sekunden Takt 
getoggled. Wenn nicht erfüllt, wird sie halt ausgeschaltet.

Die Endlosschleife hab ich drumrum gesetzt, damit hier überhaupt eine 
wiederkehrende Aktion ausgeführt werden kann.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch damit gehts nicht.
Gleicher Effekt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann zeig dein Programm und achte darauf, dass die Kommentare richtig 
sind.

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie sieht der "Effekt" aus?

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED leuchtet ständig bei gedrückter Taste.
  if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
    {
      PORTC ^= (1 << PC0);        // LED an PC0 umschalten
      _delay_ms (200);
    }
PORTC = 0;

So gehts aber:
    if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
      {
        PORTC |= (1 << PC0);        // LED an PC0 umschalten
        _delay_ms (200);
        PORTC &= ~(1 << PC0);        // LED an PC0 umschalten
        _delay_ms (200);
      }
PORTC = 0;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Die LED leuchtet ständig bei gedrückter Taste.
>
>   if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
>     {
>       PORTC ^= (1 << PC0);        // LED an PC0 umschalten
>       _delay_ms (200);
>     }
> PORTC = 0;
> 

Logisch.
Von Magnetus gabs ja auch noch ein Update, welches das Problem behebt.
Im Übrigen solltest du tatsächlich verstehen, warum es da überhaupt ein 
Problem gibt.

>
> So gehts aber:
>
>
>     if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
>       {
>         PORTC |= (1 << PC0);        // LED an PC0 umschalten
>         _delay_ms (200);
>         PORTC &= ~(1 << PC0);        // LED an PC0 umschalten
>         _delay_ms (200);
>       }
> PORTC = 0;
> 

womit wir wieder am Anfang wären :-)

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Von Magnetus gabs ja auch noch ein Update, welches das Problem behebt.
>
> Im Übrigen solltest du tatsächlich verstehen, warum es da überhaupt ein
>
> Problem gibt.

Weil sich der Status von PortC nie ändert.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:

> Ja, weil die Schleife nie verlassen wird bei gedrückter Taste.

Welche Schleife?
Da ist keine Schleife!

Ein 'if' ist eine bedingte Verzweigung aber keine Schleife.

ALso noch mal die Frage:
Warum 'blinkt' in diesem Beispiel die LED nicht bei gedrückter Taste?
  ...

  while( 1 ) {
    if(!(PINB & 0x01))                // Wenn Taste PortB.0 auf HIGH
    {
      PORTC ^= (1 << PC0);        // LED an PC0 umschalten
      _delay_ms (200);
    }
    PORTC = 0;
  }

arbeite das Programm mit dem Finger auf den Programmzeilen durch und 
spiele Computer.

(Tatsächlich blinkt die LED schon. Aber sie ist 200ms auf ein und ein 
paar µs auf aus. Zu kurz auf aus, als das man das sehen könnte. Mit 
einem Oszi würde man das allerdings detektieren können. Von daher ist 
die Aussage 'blinkt nicht' nicht zu halten. "Ergibt kein sichtbares 
blinken" würde die Sache eher beschreiben. Aber wir wollen jetzt keine 
Haare spalten)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
>
> Weil sich der Status von PortC nie ändert.

Wenn das tatsächlich deine Antwort ist (die vorher noch anders gelautet 
hat), dann kann ich nur sagen:
Such dir ein anderes Hobby. Du hast offenbar nicht das Zeug, das man 
benötigt um zu programmieren. Das ist nichts Schlechtes und auch nicht 
abwertend gemeint. Viele Leute haben nicht das Zeug dazu. Sie können es 
einfach nicht. Das ist so, wie manche Männer beim Bund beim Marschieren 
einfach nicht den Schritt halten können.
Deswegen ist man nicht dumm oder so etwas.
Programmieren ist ganz einfach nicht das, was dir liegt oder jemals 
liegen könnte. Du wirst es immer nur als Qual empfinden.

Autor: Manfred W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Du wirst es immer nur als Qual empfinden.

Ich quäl mich gerne :)

Autor: bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nunja wenn man bestimmte Controller zugrunde legt, dann geht schon dass 
man Bits "togglen" kann egal welchen Zustand sie vorher hatten, aber 
welchen Zustand soll denn der Blinker bekommen wenn die Taste nicht 
länger gedrückt wird?

Bei neueren Atmels bewirkt ein Schreiben einer logischen 1 auf den "PIN" 
Port dass selbiger Ausgang den Zustand wechselt.

Nachdem hier nicht bekannt ist in welcher Umgebung sich das ganze 
abspielt bleibt wohl nur das konventionelle Setzen von 0/1.

Aber das alles steht ja schon in dem Artikel den Karlheinz in der 1. 
Antwort genannt hat.

Autor: Kryptik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main(void)
{
  DDRC = 0xFF

  while(1)
  {
    if(PINB != 0xFF)
    {
      PORTC = 0;
      _delay_ms(255);
      PORTX = 255;
      _delay_ms(255);
    }
    PORTC = 0xFF;
  }
return 0;
}


Ich hoffe das, dass richtig ist,weil ich hab heut erst mit 
programmierung angefangen.
Falls es falsch ist verbessert mich bitte oder löscht es irgendwie raus.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kryptik schrieb:
int main(void)               // besser "void main(void)" (siehe unten)
{
  DDRC = 0xFF                // Hier fehlt ein Semikolon

  while(1)
  {
    if(PINB != 0xFF)
    {
      PORTC = 0;
      _delay_ms(255);        // Sowas macht man nicht mit Delay
      PORTX = 255;           // PORTX gibt es sicherlich nicht.
      _delay_ms(255);
    }
    PORTC = 0xFF;            // PORTC ist bereits 0xFF, also sinnlose Zeile
  }
return 0;                    // Main wird nie Verlassen also sinnlos.
}

Btw: Was für ein Prozessor?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian H. schrieb:

> int main(void)               // besser "void main(void)" (siehe unten)
> {

nicht ganz.
int main ist schon richtig.
So ist das im C-Standard vorgeschrieben, und so sollte man das auch 
machen. Im C Standard gibt es ein paar erlaubte Formen für main(). Sie 
unterscheiden sich in den Argumenten. Gemeinsam ist ihnen aber allen, 
dass sie einen int retournieren.
Wenn in einem freestanding Environment der Returnwert keinen Sinn macht, 
dann weiß das der Compiler, der auch um die Sonderrolle von main weiß 
und baut sich das entsprechend zurecht.

Autor: Kryptik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein STK500 mit einem ATMEGA32 Prozessor.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger:

Klar, kann man beides machen.
In einem PC-Programm ist "int main(void)" aber auch nicht 100%ig 
korrekt. Es müsste "int main(int argv, char **argc)" heißen, obwohl 
viele Compiler auch was anderes annehmen.

Ich mache es aber trotzdem bei einem µP so, da damit erkennbar ist, dass 
main keine Rückgaben hat. Dass der Compiler auch die andere Variante 
versteht und dann alles unnötige Weboptimiert, ist löblich.

Das ist in diesem Fall aber nur Kosmetik. Ansonsten stimmt ich Dir zu.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kryptik schrieb:
> Das ist ein STK500 mit einem ATMEGA32 Prozessor.

Dann gibt es wirklich keinen "PORTX".

Autor: Kryptik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh da hab ich mich vertippt sollte PORTC sein und danke das Semikolon 
hab ich vergessen jetz funktionierts auch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian H. schrieb:
> @Karl heinz Buchegger:
>
> Klar, kann man beides machen.

Nein.
Der springende Punkt ist:
man kann eben nicht.
Der Returnwert von main() ist immer int!

Wenn einzelne Compiler void main() akzeptieren, bedeutet das noch lange 
nicht, dass es deswegen korrekt ist.

> In einem PC-Programm ist "int main(void)" aber auch nicht 100%ig
> korrekt.

doch, ist es

> Es müsste "int main(int argv, char **argc)" heißen, obwohl
> viele Compiler auch was anderes annehmen.

Im C-Standard steht explizit, welche Formen von main() erlaubt sind.
Wenn du mir nicht glaubst, dann lies im Standard nach.
Diese, und nur diese, Formen von main sind richtig.
Anders als bei anderen Funktionen steht es dir als Programmierer nicht 
zu, dich darüber hinwegzusetzen. In einem freestanding Environment wirst 
du damit durchkommen, weil main im Regelfall nie retourniert. Hast du 
aber ein Runtimesystem, so schreibt dir dieses vor, wie es den Aufruf 
machen wird und es liegt nicht in deiner Macht dies zu ändern. Der 
Compiler kennt aber sowohl den Aufruf als auch die Argumentliste in 
deinem main und kann das anpassen.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Im C-Standard steht explizit, welche Formen von main() erlaubt sind.

Kommt drauf an, welchen Standard du meinst. In C99, ist das korrekt 
(habe gerade nachgeschaut).
Ich kenne aber noch die älteren Standards (hatte mit K&R angefangen). In 
C90/C95 war "void main()", soweit ich auf die Schnelle sehen kann, noch 
in Ordnung (oder gar einfach "main()").

Einigen wir uns darauf, dass ich teilweise noch nach pre-C99 
programmiere.
Da ich zur Zeit C nur für µP nutze (und das auch nicht intensiv), ist 
mir das wohl noch nicht aufgefallen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian H. schrieb:

> Kommt drauf an, welchen Standard du meinst. In C99, ist das korrekt
> (habe gerade nachgeschaut).
> Ich kenne aber noch die älteren Standards (hatte mit K&R angefangen). In
> C90/C95 war "void main()", soweit ich auf die Schnelle sehen kann, noch
> in Ordnung (oder gar einfach "main()").

OK. Jetzt gehen wir in Haarspalterein, drum wird das auch mein letzter 
Beitrag zum Thema:
Nein, in keinem ISO Standard war void main() je erlaubt.
Zu K&R Zeiten gab es noch keinen Standard und es herrschte Wildwuchs. 
Dann kamen die Microsoft Compiler, die in ihren Dokubeispielen überall 
void main() benutzten. Von da an war void main() nicht mehr zu halten 
und verbreitete sich rasend schnell, obwohl es schon längst einen 
Standard gab.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne aber noch die älteren Standards (hatte mit K&R angefangen). In
C90/C95 war "void main()", soweit ich auf die Schnelle sehen kann, noch
in Ordnung (oder gar einfach "main()").

war es nicht so das ein main() ebend kein void main() sondern ein int 
main() bedeutet hat?
Mir mar so ewas in erinnerung das jede variable( funktion ) ohne 
Datentyp als int angenommen wird (worden ist).

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ok.
Habe ich ja schon gesagt, ich war wohl falsch informiert. Ich mache es 
so, wie ich geschrieben habe, schon länger und der gcc hat es nie 
angemeckert.

Ob K&R ein Standard war oder nicht, ist nebensächlich.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich konnte das Problem inzwischen mit Hilfe von einigen Leuten hier so 
lösen:
  cntTicks++;
  if(cntTicks == nFireTime)                  // Ist Variable <nFireTime> mal 10ms
  {
    repeatFire ^= 0x01;                      // Wechselt PortC.0 nach Zeit von 0 auf 1
    cntTicks = 0;
  }
Das ganze läuft nun als Timer Interrupt und wird daher permanent 
getoggelt.

Mein problem zur Zeit ist jedoch immer noch, das ich nicht weiß wie ich 
das Togglen nur bei gedrückter Taste in zusammenhang mit meiner 
Portbeschaltung auslöse.

Wie ich schon in einem anderen Beitrag gepostet habe, wird anhand einer 
Tabelle ein Eingang einen bestimmten Ausgang zugeordnet:
#define NR_KONFIGS    9
#define NR_KEYS      6

uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] PROGMEM =
  {
    {LED0,LED1,LED2,LED3,LED4,LED5},          // Konfiguration 0
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 1
    {LED0,LED0,LED4,LED1,LED3,LED5},          // Konfiguration 2
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 3
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 4
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 5
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 6
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 7
    {LED0,LED2,LED4,LED1,LED3,LED5},          // Konfiguration 8
   };

Aufgerufen wird das ganze dann per Tastendruck:
  while(1)
  {
    Summe = 0;

    if(!(KEY_PIN & 0x01))                  // Wenn Taste PortB.0 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);
    if(!(KEY_PIN & 0x02))                  // Wenn Taste PortB.1 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][1]);
    if(!(KEY_PIN & 0x04))                  // Wenn Taste PortB.2 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][2]);
    if(!(KEY_PIN & 0x08))                  // Wenn Taste PortB.3 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][3]);
    if(!(KEY_PIN & 0x10))                  // Wenn Taste PortB.4 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][4]);
    if(!(KEY_PIN & 0x20))                  // Wenn Taste PortB.5 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][5]);

    if(nFire != 0)
    { 
      OUT_PORT = Summe | repeatFire;
    }
    else
    {
      OUT_PORT = Summe;
    }

In der momentanen Situation wird das Toggeln sofort ausgelöst sobald die 
Variable nFire auf 1 ist.
Was ich jedoch gerne hätte ist das der Zustand nur bei gedrückter Taste 
ausgelöst wird.

Leider komme ich da nicht ohne Hilfe weiter.
Vielleicht erbarmt sich ja jemand um Vorschläge, Tips, ...

danke!

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte noch vergessen zu erwähnen um welchen AVR es geht. Da die Frage 
hier gestellt wurde.
Es ist ein ATMEGA8 der mit 1MHz getaktet wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:

> Was ich jedoch gerne hätte ist das der Zustand nur bei gedrückter Taste
> ausgelöst wird.

Was hindert dich daran, die Bedingung im if zu erweitern, sodass 
'gedrückte Taste' mit berücksichtigt wird?

Dauerfeuer soll also dann stattfinden

   wenn( ( nfire ungleich 0 ) UND ( Taste gedrückt ) )

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Dauerfeuer soll also dann stattfinden
>
>
>
>    wenn( ( nfire ungleich 0 ) UND ( Taste gedrückt ) )

Das "Taste gedrückt" ist das Problem.
Die wird oben schon abgefragt:
    if(!(KEY_PIN & 0x01))                  // Wenn Taste PortB.0 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);

Das können ja mehrere sein und vor allem auch gleichzeitig.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Karl heinz Buchegger schrieb:
>> Dauerfeuer soll also dann stattfinden
>>
>>
>>
>>    wenn( ( nfire ungleich 0 ) UND ( Taste gedrückt ) )
>
> Das "Taste gedrückt" ist das Problem.
> Die wird oben schon abgefragt:
>
>
>     if(!(KEY_PIN & 0x01))                  // Wenn Taste PortB.0 auf
> HIGH
>       Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);
> 
>
> Das können ja mehrere sein und vor allem auch gleichzeitig.

Schon.
Aber nur eine davon wird die Feuertaste sein.
Und die fragst du halt noch ein 2-tes mal ab.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Aber nur eine davon wird die Feuertaste sein.
>
> Und die fragst du halt noch ein 2-tes mal ab.

Im Prinzip ja, aber die kann je nach ausgewählter Konfiguration 
variieren.
Der Ausgang ist immer gleich. Die Feuertaste selbst nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Karl heinz Buchegger schrieb:
>> Aber nur eine davon wird die Feuertaste sein.
>>
>> Und die fragst du halt noch ein 2-tes mal ab.
>
> Im Prinzip ja, aber die kann je nach ausgewählter Konfiguration
> variieren.

Sogar dir hätte ich jetzt schon zugetraut, dass du eventuell auf die 
Idee kommen könntest, das man sich dann halt bei der jeweiligen 
Konfiguration einen Eintrag macht, der das beschreibt.
Schliesslich werden ja auch je nach Konfigration andere LEDs geschaltet


Es ist zum Haare raufen :-)

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht ärgern...

In etwa so?
    if(!(KEY_PIN & 0x01))  &&  (nFire != 0)     // Wenn Taste PortB.0 auf HIGH und Dauerfeuer aktiv
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]) | repeatFire;
    if(!(KEY_PIN & 0x01))                  // Wenn Taste PortB.0 auf HIGH
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);
Zwei Abfragen pro Taste?

Hab da eh schon herumprobiert.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das geht ja auch nicht.
Wenn dann müßte es so heißen:
    if(!(KEY_PIN & 0x01))  &&  (nFire != 0)     // Wenn Taste PortB.0 auf HIGH und Dauerfeuer aktiv
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]) | repeatFire;
    if(!(KEY_PIN & 0x01))  &&  (nFire != 1)    // Wenn Taste PortB.0 auf HIGH und Dauerfeuer nicht aktiv
      Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann man eine Definition mit einer Variable deklarieren die sich ständig 
ändert?

Denn dann würde ich das so machen:
#define LED0      repeatFire

uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] PROGMEM =
  {
    {LED0,LED1,LED2,LED3,LED4,LED5},            // Konfiguration 1
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 2
    {LED1,LED0,LED3,LED2,LED4,LED5},            // Konfiguration 3
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 4
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 5
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 6
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 7
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 8
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 9
   };

ISR(TIMER0_OVF_vect)
{
  cntTicks++;
  if(cntTicks >= nFireTime)                  // Ist Variable <nFireTime> mal 10ms
  {
    repeatFire ^= 0x01;                    // Wechselt PortC.0 nach Zeit von 0 auf 1
    cntTicks = 0;
  }
}

Dann würde bei Tastendruck der Ausgang PortC.0 auch blinken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.