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 ?
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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
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 ...
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.... ;)
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)
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
Ich glaub, ich bin kein Pessimist, sondern stehe auf der Leitung.
Hausaufgabenerledigung effizient :-(
Hat gedauert, bis der Groschen gefallen ist, sorry.
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
intmain(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.
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
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 ...
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
...
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.
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
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.
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.
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
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!
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.
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.
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.
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.
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.
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.
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
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.
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 ;)
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
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.