Forum: Mikrocontroller und Digitale Elektronik Atmega8 vers. C - Interuptbehandlung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von PC-Freak (Gast)


Lesenswert?

Hallo Forengemeinde,

ich habe nun noch nicht soviel Ahnung von Atmega und eben Interupts 
unter C zu behandeln.

Problemstellung: An einem Port werden durch einen Taster Lo-Flanken 
erzeugt. Im Ruhezustand ist dieser 'High'. Nun kommt dieser Lo-Impuls 
für max. 200 ms. Darauf soll mein Atmega 8 nun reagieren.

Frage Wie kann ich nun diesen ausgelösten Interupt entweder in einer 
Case-Schleife oder sonstwie erfassen.

Könnte mir hier bitte jemand mit einem Beispiel-Code (-Schnipsel) hier 
auf die Sprünge helfen ?

von Sebastian (Gast)


Lesenswert?

Arduino oder pur?

LG, Sebastian

von Oliver S. (oliverso)


Lesenswert?

Frag ChatGPT. Seit es das gibt, kann sich niemand mehr damit rausreden, 
daß googeln zu kompliziert ist.

Oliver

von Peter D. (peda)


Lesenswert?

Such mal nach Entprellen oder Debounce.

von c-hater (Gast)


Lesenswert?

PC-Freak schrieb:

> Case-Schleife

Alles klar: Traffic-Troll.

von Stefan F. (Gast)


Lesenswert?

Entweder fragst du den I/O Pin vom Taster in regelmäßigen Intervallen ab 
(bevorzugt), oder du benutzt einen Pin-Change Interrupt, damit der 
Mikrocontroller beim Tastendruck sein Hauptprogramm unterbricht und eine 
ISR ausführt. Letzteres birgt viele Fallstricke und erfordert eine 
Schaltung zum Entprellen.

Taster mit Interrupts zu kombinieren ist selten ratsam.

Wenn du willst, dass sich jemand für deine Frage ordentlich Zeit nimmt, 
dann sei du so ordentlich und melde dich an.

von PC-Freak (Gast)


Lesenswert?

Oliver S. schrieb:
> Frag ChatGPT. Seit es das gibt, kann sich niemand mehr damit rausreden,
> daß googeln zu kompliziert ist.

Das ist jetzt nicht die Antwort auf meine Frage. Ich habe nicht vor mir 
einen Chat-Bot zu installieren.

Sebastian schrieb:
> Arduino oder pur?
>
> LG, Sebastian

Ich will mit dem Atmega 8 auf Änderungen an einem Port per Interupts in 
meinem C-Code ragieren können. Kein Pollen.

von Stefan F. (Gast)


Lesenswert?

PC-Freak schrieb:
> Ich habe nicht vor mir einen Chat-Bot zu installieren.

Das ist eine Webseite!

PC-Freak schrieb:
> Ich will mit dem Atmega 8 auf Änderungen an einem Port per Interupts in
> meinem C-Code ragieren können. Kein Pollen.

Dann lies die Doku der avr-libc. Für Interrupts hat sie ein extra 
Kapitel. Und lies das Datenblatt des Mikrocontrollers.

Wenn du das ernsthaft tust, kannst du danach vernünftige konkrete Fragen 
stellen, die nicht wie Trollerei wirken.

von Da Baby [reformed] (Gast)


Lesenswert?

Stefan F. schrieb:
> Taster mit Interrupts zu kombinieren ist selten ratsam.

Ist doch unwahr. Genau dafür sind interrupts gemacht.
Über Polling und delay macht man nur, weil man dann nichts filtern muss.
Also sprich halb gehackt. Ich würde zumindest mal mit einem Timer 
regelmäßig pollen, sonst verpasst du den Taster weil dein Programm was 
anderes macht.
Oder: Den Interrupt entprellen mit einem digitalen Filter.

von Da Baby [reformed] (Gast)


Lesenswert?

Oder den Interrupt auf Flanke einstellen und danach für ein paar ms 
deaktivieren.

von c-hater (Gast)


Lesenswert?

Da Baby [reformed] schrieb:

> Oder den Interrupt auf Flanke einstellen und danach für ein paar ms
> deaktivieren.

Das ist nur dann sinnvoller als Polling per Timer-Interrupt, wenn der 
Taster (auch) dazu dienen soll, das System aus dem Tiefschlaf zu holen.

von Wolfgang (Gast)


Lesenswert?

Da Baby [reformed] schrieb:
> Stefan F. schrieb:
>> Taster mit Interrupts zu kombinieren ist selten ratsam.

Ist doch Unfug.

Der Timer-Interrupt löst regelmäßig das Lesen des Tasterzustandes ab und 
alles wird gut.

> Ist doch unwahr. Genau dafür sind interrupts gemacht.
> Über Polling und delay macht man nur, weil man dann nichts filtern muss.

Warum verheiratest du Polling und delay().

Für einen Taster ist Polling per Timer-Interrupt meist sinnvoller.

von Falk B. (falk)


Lesenswert?

PC-Freak schrieb:
> Ich will mit dem Atmega 8 auf Änderungen an einem Port per Interupts in
> meinem C-Code ragieren können. Kein Pollen.

Kann man machen. Dazu braucht es beim "alten" Atmega8 den INT0 oder INT1 
Pin und die dazugehörige ISR, siehe Interrupt. Die "neueren" 
ATmega328 etc. können das an jedem Pin über Pin Change Interrupt.

von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> Der Timer-Interrupt löst regelmäßig das Lesen des Tasterzustandes ab und
> alles wird gut.

In der Tat, siehe Entprellung.

von Dyson (Gast)


Lesenswert?

PC-Freak schrieb:
> Oliver S. schrieb:
>> Frag ChatGPT. Seit es das gibt, kann sich niemand mehr damit rausreden,
>> daß googeln zu kompliziert ist.
>
> Das ist jetzt nicht die Antwort auf meine Frage. Ich habe nicht vor mir
> einen Chat-Bot zu installieren.
> Sebastian schrieb:
>> Arduino oder pur?
>> LG, Sebastian
>
> Ich will mit dem Atmega 8 auf Änderungen an einem Port per Interupts in
> meinem C-Code ragieren können. Kein Pollen.

Stefan F. schrieb:
> PC-Freak schrieb:
>> Ich habe nicht vor mir einen Chat-Bot zu installieren.
>
> Das ist eine Webseite!
> PC-Freak schrieb:
>> Ich will mit dem Atmega 8 auf Änderungen an einem Port per Interupts in
>> meinem C-Code ragieren können. Kein Pollen.
>
> Dann lies die Doku der avr-libc. Für Interrupts hat sie ein extra
> Kapitel. Und lies das Datenblatt des Mikrocontrollers.
> Wenn du das ernsthaft tust, kannst du danach vernünftige konkrete Fragen
> stellen, die nicht wie Trollerei wirken.

Wenn Helferli dir was empfiehlt, musst du das auch machen. Sonst hast du 
verschissen.

von M. K. (sylaina)


Lesenswert?

PC-Freak schrieb:
> Könnte mir hier bitte jemand mit einem Beispiel-Code (-Schnipsel) hier
> auf die Sprünge helfen ?

Hier der Artikel zum Thema Entprellung, viel Spass beim Lesen:

https://www.mikrocontroller.net/articles/Entprellung

von PC-Freak (Gast)


Lesenswert?

Anscheinend ist es nicht der richtige Weg, dies über Interupts zu lösen.

Kleines Update. Der Lo-Impuls der erfasst werden soll, wird von einem 
Transistor auf einer Schaltung erzeugt. Insgesamt sind es 4 Leitungen. 
Der Impuls ist sauber und braucht nicht entprellt zu werden.

Es kommt jeweils nur 1 Lo-Impuls von Leitung 1, 2, 3 oder 4. Der Impuls 
ist ca. 200-400 ms lang. Der Atmega steuert auch ein 2-stelliges Display 
an, und zeigt hier die aufgezählten Impulse.

Ihr schlagt hier ein timergesteuertes Pollen vor. Wäre ja auch ne 
Lösung.

von Stefan F. (Gast)


Lesenswert?

PC-Freak schrieb:
> Anscheinend ist es nicht der richtige Weg, dies über Interupts zu lösen.

Taster prellen, im Laufe der Zeit immer mehr. Wenn die Flankenwechsel 
Interrupts auslösen, können das beliebig viele sein. Viele Interrupts 
bremsen dein Hauptprogramm stark aus. Deswegen ist das keine elegante 
Lösung.

Wenn dein Taster Interrupts auslösen soll, sollte man ihn mit Hardware 
entprellen. Bei AVR ist das simpel, im einfachsten Fall reicht ein 47nF 
Kondensator parallel zum Kontakt. Doch das mögen die Pfennigfuchser 
nicht, Kondensatoren Geld kosten und der ultrabillige fadenscheinige 
Kontakt im Taster womöglich schneller altert, weil er das bisschen 
Energie aus dem Kondensator nicht verträgt. (Ja, auch dagegen kann man 
was tun, kostet aber wieder).

Auf der anderen Seite leben viele Schaltkontakte länger, wenn sie mit 
einem gewissen Frittstrom (typisch mindestens 1mA) belastet werden. Den 
würde der Kondensator von ganz alleine liefern.

Wenn man in Software entprellt hat man hingegen eine elegante 
Möglichkeit, die Timing Parameter ohne Lötkolben anzupassen. Das man zum 
Messen von Zeiten einen Timer braucht, ist klar. Als ich oben schrieb

> Taster mit Interrupts zu kombinieren ist selten ratsam.

meinte ich die vom TO angedachte Variante, wo der Tastendruck selbst 
einen Interrupt auslöst (nicht ein Timer).

von Teo D. (teoderix)


Lesenswert?

PC-Freak schrieb:
> Der Lo-Impuls der erfasst werden soll, wird von einem
> Transistor auf einer Schaltung erzeugt. Insgesamt sind es 4 Leitungen.
> Der Impuls ist sauber und braucht nicht entprellt zu werden.

Dafür sind Interrupts gemacht....
Kann aber trotzdem schneller Störungen einfangen.
Wenn's hier nicht um genaue Zeiten geht, würde ich hier, der 
Störsicherheit wegen, Pollen.

von HildeK (Gast)


Lesenswert?

PC-Freak schrieb:
> Anscheinend ist es nicht der richtige Weg, dies über Interupts zu lösen.
Nicht unbedingt.
Klar, wenn deine Hauptschleife ausreichend schnell ist (Durchlaufzeit << 
200ms) dann kannst du auch einfach bei jedem Durchlauf die Signale 
abfragen und auf eine Änderung von HIGH nach LOW reagieren, also mit dem 
vorherigen Zustand vergleichen.
Dann bleibt noch die Frage, ob diese Durchlaufzeit akzeptabel ist für 
die Änderung der Anzeige. Im worst case gibt es eine Durchlaufzeit 
Verzögerung.

Andernfalls ist der Interrupt der bessere Weg. Der kann so konfiguriert 
werden, dass er nur auf die negative Flanke reagiert. Man muss sich 
keine Historie merken und die Anzeige wird sofort aktualisiert.

Muss unterschieden werden, von welchem Eingang der Puls kam?

> Kleines Update. Der Lo-Impuls der erfasst werden soll, wird von einem
> Transistor auf einer Schaltung erzeugt. Insgesamt sind es 4 Leitungen.
> Der Impuls ist sauber und braucht nicht entprellt zu werden.
Die Info hätte ganz oben hingehört! Alle sind wohl bisher von Tastern 
ausgegangen. In dem Fall ist Entprellen kein Thema, außer die 
Eingangssignalleitungen sind lang.

von Teo D. (teoderix)


Lesenswert?

HildeK schrieb:
> PC-Freak schrieb:
>> Anscheinend ist es nicht der richtige Weg, dies über Interupts zu lösen.
> Nicht unbedingt.
> Klar, wenn deine Hauptschleife ausreichend schnell ist (Durchlaufzeit <<
> 200ms)

Normal macht man das mit nem Timer. Sonnst kommt man ja nie, auf nen 
Grünen Zweig.

von HildeK (Gast)


Lesenswert?

Teo D. schrieb:
> Normal macht man das mit nem Timer. Sonnst kommt man ja nie, auf nen
> Grünen Zweig.

Die Durchlaufzeit der Hauptschleife ist auch so was wie ein Timer. Nur 
eben mit variabler und unbestimmter Zeit. Hängt einfach davon ab, was 
sonst noch gemacht werden muss.
Ich brauch dort doch nur eine Abfrage
1
 if ( (Zustand_alt != Zustand_neu) && (Zustand_neu != 0xFF) 
2
  { 
3
    // aktualisiere Anzeige
4
    Zustand_alt = Zustand_neu;
5
  }
um die Anzeige zu aktualisieren.

Ich würde es in einen INT0- oder INT1-Interrupt für die negative Flanke 
packen und dort die Anzeige aktualisieren. Je nachdem, was der Prozessor 
kann; andere Prozessoren haben z.B. mehrere PCINT-IRQs, die man 
idealerweise dafür nehmen kann.

Übrigens:
Teo D. schrieb:
> Dafür sind Interrupts gemacht....
> Kann aber trotzdem schneller Störungen einfangen.
> Wenn's hier nicht um genaue Zeiten geht, würde ich hier, der
> Störsicherheit wegen, Pollen.
Gehörst du der Gürtel- & Hosenträgerfraktion an? 😀
Wie bedienst du dann z.B. den Takteingang eines HC164? Den müsste man 
mit deiner Begründung auch entprellen ...

von Teo D. (teoderix)


Lesenswert?

HildeK schrieb:
> Gehörst du der Gürtel- & Hosenträgerfraktion an? 😀

Nö, ich hab nur NULL Ahnung, was der TO da zusammen bastelt. Evtl. zieht 
die Leiterbahn, ja noch 2-3 Extraschleifen um nen Schaltregler.... ;)

von Klaus S. (kseege)


Lesenswert?

PC-Freak schrieb:
> Anscheinend ist es nicht der richtige Weg, dies über Interupts zu lösen.

Da liegst Du eventuell daneben. Du hast Dein Problem völlig falsch 
geschildert (Taster!!!), Deine Schaltung ist wohl eher das genaue 
Gegenteil eines Tasters, wie Du jetzt rausrückst. Da hier alles über 
Text geht, ist eine korrekte Ausdrucksweise hilfreich. Das hat dann dazu 
geführt, daß die meisten Empfehlungen einfach für die Tonne sind und Du 
falsche Schlußfolgerungen ziehst.

Da Dir korrekte Ausdrucksweise noch nicht gelingt, wäre es für uns 
hilfreich, wenn Du ein bißchen über den tatsächlichen Aufbau und den 
Verwendungszweck der Schaltung herausrücken würdest. Dann können wir 
eher erkennen, wo Du schwurbelst, wo man Deine Beschreibungen 
ernstnehmen kann und was tatsächlich zum Erfolg führen würde.

Ansonsten befürchte ich, daß das mal wieder in einer wüsten 
Beschimpfungsorgie endet (bin heute Pessimist).

Gruß Klaus (der soundsovielte)

von Oliver S. (oliverso)


Lesenswert?

PC-Freak schrieb:
> Oliver S. schrieb:
>> Frag ChatGPT. Seit es das gibt, kann sich niemand mehr damit rausreden,
>> daß googeln zu kompliziert ist.
>
> Das ist jetzt nicht die Antwort auf meine Frage. Ich habe nicht vor mir
> einen Chat-Bot zu installieren.

Wie gesagt, das ist der Ratschlag für jemanden, dem Google zu 
kompliziert ist. Den Google findet alle Antworten auf deine Fragen, und 
hätte dir auch verraten, was ChatGPT ist.

Hier auf microcontroller.net gibt es eine Artikelsammlung, Link oben 
links. Da finden sich tatsächlich hilfreiche Artikel.

Für dich wäre z.B. der hier als Einstieg in die AVR-Programmierung 
geeignet:

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Oliver

: Bearbeitet durch User
von Klaus S. (kseege)


Lesenswert?

Ich glaub, ich bin kein Pessimist, sondern stehe auf der Leitung.
Hausaufgabenerledigung effizient :-(
Hat gedauert, bis der Groschen gefallen ist, sorry.

von Stefan F. (Gast)


Lesenswert?

ChatGPT kann die Frage wirklich beantworten, ist aber nicht so schlau, 
auf das Kontakt-Prellen hinzu weisen. Da der TO aber schrieb, dass er 
ein sauberes Signal hat, reicht die Antwort sogar.

Frage:
"An einem Port werden durch einen Taster Lo-Flanken
erzeugt. Im Ruhezustand ist dieser 'High'. Nun kommt dieser Lo-Impuls
für max. 200 ms. Darauf soll mein Atmega 8 nun reagieren.
Wie kann ich nun diesen ausgelösten Interupt entweder in einer
Case-Schleife oder sonstwie erfassen?"

Antwort:
"Das kannst Du in C mit einem Interrupt Service Routine (ISR) machen. 
Dazu musst Du eine Funktion definieren, die als Reaktion auf den 
Interrupt ausgeführt wird. Diese Funktion muss mit dem 
Interrupt-Service-Routine-Präprozessor-Makro versehen sein. Hier ist ein 
Beispiel in C:
1
#include <avr/interrupt.h>
2
3
ISR (INT0_vect) {
4
  // Code, der bei einem Interrupt ausgeführt werden soll
5
}
6
7
int main(void) {
8
  // Initialisierung des Interrupts
9
  // Interrupt INT0 aktivieren
10
  EIMSK |= (1 << INT0);
11
  // Rising Edge aktivieren
12
  EICRA |= (1 << ISC01);
13
  EICRA &= ~(1 << ISC00);
14
  // Interrupts global aktivieren
15
  sei();
16
17
  while (1) {
18
    // Hauptprogramm-Code
19
  }
20
}

Wichtig ist, dass die Interrupt-Routinen möglichst kurz und effizient 
sein sollten, da sie jederzeit unterbrochen werden können."

Das sieht soweit schlüssig aus, ich hake aber nach:
"Wie verhindere fehlerhafte Auswertung durch Kontakt-Prellen?"

Antwort:
"Ein häufiger Fehler bei der Verarbeitung von Taster-Signalen ist das 
sogenannte Kontakt-Prellen. Dabei kann es vorkommen, dass beim Drücken 
und Loslassen eines Tasters kurzzeitig mehrere Flanken erzeugt werden, 
die ungewollt als separate Interrupt-Ereignisse interpretiert werden. Um 
dies zu verhindern, gibt es verschiedene Techniken:

    De-Bouncing: Hierbei wird eine Verzögerung eingebaut, bevor das 
Signal ausgewertet wird. Hierdurch werden kurzzeitige, fehlerhafte 
Signale unterdrückt.

    Edge-Triggered Interrupts: Statt eines Level-Triggered Interrupts 
kannst Du auch einen Edge-Triggered Interrupt verwenden. Hier wird das 
Signal nur bei einem flankenbasierten Wechsel des Signals ausgelöst.

    State-Machine: Eine weitere Möglichkeit ist die Verwendung einer 
Zustandsmaschine. Hier wird das Signal über eine bestimmte Zeit 
beobachtet und erst dann ausgewertet, wenn es länger als eine bestimmte 
Dauer in einem bestimmten Zustand ist.

Welche Methode am besten geeignet ist, hängt von der spezifischen 
Anwendung ab und muss im Einzelfall entschieden werden."

Ich finde den Ansatz, auf ChatGPT zu verweisen, gar nicht so dumm. Weil 
dieser Bot jede Frage geduldig beantwortet. Der Bot beklagt sich nicht 
über dumme Fragen, fehlende Infos oder mangelnde Bereitschaft. Er 
antwortet einfach, stets höflich und in einem überzeugenden Stil.

Wer darüber hinaus konkrete Details hinterfragen will, kann das dann ja 
immer noch hier tun. Dann merkt man auch ganz schnell, ob sich jemand 
zum Trollen doof stellt, oder wirklich doof ist, oder ob er es ernst 
meint.

Muss ich erwähnen, dass die Antwort bezüglich "Edge-Triggered 
Interrupts" Bullshit ist? Nein, das lass ich mal stehen. Sonst wird 
wieder gemeckert, dass ich ein alter Meckersack sei.

von Teo D. (teoderix)


Lesenswert?

Stefan F. schrieb:
> De-Bouncing: Hierbei wird eine Verzögerung eingebaut, bevor das
> Signal ausgewertet wird. Hierdurch werden kurzzeitige, fehlerhafte
> Signale unterdrückt.

So ein Quatsch!
Man merkt, das Ding hat aus'm Internet gelernt. :D

von HildeK (Gast)


Lesenswert?

Teo D. schrieb:
> Nö, ich hab nur NULL Ahnung, was der TO da zusammen bastelt. Evtl. zieht
> die Leiterbahn, ja noch 2-3 Extraschleifen um nen Schaltregler.... ;)

Soweit gebe ich dir recht.
Ich habe es auch einmal erlebt, dass tatsächlich Datenleitungen auf eine 
Resetleitung übergesprochen haben. Unter ganz bestimmten Konditionen hat 
sich dann ein Teil (!) der Schaltung zurückgesetzt. Die Ursache möchte 
man nicht oft suchen müssen ...

von HildeK (Gast)


Lesenswert?

Stefan F. schrieb:
> Er antwortet einfach, stets höflich und in einem überzeugenden Stil.

Ja auch höflich und überzeugend wenn er Bullshit von sich gibt. Und das 
kann meist nur der erkennen, der den Bot gar nicht hätte fragen müssen 
...

von Hugo H. (hugo_hu)


Lesenswert?

Stefan F. schrieb:
> ChatGPT kann die Frage wirklich beantworten,

Interessant, wie vielfältig die Antworten sind:

Frage:
An einem Port werden durch einen Taster Lo-Flanken
erzeugt. Im Ruhezustand ist dieser 'High'. Nun kommt dieser Lo-Impuls
für max. 200 ms. Darauf soll mein Atmega 8 nun reagieren.
Wie kann ich nun diesen ausgelösten Interupt entweder in einer
Case-Schleife oder sonstwie erfassen?


Antwort:
Um den Lo-Impuls auf dem Port zu erfassen, müssen Sie die 
Interrupt-Funktionalität des ATmega 8 nutzen. Hier ist ein Beispiel, wie 
Sie dies in C mit einer Interrupt-Service-Routine (ISR) tun können:


Konfigurieren Sie den Pin als Eingang und aktivieren Sie den Interrupt:
1
DDRB &= ~(1<<PB0);  // Pin als Eingang konfigurieren
2
GIMSK |= (1<<INT0);  // Interrupt INT0 aktivieren

Definieren Sie die ISR für den Interrupt:
1
ISR (INT0_vect) {
2
    // Code, der ausgeführt werden soll, wenn der Interrupt ausgelöst wird
3
}

Konfigurieren Sie den Interrupt-Trigger:
1
MCUCR |= (1<<ISC00);  // Low-Flanke als Interrupt-Trigger

Aktivieren Sie die Interrupts global:
1
sei();  // Interrupts global aktivieren

Sobald der Lo-Impuls erkannt wird, wird die ISR ausgeführt und Ihr Code 
kann auf die Interrupt-Verarbeitung reagieren. Statt einer Case-Schleife 
kann die ISR verwendet werden, um auf den Lo-Impuls zu reagieren.


Nachfrage:
Wie verhindere fehlerhafte Auswertung durch Kontakt-Prellen?

Antwort:
Um fehlerhafte Auswertung durch Kontakt-Prellen zu verhindern, gibt es 
mehrere Möglichkeiten:

Verwendung einer Schaltung zur Glättung von Signalen: Dies kann ein 
RC-Glied oder ein Schmitt-Trigger sein, das das Signal glättet, bevor es 
an den Mikrocontroller weitergegeben wird.

Verwendung von softwareseitigen Debouncing-Methoden: Hier wird ein Timer 
verwendet, um die Verarbeitung des Signals für eine bestimmte Zeit nach 
einem Interrupt auszusetzen. Dadurch kann verhindert werden, dass durch 
den Kontakt-Prell-Effekt mehrere Interrupts ausgelöst werden.

Verwendung von Hardware-Debouncing-Methoden: Dies kann ein externes 
Schaltungsteil sein, das den Kontakt-Prell-Effekt reduziert, oder eine 
Schaltung innerhalb des Mikrocontrollers, die den Prell-Effekt 
minimiert.

Es hängt von den spezifischen Anforderungen Ihres Projekts ab, welche 
Methode für Sie am besten geeignet ist. In der Regel ist eine 
Kombination aus softwareseitigen und hardwareseitigen 
Debouncing-Methoden am effektivsten.

von Stefan F. (Gast)


Lesenswert?

Hugo H. schrieb:
> Interessant, wie vielfältig die Antworten sind
Ja in der Tat

von Jobst M. (jobstens-de)


Lesenswert?

Teo D. schrieb:
> Stefan F. schrieb:
>> De-Bouncing: Hierbei wird eine Verzögerung eingebaut, bevor das
>> Signal ausgewertet wird. Hierdurch werden kurzzeitige, fehlerhafte
>> Signale unterdrückt.
>
> So ein Quatsch!
> Man merkt, das Ding hat aus'm Internet gelernt. :D

YMMD! Die KI scheint Dir überlegen! :-D

Gruß
Jobst

von Teo D. (teoderix)


Lesenswert?

Jobst M. schrieb:
> Teo D. schrieb:
>> Stefan F. schrieb:
>>> De-Bouncing: Hierbei wird eine Verzögerung eingebaut, bevor das
>>> Signal ausgewertet wird. Hierdurch werden kurzzeitige, fehlerhafte
>>> Signale unterdrückt.
>>
>> So ein Quatsch!
>> Man merkt, das Ding hat aus'm Internet gelernt. :D
>
> YMMD! Die KI scheint Dir überlegen! :-D

Du mich traurig. :(

Ja, das Thema Denouncing is für viele zu einfach, um es vollständig zu 
erfassen. Da bist du aber nicht alleine, daher ja "Er lernte von der 
Masse (Internet)"

Das Signal verzögert auswerten ist Quatsch³, das kann man sofort 
auswerten, ohne Pause. Diese Pause, gehört vor eine erneute Erfassung 
des Signals und nicht vor die Auswertung.

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Mein Ansatz wäre ein (meistens sowieso für andere Zwecke eingesetzt) 
Timer ISR der den Raster regelmäßig abfragt (1ms) und einen 
Auf/Abwärtszähler beinhaltet. Um eine gültige Tastenbetätigung zu 
erkennen, muss der Zähler einen vorbestimmten Wert erreichen. Damit wird 
die Anordnung auch mit starken Prellen fertig. Bei starken Prellen 
erhöht sich lediglich etwas die Dauer des notwendigen Tastendrucks. Wenn 
der Taster dann noch einen Widerstand bekommt, um einen ausreichenden 
Frittstrom beim Betätigen zu haben, dann dürfte diese Anordnung fast 
ewig funktionieren.

Auch lässt sich die minimale Drückdauer programmieren und kurze oder 
lange Tastendrückaktionen unterscheiden.

Peda hat übrigens hier im Forum auch einige sehr zuverlässige Lösungen 
des Problems publiziert, die einwandfrei funktionieren und ich wärmstens 
empfehle.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Teo D. schrieb:
> Da bist du aber nicht alleine

Du meinst, ich habe es nicht begriffen. Du liegst falsch! :-)

Teo D. schrieb:
> Das Signal verzögert auswerten ist Quatsch³, das kann man sofort
> auswerten, ohne Pause. Diese Pause, gehört vor eine erneute Erfassung
> des Signals und nicht vor die Auswertung.

Und genau so habe ich auch die Antwort von ChatGPT verstanden. Du aber 
nicht.


Gruß
Jobst

von Teo D. (teoderix)


Lesenswert?

Jobst M. schrieb:
> Und genau so habe ich auch die Antwort von ChatGPT verstanden. Du aber
> nicht.

Stefan F. schrieb:
> De-Bouncing: Hierbei wird eine Verzögerung eingebaut, bevor das
> Signal ausgewertet wird.

Red dich nich raus.
Da ist nichts miss zu verstehen!

von Jobst M. (jobstens-de)


Lesenswert?

Teo D. schrieb:
> Red dich nich raus.
> Da ist nichts miss zu verstehen!

Aha. Okay. Nein, mache ich nicht.

Gruß
Jobst

von PC-Freak (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forengemeinde,

danke erstmal für die rege Diskussion und den Tips hier.

Sicherlich hätte ich gleich auf Transistoren hinweisen können. Das war 
mir aber an dem Punkt unerheblich, da es mir um den Atmel ging. Dass ich 
Kontakte entprellen muss ist mir bekannt.

Aber ich hab mal recherchiert. Ist es richtig, dass der Atmega 8 nicht 
auf jedem Port per Interupt gesteuert werden kann, sondern nur Int0 und 
Int1?

Ich hätte die Schaltung nun so geplant, wie im Bild. Widerstände und 
Transistoren sind hier erst mal unerheblich. Dies können Mosfet's sein 
oder BC..., oder ähnlich.

Aber damit Ihr seht, warum ich hier nach Interupt's frage oder eben dann 
doch pollen.

Es geht nur um :
4 Eingänge an Port PD.. abfragen. Hier ist immer nur einer 'aktiv'
1 Eingang abfragen an Port PB..
1 Bit an Port PB setzen
2 Ausgänge für die Displays im Multiplexbetrieb
evtl. ein weiteres Bit aus Port B oder D um ein Disable zu setzen.

Ich habe hier den Atmega 8 als Kandidat rausgesucht. Pic's mit 28 Pins 
habe n meist nur einen 6-Bit Port, und der reicht ja nicht um ein 
Display zu betreiben.

Hoffe nun für Aufklärung gesorgt zu haben.

von Oliver S. (oliverso)


Lesenswert?

Der ATmega8 ist ja nun ein absoluter Steinzeit-Methusalem. Nimm doch 
zumindest einen 328er.

Oliver

von Gerhard O. (gerhard_)


Lesenswert?

Falls es interessiert:
Mit Shift register wie hc164 kann man mit einem 328er recht gut zurecht 
kommen. Vor einiger Zeit konstruierte ich einen UV Belichter wo 56 
Anzeige LEDs und Bargraph-LEDs angesteuert und Tasten gelesen werden 
mussten. Ein Pro-Mini hatte damit keine Probleme. Siehe hier:
Beitrag "Re: Zeigt her eure Kunstwerke (2017)"
Beitrag "Re: Zeigt her eure Kunstwerke (2017)"
Das ganze funktionierte in einer Timer ISR im Hintergrund.

von Falk B. (falk)


Lesenswert?

PC-Freak schrieb:

> Aber ich hab mal recherchiert. Ist es richtig, dass der Atmega 8 nicht
> auf jedem Port per Interupt gesteuert werden kann, sondern nur Int0 und
> Int1?

Sagt ich bereits.

> Ich hätte die Schaltung nun so geplant, wie im Bild. Widerstände und
> Transistoren sind hier erst mal unerheblich. Dies können Mosfet's sein
> oder BC..., oder ähnlich.

Wozu sollen die gut sein? Damit man dort an den Basen wieder Taster 
anschließt? Unsinnig.

> Es geht nur um :
> 4 Eingänge an Port PD.. abfragen. Hier ist immer nur einer 'aktiv'
> 1 Eingang abfragen an Port PB..
> 1 Bit an Port PB setzen
> 2 Ausgänge für die Displays im Multiplexbetrieb
> evtl. ein weiteres Bit aus Port B oder D um ein Disable zu setzen.

Trivial.

> Ich habe hier den Atmega 8 als Kandidat rausgesucht. Pic's mit 28 Pins

Der AVR ist kein PIC, auch wenn beide jetzt zu Microchip gehören.

> habe n meist nur einen 6-Bit Port, und der reicht ja nicht um ein
> Display zu betreiben.

Das kann man im Zweifelsfall auf mehrere Ports aufteilen.

von PC-Freak (Gast)


Lesenswert?

Oliver S. schrieb:
> Nimm doch
> zumindest einen 328er.

Den gibts aber anscheinend nicht in DIL-Form.

von Falk B. (falk)


Lesenswert?


von Falk B. (falk)


Lesenswert?

PC-Freak schrieb:
> Den gibts aber anscheinend nicht in DIL-Form.

Häää?

https://www.reichelt.de/arduino-atmega328-mit-arduino-bootloader-ard-atmega-328-p230602.html?&trstct=pos_2&nbc=1

Der steckt auf jedem Arduino Uno, wenn man die DIL Variante nimmt.

von Gerhard O. (gerhard_)


Lesenswert?

PC-Freak schrieb:
> Oliver S. schrieb:
>> Nimm doch
>> zumindest einen 328er.
>
> Den gibts aber anscheinend nicht in DIL-Form.

Der Pro-mini ist die nächstbeste Alternative zu DIL und ist bequemer zu 
betreiben. Siehe auch hier:
https://www.mikrocontroller.net/attachment/465145/Fuellstandmesser6.jpg
Das Arduino Zeugs lässt sich gut erweitern und in kompliziertere 
Schaltungen integrieren.

von PC-Freak (Gast)


Lesenswert?

Falk B. schrieb:
> Wozu sollen die gut sein? Damit man dort an den Basen wieder Taster
> anschließt? Unsinnig.

Nein. Diese Transistoren unten sind bereit wo verbaut, und an den 
Open-Collector schließe ich an. Dies werden von einem uC bereits 
angesteuert Auch der Kondi ist dort bereit Bestand. Es kommt hier das 
Flachbandkabel an. Ich habe die nur hier mit eingezeichnet.

von HildeK (Gast)


Lesenswert?

PC-Freak schrieb:
> Ich hätte die Schaltung nun so geplant, wie im Bild.
Ich würde hier nicht den PortC für die Segmente verwenden, weil du dann 
keinen Reset mehr hast und deshalb nur noch HV-Programmierung zur 
Verfügung. Tausche das mit PortB oder PortD.

> Aber damit Ihr seht, warum ich hier nach Interupt's frage oder eben dann
> doch pollen.
> Es geht nur um :
> 4 Eingänge an Port PD.. abfragen. Hier ist immer nur einer 'aktiv'
> 1 Eingang abfragen an Port PB..
> 1 Bit an Port PB setzen
> 2 Ausgänge für die Displays im Multiplexbetrieb
> evtl. ein weiteres Bit aus Port B oder D um ein Disable zu setzen.

Wie Falk B. schon wiederholt sagte: du hast vier Eingangssignale und 
zwei Interruptpins. Wenn du auf die Interrupts setzt, dann musst du z.B 
mit Dioden diese vier Signale verodern und das einen der IRQ-Pins legen.
Oder nimm einen anderen μC, wie vorgeschlagen wurde und nutze die 
PCINTs. Auch ein ATTiny261 (461/861) kann das.

von PC-Freak (Gast)


Lesenswert?

Falk B. schrieb:
> PC-Freak schrieb:
>> Den gibts aber anscheinend nicht in DIL-Form.
>
> Häää?
>
> 
https://www.reichelt.de/arduino-atmega328-mit-arduino-bootloader-ard-atmega-328-p230602.html?&trstct=pos_2&nbc=1

Der ist derzeit in DIL nicht lieferbar. Atmega8 bekomme ich aber.

von Spess53 (Gast)


Lesenswert?

Hi

>Der ist derzeit in DIL nicht lieferbar. Atmega8 bekomme ich aber.

Dann probiere es doch mal mit ATMega88 oder ATMega168. Vielleicht gibt 
die in Dil. Ansonsten must du halt etwas flexibler werden.

MfG Spess

von Falk B. (falk)


Lesenswert?

Hugo H. schrieb:
> Im Ruhezustand ist dieser 'High'. Nun kommt dieser Lo-Impuls
> für max. 200 ms. Darauf soll mein Atmega 8 nun reagieren.
> Wie kann ich nun diesen ausgelösten Interupt entweder in einer
> Case-Schleife oder sonstwie erfassen?

Nochmal als Hinweis. Einen externen Interrupt oder auch Pin Change 
Interrupt nutzt man nur, wenn man
- sehr schnell auf das Ereignis reagieren muss (wenige Mikrosekunden!)
- das Signal garantiert prellfrei ist
- man mit dem Signal aus dem Sleep Mode aufwachen will

In deinem Fall sind die Pulse min. 200ms breit, das ist SCHNACHLANGSAM 
für einen Mikrocontroller. Darum ist die Erfassung, ggf. Entprellung 
in einem Timerinterrut sinnvoll. Dann damit braucht es auch bei sehr 
vielen dieser Eingänge keine Spezial-IOs, die der ATmega8 nicht in der 
Anzahl hat.

von M. K. (sylaina)


Lesenswert?

PC-Freak schrieb:
> Ist es richtig, dass der Atmega 8 nicht
> auf jedem Port per Interupt gesteuert werden kann, sondern nur Int0 und
> Int1?

Ist es. Der Atmega 8 ist aber auch schon gute 20 Jahre alt, ich meine 
der kam zur Jahrtausendwende etwa raus. Pinkompatibel ist der Atmega328 
und seine Derivate und der kann auf allen Pins Interrupts ;)

: Bearbeitet durch User
von PC-Freak (Gast)


Lesenswert?

Falk B. schrieb:
> Nochmal als Hinweis. Einen externen Interrupt oder auch Pin Change
> Interrupt nutzt man nur, wenn man
> - sehr schnell auf das Ereignis reagieren muss (wenige Mikrosekunden!)
> - das Signal garantiert prellfrei ist
> - man mit dem Signal aus dem Sleep Mode aufwachen will

Danke Falk.

Werde nun dies über 'normale' Routinen lösen.

Aber nun anhängend eine 'neue Problemstellung' - oder lieber neues 
Thema?

mein Waveshare AVR ISP mkII ist gerade eben eingetrudelt.
Habe versucht unter (schlag mich nicht) 'Windows XP' zu installieren. 
Der Treiber ist auch für XP .
Treiber : LUFA-210130.zip von 
Link:https://deviceinbox.com/drivers/2046-atmel-avr-isp-mkii-driver.html
heruntergeladen. Dort steht XP, .... Win10

Er lässt sich nicht installieren! Hardware kann nicht installiert 
werden.

Woher den richtigen Treiber? - Erkannt wird er als :AVRISP mkII

von Falk B. (falk)


Lesenswert?

PC-Freak schrieb:
> mein Waveshare AVR ISP mkII ist gerade eben eingetrudelt.
> Habe versucht unter (schlag mich nicht) 'Windows XP' zu installieren.
> Der Treiber ist auch für XP .
> Treiber : LUFA-210130.zip von
> Link:https://deviceinbox.com/drivers/2046-atmel-avr-isp-mkii-driver.html
> heruntergeladen. Dort steht XP, .... Win10

Was ist denn das für ein Käse? LUFA ist Light USB for AVR Devices. Das 
ist ein Projekt, um AVRs mit USB-Modul zu nutzen. Hat aber rein gar 
nichts mit dem AVR ISP MK II zu tun!

> Woher den richtigen Treiber? - Erkannt wird er als :AVRISP mkII

Keine Ahnung, ich würde auf der Mirochip-Website suchen und nicht auf 
windigen Seiten wie dieser da.

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
Noch kein Account? Hier anmelden.