Frage zu Delays mit Timer und Frage zu Events

Gast #3431195
Wir haben folgende Aufgabenstellung:
Erstellen Sie ein Programm mit welchem die Prellanzahl der Taster SW1 
und SW2 gemessen
wird. Die Messung soll auf 2 Arten durchgeführt werden:
• SW1: Pegeländerungs-Interrupt und Hochzählen der Prellanzahl in der 
ISR
• SW2: Pegeländerungs-Event ist die Taktquelle für einen Timer ➜ 
Prellanzahl steht im
CNT-Register
Wird der erste „Preller“ detektiert, so muss kurz gewartet werden (Delay 
>100ms) um alle
Preller zu messen. Danach soll der Wert auf den 4 LEDs ausgegeben werden 
(Werte größer
15 auf 15 begrenzen, sonst stimmt die Anzeige nicht). Nach kurzem Delay 
(>1s) sollen die
LEDs wieder gelöscht werden und die Messung kann erneut durchgeführt 
werden.
Betreiben Sie den XMega mit 32MHz für ein genaueres Ergebnis.

Der µC ist ein ATXMEGA128A1
Mein bisheriger Fortschritt:
http://pastebin.com/VbuvnWLM

Nun zu meiner eigentlichen Frage:
Wie kann ich mit dem Timer Delays machen (also ohne 
Verzögerungsschleifen). Wie funktioinert das überhaupt? Der Lehrer 
meinte wir sollen einen OVF-interrupt benutzen, aber wieso?

Ich versteh die Aufgabenstellung nicht, denn wenn ein Preller mal 
erkannt wurde, wieso warte ich dann 100ms?(da sind die Preller wsl schon 
alle weg oder) und was soll ich da zählen wenn die eh schon alle weg 
sind?
> Ich versteh die Aufgabenstellung nicht, denn wenn ein Preller mal erkannt wurde, 
wieso warte ich dann 100ms?

Du wartest nicht 100ms, sondern du lässt den Versuch 100ms laufen. 
Beginnend mit der ersten Pegelveränderung.

> und was soll ich da zählen wenn die eh schon alle weg sind?

du sollst ja auch während dieser 'Wartezeit' die Preller zählen.

Nur musst du halt aber auch irgendwann mal sagen: jetzt kommt mit 
Sicherheit kein Preller mehr, noch länger Warten macht keinen Sinn mehr. 
Ich erkläre die Messaufnahme für abgeschlossen, das jetzt vorliegende 
Ergebnis ist das Endergebnis.
IN deinem Beispiel ist dieser Zeitpunkt dann eben 100ms nach Beginn des 
Tastendrucks (der ersten Pegeländerung am Port).
Gast
> Ich versteh die Aufgabenstellung nicht, denn wenn ein Preller mal
> erkannt wurde, wieso warte ich dann 100ms?

Du sollst - nachdem der ersten Preller erkannt wurde 100 mS warten.
In dieser Zeit zählt der Zähler hoch.
Nach 100 mS sollte Du den Zähler auslesen und die Daten anzeigen.

Also - 100mS nach dem Event den Zähler auslesen. Dann hat er 100 mS Zeit 
die Preller zu zählen.
Gast
hmmm ok, das klingt wenigstens logisch

Kann mir jemand vielleicht erklären, wie man das jetzt mit den 100 ms 
genau realisiert (also wie macht man eine Warteschleife (ohne wirkliche 
Schleife) mit dem Timer
hawx schrieb:
> hmmm ok, das klingt wenigstens logisch
>
> Kann mir jemand vielleicht erklären, wie man das jetzt mit den 100 ms
> genau realisiert (also wie macht man eine Warteschleife (ohne wirkliche
> Schleife) mit dem Timer

Das goile ist, dass mit diesen Vorgaben
1
• SW1: Pegeländerungs-Interrupt und Hochzählen der Prellanzahl in der ISR
2
• SW2: Pegeländerungs-Event ist die Taktquelle für einen Timer ➜ Prellanzahl steht im
3
CNT-Register
du die 100ms im Grunde überhaupt nicht mit einem Timer machen musst, 
weil die ganze Zählerei im Hintergrund durch Interrupts passiert, bzw. 
der Timer ganz von alleine die Preller zählt.

D.h. dein Code ist im Prinzip so
1
   warte auf Flanke am Tastereingang
2

3
   Setze den Zähler auf 0
4
   _delay_ms( 100 );
5

6
   Lies den Zähler aus

Ein Timer, der die 100ms abzählt, wäre zwar möglich, bringt aber 
überhaupt nichts. Zumal es an dieser Stelle noch nicht einmal darauf 
ankommt, dass die 100ms auf den Taktzyklus genau sind.
Gast
und wieso verwende ich da einen overflow interrupt

alles schön ung gut, aber das Ganze soll in Assembler geschehen (habe 
einen pastebin-Link gepostet, von meinem aktuellen Fortschritt) und mein 
Problem ist, dass ich eben nicht die Zusammenhänge nicht verstehe. In 
den CNT-Register schreibe ich die 100ms, oder wie? und im PER musss ich 
ja auch was tun?
Du sollst den Timer nicht als Timer benutzen, sondern als Zähler und den 
sollst du anscheinend durch das XMega Eventsystem triggern!

Sollen wir dir jetzt das Programm in ASM vorkauen? Bisschen was, 
solltest du auch selbst für die Hausaufgabe machen...
Gast
das war die antwort, was ich gebraucht hab

Basti M. schrieb:
> Du sollst den Timer nicht als Timer benutzen, sondern als Zähler und den
> sollst du anscheinend durch das XMega Eventsystem triggern!

Basti M. schrieb:
> Sollen wir dir jetzt das Programm in ASM vorkauen? Bisschen was,
> solltest du auch selbst für die Hausaufgabe machen...

nicht alles vorkauen, sondern mir helfen:

Oder darf ich das alles jetzt so verstehen:
Taste gedrückt. Hier bei jedem overflow beim Timer zähle ich den counter 
hoch, dabei wird dieser zählschritt (bzw. interrupt) so oft wiederholt 
bis sich die 100ms fertig ausgeführt worden sind?

ABER wieso wird die Prellanzahl im CNT-Register gespeichert. CNT ist ja 
unser "Timer-Counter" der unser countervalue speichert der im 
Normalmodus bis PER zählen darf.

und bissl was hab ich sicher schon und zwar fehlt mir nur mehr das mit 
dem Zählen (siehst du im pastebin link) und das auch nur weil mir das 
unklar war bzw. immer noch nicht, falls ich mit der obigen 
Niederschreibung meiner Erkenntnisse aus euren Posts falsch liege :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.