Hallo zusammen!
Ich habe folgendes Problem: Ich möchte externe Interrupts über INT0 und
INT1 (4,7KOhm Pull-Down) bei einem ATMEGA8 einlesen. Das funktioniert
auch, jedoch scheinen beide Interrupts zu reagieren, wenn an nur einem
der Beiden einen steigende Flanke anliegt. Die Schaltung kann es nicht
sein, da ich nur einen Taster habe, und diesen zum Probieren immer an
den jeweiligen Pin hänge. Hat evt. jemand eine Idee woran es liegen
könnte? Der Code ist im Anhang. Ich bitte um Hilfe.
MfG Ronald
Bleiben da Taster drann?
Wenn ja: Taster liest man nicht mit Interrupts ein.
Schau dir den Atrikel Entprellung im Wiki an. Dort findest du
genügend Ideen, wie man Tasten zuverlässig einliest.
Taster schliesst man auch nicht so an, dass sie gegen Vcc schalten,
sondern so dass sie gegen Masse schalten. Dann kann man den internen
Pullup Widerstand benutzen und braucht keinen externen zusätzlichen
Widerstand
Für die Grundlagen des Tasteranschlusses, siehe AVR-Tutorial. Das
Kapitel über I/O
Für die C-Grundlagen siehe AVR-GCC-Tutorial
Und was du da mit dem Komma machst ... das ist doch unnötiger Unsinn.
Nimm einfach alle Zahlen mal 2, dann hast du eine 'Kommastelle' die nur
5 oder 0 sein kann.
Anstelle von 20 Grad speicherst du dir intern den Zahlenwert 40.
Anstelle von 20.5 Grad, dann eben 41, 21 Grad sind der Zahlenwert 42
usw.
Für Anzeigezwecke zerlegst du dann den Zahlenwert wieder
Oder meinetwegen, wenn dir der ?: Operator noch unheimlich ist
1
if(Temperatur_Soll%2==0)
2
sprintf(buf,"%2d.0C",Temperatur_Soll/2);
3
else
4
sprintf(buf,"%2d.5C",Temperatur_Soll/2);
Aber dadurch, dass du ein intern einfach nur ein geeignet gewähltes
Vielfaches hast, vereinfachen sich die ganzen internen Vorgänge, wie zb
Vergleiche oder sonstiges Rechnen mit deinen Temperaturwerten.
(Abgesehen davon, dass deine Kommasteuerung sowieso nicht funktioniert,
was dich wahrscheinlich zur Annahme bringt, dass irgendwas mit den
Interrupts nicht stimmt. Lass den Unsinn und verwende einfach ein für
deine Zwecke geeignetes Vielfaches.)
Aber um eine vernünftige, zuverlässige Entprellung kommst du nicht
herum. Das was du hattest, ist keine Entprellung. Das ist nur ein völlig
unnötiges und nutzloses Warten in einer ISR. Nur hilft dir das nichts,
denn wenn der Taster prellt, wird der nächste Interrupt vom prellenden
Taster angestossen. Ob du nun in der ISR wartest oder nicht.
Entprellung
Und definier deine Ausgabepuffer nicht so knapp!
Ich hab mal den Code rüberkopiert und mal schnell ausprobiert (übrigens
nochmals danke!), jedoch scheinen immer noch beide interrupts
anzusprechen (Temperatur geht rauf oder runter, beim gleichen
Interrupt).
Ich bau nun das ganze mal um (nutzung der internen pull-ups usw...).
Dann check noch mal deine Pulldown Widerstände. Jede wette, dass du in
Wirklichkeit offene Eingänge hast.
Besser wäre es, wenn du das Zeugs einfach umverdrahtest.
Die Taster schliessen nach Masse. Die externen Pulldown fallen überhaupt
weg. Dafür werden die internen Pullup aktiviert und die Interrupts (für
jetzt, der Teil ist noch zu ersetzen) auf fallende Flanke konfiguriert.
nimmt die Temperatur und halbiert sie. Der zweite Abschnitt ist modulu
2. Bei 1 --> Ausgabe 0, bei 0 --> Ausgabe 5.
Leider seh ich nicht wo der Fehler liegt. Ich bitte nochmals um Hilfe.
MfG Ronald
>> nimmt die Temperatur und halbiert sie. Der zweite Abschnitt ist modulu> 2. Bei 1 --> Ausgabe 0, bei 0 --> Ausgabe 5.>> Leider seh ich nicht wo der Fehler liegt. Ich bitte nochmals um Hilfe.
Mein Fehler, genau anders rum
sprintf( buf, "%2d.%0dC", Temperatur_Soll / 2, Temperatur_Soll % 2 ? 5
: 0 );
oder ausführlicher
sprintf( buf, "%2d.%0dC", Temperatur_Soll / 2, Temperatur_Soll % 2 ==
0 ? 0 : 5 );
Wenn der Ausgangswert gerade ist, dann soll eine 0 angehängt werden, bei
ungeraden Zahlen eine 5
Du hättest auch die langatmigere Version mit einem if-else nehmen
können.
>> MfG Ronald