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
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).
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?
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
> 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 =
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?
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ß
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.