Forum: Mikrocontroller und Digitale Elektronik if-Abfrage funktioniert nicht....


von Dennis Goetz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein C-File angehängt, welches bei jedem Timer0-Interrupt eine
AD-Wandlung an zwei Pins durchführt. Die Ergebnisse werden zuerst
verglichen und mittels PB5 und PB6 angezeigt, welches die größere
Spannung ist.
Wenn ich jetzt den auskommentierten Teil in der ISR mit dazunehme, dann
produziert der Tiny nur noch Mist. Z.B. leuchten beide LEDs (PB5 und
PB6) zusammen auf, was ja eigentlich gar nicht sein dürfte. Ach ja, ich
betreibe den Tiny mit dem internen RC-Oszillator, sodass ich PB5 und PB4
als I/O-Ports verwenden kann.

Vielleicht fällt jemandem was grundlegend Falsches auf, aber ich seh so
langsam nichts mehr, was ich ändern könnte....!  :-(

Greets, Dennis

von Karl H. (kbuchegg)


Lesenswert?

Wie sind die LED's beschaltet?

Wenn Du eine standard-Beschaltung hast, dann leuchten die
wenn der entsprechende Port-Pin auf 0 liegt.

  if(Wert1<temp)
  {
    PORTB=(1<<PB4);
  }

Wenn das hier zutrifft, dann wird am PORTB nur das
Bit 4 gesetzt (deren LED ist dann dunkel) und alle
anderen Bits auf 0 (und deren LED leuchtet).

von Dennis Goetz (Gast)


Lesenswert?

Ja, das ist mir klar, aber, wie schon erwähnt, ohne den auskommentierten
Teil läuft der Rest einwandfrei, aber sobald der Teil mitcompiliert wird
und auf dem Tiny läuft, ist auch der vorher korrekt laufende Teil
fehlerhaft. Kann das vielleicht an der Länge der Konstanten, bzw.
Variablen liegen, dass da vielleicht Speicherbereiche doppelt
beschrieben werden, bzw, da einfach was kollidiert?

von seacrash (Gast)


Lesenswert?

Hallo, probier mal folgendes:


if(Wert1<=Wert2)
{
PORTB |=(1<<PB6);
PORTB &=~(1<<PB5);
}
else
{
PORTB |=(1<<PB5);
PORTB &= ~(1<<PB6);
};

if(Wert1<temp)
{
PORTB|=(1<<PB4);
}
else
{
PORTB&=~(1<<PB4);
};


//Gruß seacrash

von Karl H. (kbuchegg)


Lesenswert?

> aber sobald der Teil mitcompiliert wird
> und auf dem Tiny läuft, ist auch der vorher korrekt
> laufende Teil fehlerhaft.

Was ist daran fehlerhaft?

Die erste if-Abfrage setzt einen Zustand am Port.
Dann kommt die zweite if-Abfrage. Die setzt einen
neuen Zustand. Und dieser neue Zustand ist nun mal
so, dass da 2 LED-s leuchten. Zwischen den beiden
if-Abfragen vergehen grade mal ein paar µSekunden (je
nach Takt). Das da zunaechst nur eine LED leuchtet
und erst dann durch die 2-te if-Abfrage 2 LEDS zum leuchten
gebracht werden, wirst du nicht sehen koennen. Das geht
viel zu schnell.

Ich denke, da liegt ein Missverstaendniss auf Deiner Seite vor.

Waehrend
   PORTB &= ~(1<<PB5);   /* Bit loeschen */

tatseachlich nur das eine Bit (in dem Fall PB5) beeinflusst,
wird durch

   PORTB=(1<<PB4);

der komplette Port neu besetzt. Wenn DU nur das Bit 4 setzen
moechtest, dann musst Du natuerlich den alten Zustand des
Ports ins Kalkuel ziehen:
   PORTB |= (1<<PB4)

|=  und nicht =

von seacrash (Gast)


Lesenswert?

@Karl Heinz

sag ich doch!!!

von Dennis Goetz (Gast)


Lesenswert?

Ja, das habe ich auch bemerkt und gleich geändert. Natürlich muß das |=
heißen, und nicht nur =. Allerdings bewirkt die Änderung auch nicht,
dass der (im Anhang oben) auskommentierte Teil nicht läuft. Der Effekt
ist (natürlich nach der Änderung der SetBit-Operation), dass auch die
oberen if-Abfragen nicht mehr funktionieren. Es leuchtet eine LED,
egal, was am ADC-Port anliegt.
Noch kurz zur Funktion der zweiten if-Abfrage: Sie soll lediglich dazu
dienen, eine Überschreitung des Wert1 ODER des Wert2 über einen festen
Wert zu detektieren. Und als Aktion soll eben die LED am Port PB4
leuchten.

Noch irgendjemand eine Idee?

von seacrash (Gast)


Lesenswert?

Dennis,

du rufst die Funktion ReadChannel
so:
Wert1 = ReadChannel();

und so
Wert2 = ReadChannel((1<<MUX0));

auf. Beim ersten Aufruf fehlt ein int als Übergabeparameter.

...

Gruß

von Dennis Goetz (Gast)


Lesenswert?

Oh Mann, klar. Das ist der Fehler!!! Ich sagte doch, so langsam sehe ich
 gar nichts mehr und finde vor allem keine Fehler!!!

Vielen Dank, jetzt läuft es! Aber ich befürchte, es war nicht das
letzte Mal, dass ich hier gepostet habe....!  ;-)

Viele Grüße,
Dennis

von seacrash (Gast)


Lesenswert?

:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.