Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   AVR C Problem mit Schleife (https://www.delphipraxis.net/130786-avr-c-problem-mit-schleife.html)

Gehstock 13. Mär 2009 06:12


AVR C Problem mit Schleife
 
Code:
   DDRB = (1 << DDB1);       // PB1 als Ausgang
   DDRB &= ~(1 << DDB3);   // PB3 als Eingang
//   while PORTB = ~(1<<PB3); // wenn low
   if (!(PINB & (1 << PB3)))    // wenn PB3 geschlossen (HIGH)
   {
   PORTB = PORTB | (1 << DDB1);    //dann LED and PB1 An
   i++;                     //i um 1 erhöhen
   if (i = 15) i =0;            //wenn i = 15 dann i = 0
    while (1)                      // solange Button nicht gedrückt
   {launch_effect(i);}            //soll Effekt(i) in einer schleife laufen
}
   else
   PORTB = PORTB & ~(1 << DDB1);   //wenn button nicht gedrückt LED aus
   }

irgendwie blick ich da nicht durch was passieren soll hab ich kommentiert

der erste Effekt läuft zwar durch aber schon der Button hat keine Funktion mehr

[edit=mkinzler]Delphi-Tag durch C-Tag ersetzt Mfg, mkinzler[/edit]

R2009 13. Mär 2009 06:35

Re: AVR C Problem mit Schleife
 
Hi,

ich weiss nicht was du erreichen willst. Gib doch mal eine kurze Beschreibung was deine Routine machen soll oder macht.
Ich habe ehrlich gesagt keine Lust an einem Ratespiel teilzunehmen.
Da ich sehr viel mit uP's zu tun hab kann ich dir sicher helfen.

Zitat:

Code:
if (!(PINB & (1 << PB3)))   // wenn PB3 geschlossen (HIGH)

Ich glaube das funktioniert so nicht! Muss erst ausprobieren. Die Bedingung ist, glaub ich, falsch.
Probiers mal so:
Zitat:

Code:
if ((PINB & 0x08)==0)

Viel Spass!

[edit=mkinzler]C-Tags eingefügt Mfg, mkinzler[/edit]

Gehstock 13. Mär 2009 06:41

Re: AVR C Problem mit Schleife
 
Soll eigendlich nichts anderes tun wie schon in den Kommentaren erwähnt

Programm soll bei effekt 0 Starten und das solange bis
-button an PB3 gedrückt wird (LOW weil gegen GND?)

dann
-soll kurz die LED an PB1 Leuchten
- i um eins erhöht werden (wenn i = 15 ist dann wieder zurück zu 0)

und dann wieder der Effekt(i) in einer schleife ablaufen bis der Button erneut betätigt wird
die LED an PB1 ist in diesen Zustand aus

jbg 13. Mär 2009 08:57

Re: AVR C Problem mit Schleife
 
Zitat:

Code:
if (i = 15) i =0;           //wenn i = 15 dann i = 0

Bist du dir sicher, dass du "i = 15" und nicht "i == 15" meinst?


Zitat:

Code:
while (1)

Da läuft die Schleife aber ziemlich lange, denn 1 ist immer ungleich 0 und damit True.

divBy0 13. Mär 2009 09:42

Re: AVR C Problem mit Schleife
 
Ich glaube nicht, dass wenn die While-Schleife einmal läuft, der µC noch was anderes ausführt. Der müsste dann eigentlich in der Schleife festhängen.

Eingentlich brauchst du doch für launch_effect gar keine eigene Schleife. Das ganze Programm läuft doch immer im Kreis (zyklisch), sollte es zumindest.

In der Hauptschleife ließt du die Eingänge ein, ist die Taste gedrückt zählst du I hoch, dann rufst du launch_effect mit I auf. Solange niemand die Taste drückt läuft das gleiche Programm.

Gehstock 15. Mär 2009 12:47

Re: AVR C Problem mit Schleife
 
Habs jetzt so geändert tut auch fast was es soll

Code:
int main (void)
{
int i = 0;
   ioinit();
   bootmsg();
   current_layer = 0x00;// Bei unterster Ebene starten
   sei();
   while (1)// Haupt programm loop.
   {
    while (!(PINB & (1 << PB3)))// wenn taster an
           {   
      PORTB = PORTB | (1 << DDB1);//LED an
      i = i++; //und I erhöhen
            if (i == 15) i = 0;
           }
           launch_effect(i);
           PORTB = PORTB & ~(1 << DDB1);// LED aus
         }
}
außer das nach dem lösen des tasters zwar die LED wieder ausgeht aber das programm gar nicht läuft(launch_effect)

divBy0 15. Mär 2009 13:10

Re: AVR C Problem mit Schleife
 
Hi!

Warum hast du denn überhaupt die 2. while-Schleife? Vielleicht verstehe ich ja falsch, was du vor hast.

Jetzt ist es ja so, dass solange die Taste gedrückt ist, die LED leuchtet und i hochgezählt wird.

Dafür müsste eigentlich eine if-Abfrage besser sein. Wenn Taster gedrückt, dann LED ein, i hochzählen...
Da das Hauptprogamm in einer Schleife läuft wird i auch weiter erhöht, wenn die Taste gehalten wird.

EDIT: Wie ist denn lauch_effect aufgebaut?

Gehstock 15. Mär 2009 13:16

Re: AVR C Problem mit Schleife
 
ja hatte ich unterdessen auch geändert Problem ist jetzt noch das der Taster manchmal mehrere sekunden gehalten werden muss bevor die LED angeht bzw. i erhöht wird und nach dem lösen die LED wieder für mehrere sekunden brennnt

ich hab fast das Gefühl das die CPU überlastet ist weil die Dauer je nach Aufwand für den Effekt variiert

divBy0 15. Mär 2009 13:20

Re: AVR C Problem mit Schleife
 
Das ist klar, wenn launch_effect eine lange Laufzeit hat, dann reagiert auch die Taste und die LED träge.

Welchen µC setzt du denn eigentlich ein?

Gehstock 15. Mär 2009 13:25

Re: AVR C Problem mit Schleife
 
ATMega16-16 @14 MHz

Muetze1 15. Mär 2009 13:27

Re: AVR C Problem mit Schleife
 
Code:
int lEffect = 0;
int lKeyReset = 0;

DDRB = _BV(DDB1);    // PB1 als Ausgang, alles andere ist automatisch Eingang

while (1)
{
  launch_effect(lEffect);

    // Button?
  if ( PINB & _BV(PB3) )
  { 
      // Entprellung? 
    if ( !lKeyReset )
    {
        // Effekt erhöhen
      lEffect = (lEffect+1) % 16;

        // LED an
      PORTB |= _BV(PB1);

        // 16 Zyklen lang keine Tasten akzeptieren
      lKeyReset = 16;
    }
  }
 
  if ( lKeyReset )
    lKeyReset--;
  else
    PORTB &= ~_BV(PB1);
}
Da du mit jedem Durchlauf die Taste abfragst und der MC nicht gerade langsam ist, dreht der Kilometer mit der Effektvariable bis du die Taste nach einer (für ihn) Ewigkeit wieder loslässt. Der Code macht das wie du es beschrieben hast, aber akzeptiert x Durchläufe (lKeyReset, derzeit 16) keinen erneuten Tastendruck. Dieser Wert wird gleichzeitig dafür genutzt die LED leuchten zu lassen, sonst sieht man nichts, weil der MC zu schnell ist. Wenn nach Ablauf dieser 16 Zyklen die Taste immernoch gedrück ist, dann erhöht erneut um 1 (bis max. 15, danach auf 0).

divBy0 15. Mär 2009 13:28

Re: AVR C Problem mit Schleife
 
Ok, dann musst du die Effektroutine mal überarbeiten. Die arbeitet wahrscheinlich auch mit einer Schleife, oder?

Muetze1 15. Mär 2009 13:32

Re: AVR C Problem mit Schleife
 
Ok, nach den letzten Posts zu urteilen wird falsch gearbeitet. Entweder sollte dein Effekt schleunigst in die ISR eines Timers oder du machst die Tastenabfrage in einem Timer. Ersteres wäre die deutlich bessere Wahl. Und das zu programmieren ist mit dem WinAVR eine Sache von Sekunden...

Gehstock 15. Mär 2009 13:37

Re: AVR C Problem mit Schleife
 
Danke schau ich mir mal an hab ja erst angefangen damit zu spielen


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz