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 ?
Frag ChatGPT. Seit es das gibt, kann sich niemand mehr damit rausreden, daß googeln zu kompliziert ist. Oliver
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.
Oder den Interrupt auf Flanke einstellen und danach für ein paar ms deaktivieren.
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.
Wolfgang schrieb: > Der Timer-Interrupt löst regelmäßig das Lesen des Tasterzustandes ab und > alles wird gut. In der Tat, siehe Entprellung.
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.
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
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
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 ...
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
:
Bearbeitet durch User
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 | 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.
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.
:
Bearbeitet durch User
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
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!
Teo D. schrieb: > Red dich nich raus. > Da ist nichts miss zu verstehen! Aha. Okay. Nein, mache ich nicht. Gruß Jobst
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.
Der ATmega8 ist ja nun ein absoluter Steinzeit-Methusalem. Nimm doch zumindest einen 328er. Oliver
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.
Oliver S. schrieb: > Nimm doch > zumindest einen 328er. Den gibts aber anscheinend nicht in DIL-Form.
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.
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.
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.
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 ;)
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.