www.mikrocontroller.net

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


Autor: Dennis Goetz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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).

Autor: Dennis Goetz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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 =

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz

sag ich doch!!!

Autor: Dennis Goetz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Dennis Goetz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

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.