Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr.
Seite 1 von 2  1 2      

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