mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt beim 2313 mit Taster auslösen


Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Weiss jemand, ob es beim AT90S2313 ausser dem Anschluss PD6 noch
eine andere Möglichkeit gibt, mittels Taster einen Interrupt aus-
zulösen?

MfG Paul

Autor: Frank Linde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, INT0 und INT1 entsprechend PD2 und PD3.

Gruß, Frank

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Frank, das hilft mir sehr. Ich müsste sonst die ganze Platine
umstricken.

MfG Paul

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Mensch ist aus der Sicht des MC eine Schnecke. Er braucht mindestens
300ms um auf etwas zu reagieren und hält eine Taste auch mindestens
300ms gedrückt.

D.h. der MC hat alle Zeit der Welt um jeden beliebigen Portpin in einem
Timerinterrupt abzufragen. Das hat gleichzeitig den riesengroßen
Vorteil, daß man in dem Timerinterrupt die notwendige Entprellung
bequem mit erschlagen kann.


Aber Dir ist ja bestimmt schon die Unmenge an Beiträgen zur
Tastenabfrage in der Codesammlung aufgefallen.


Peter

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Ich habe jetzt die Sache mit einem Tastaturinterrupt realisiert.
Den bzw. die beiden Timer will ich mir noch aufheben, da ich im
weiteren noch einen genauen Sekundentakt brauche.
MfG Paul

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Den bzw. die beiden Timer will ich mir noch aufheben, da ich im
weiteren noch einen genauen Sekundentakt brauche."


Das eine schließt das andere doch nicht aus.
Man darf ruhig die Entprellroutine und die Uhrzeitzählung im selben
Timerinterrupt ausführen (einfach hintereinander aufrufen).


Peter

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe manchmal auch Taster am Int-Eingang hängen, allerdings nur aus
einem Grund: um den MC aus dem Sleep-Zustand wieder aufwecken zu
können. Die normale Tastenabfrage mache ich immer im Timer-Interrupt.
Das spart viel Ärger, über die Prell-Probleme der Leute hier kann ich
jedesmal nur müde lächeln.

@Peter:
Du bist wohl auch so ein älteres Semester, was? ;-)
Völlig ohne Daddelkiste aufgewachsen, kein Wunder, dass da 300ms
zusammenkommen. Ein Kid von heute hat in der Zeit mindestens schon 3
Monster erlegt ...

Stefan

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

Ich habe das mal realisiert und die Tasten über einen Timerinterrupt
entprellt und danach mit dem gleichen Timer 1 einen Sekundentakt ge-
bastelt. Folge: Meine Uhr hat eine erhebliche Gangabweichung, die
vorher nicht da war!
Was lehrt mich das? Besser zeitkritische Sachen mit dem Timerinterrupt
machen und die Tasterabfrage über INT0 und INT1. (Das geht Dank Rat von
Frank gut)

.....und ab dafür!!

Autor: Jim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul:
Mich lehrt das nur, dass Du da offensichtlich einen dicken Fehler
gebaut hast. Der Timer-IRQ wird doch von der Hardware (Quarz, etc.)
erzeugt.

Üblicherweise macht man das mit einem Timer-IRQ, ausser vielleicht bei
extrem stromsparenden Applikationen, wo der MC nur alle paar Tage
gebraucht wird und jahrelang mit einer Batterie laufen muss.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul

"Meine Uhr hat eine erhebliche Gangabweichung, die
vorher nicht da war!"


Das lehrt nur, daß Du dabei offensichtlich einen Fehler in der
Berechnung der Reloadwerte gemacht hast.


Viel vergessen leider, daß nur durch ganze Zahlen geteilt werden kann.
D.h. man muß immer prüfen, ob bei den Divisionen ein Rest anfällt.

Dann darf man diesen natürlich nicht einfach unter den Tisch fallen
lassen sondern muß ihn bei den nachfolgenden Teilungen mittels Software
wieder hinzurechnen (Rechnen mit gebrochenen Zahlen).


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul

"und die Tasterabfrage über INT0 und INT1"


Und was machst Du bei 3... Tasten ???



Peter

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

Die Reloadwerte für die Uhrzeiterzeugung sind Gott sei's getrommelt
und gepfiffen ganzzahlige Werte. Das Problem sind die Tastendrücke,
die in ihrer Zahl nicht absehbar sind!
Ich will es einmal geradeheraus offenlegen: Die Schaltung betreibt
einen Motor und nebenbei soll der Kamerad MC noch einen Betriebstunden
-zähler realisieren.
Mach Du mir doch mal einen Vorschlag, in Form eines Stücks Programm,
was Timer 1 vom at90s2313 in Frieden meinen Sekundenimpuls erzeugen
lässt und nebenbei von mir aus auch nur 2 Taster entprellt.

MfG paul

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist: Wo schreibst Du den Reload-Wert? Ganz am Ende des
Interrupts wäre es kein Wunder, wenn Abweichungen zustande kommen.
Es gibt auch noch die Möglichkeit, den Timer automatisch zu Reloaden,
das ist die sicherste Methode. Da kannst Du dann Deinen Sekundentakt,
Deine Taster uns weißderTeufelwas abfragen und berechnen, durch
unterschiedliche Laufzeiten der Subroutines gibts keine Abweichungen
(es sei denn, die Subroutines brauchen mehr Zeit, als zwischen zwei
Interrupts übrig ist).
Abweichungen einer Uhr durch Tastaturabfrage -> Fehler in der
Software.
Ich programmiere mir meistens als allererstes eine Zeitbasis von 100
Hz, aus der ich dann alles andere ableite. Funktioniert prima.
Bedenke auch, daß die üblichen Quarze nicht so genau sind, wie man sich
erhoffen mag. Selbst Uhrenquarze können zu Überraschungen führen.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Paul

"Mach Du mir doch mal einen Vorschlag, in Form eines Stücks Programm,
was Timer 1 vom at90s2313 in Frieden meinen Sekundenimpuls erzeugen
lässt und nebenbei von mir aus auch nur 2 Taster entprellt."


Ich sehe da jetzt die Schwierigkeit nicht.

Anbei der Timerinterrupt mit beidem.
Die Sekunden stehen in "second" und die gedrückten Tasten in
"key_press".
Wann Du dann diese Werte im Main ausliest, bleibt Dir überlassen.


Peter

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Na, das ist doch mal ein feiner Zug! Ich musste erst mal ein paar
Kompagnons befragen, da ich der Sprache C nicht mächtig bin, aber
jetzt habe ich die Methode, die Du beschrieben hast verstanden.

Nachher setze ich den Ablauf mal in Bascom um und gucke mir das
mal an.

Danke dafür Peter!

MfG Paul

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ES GEHT!!!

Der Rat war gut, Peter!
Ich habe jetzt auch meinen Fehler gefunden. Durch groben Unfug meiner-
seits hatte ich die Tastenzeit mit dem Reloadwert verknotet:-(((

Aber der, der den Fehler macht, sieht ihn zuletzt. (alte
Volksweisheit)

MfG paul

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.