Lichterkette mit Interrupten steuern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Lichterkette mit Interrupten steuern

    Hallo in die Runde der Programmierer,

    prinzipell sagt die Überschrift schon vieles aber doch noch nicht alles.
    Eine Lichterkette mit der Funktion eines Lauflichtes soll über einen Rotary-Encoder gesteuert werden. Die Aufgabe des Encodes soll nun folgende sein:
    - die Weiterschaltgeschwindigkeit soll durch drehen an diesem geregelt werden.
    - dieser soll auch eine Art überschlagsfunktion enthalten, damit man Bewegungsrichtung kann.
    - zudem wünsche ich mir, dass man über diesen Encoder die Geschwindigkeit bis auf Null ( Stillstand ) herabregeln kann

    Weiterhin besitzt der Encoder eine Tasterfunktion, die dazu dienen soll, entweder das Lauflicht anzuhalten ( ein Schaltausgang bleibt dabei auf HIGH ) oder es wieder in der selben Bewegungsrichtung zu starten. Das soll abwechselnd bei einen kurzen Tastendruck ( wenn machbar unter 1 Sek. passieren). Bei einem längeren Druck auf diesen Taster soll das ganze Ding ausgehen und der AVR (ATTiny2313) in den Schlafmodus gehen. Erst wenn man wieder für mind. 3 Sek. den Taster betätig soll das Lauflicht wieder starten.

    Die Verweilzeit, oder die Anzeiten der einzelnen LEDs würde ich gerne über einen Timerinterrupt steuern.

    Ich danke allen, die hier mit wirklichen Programmcode Beispielen mitwirken. Und allen anderen, die sich über ungelegte Eier hermachen, oder meinen den Oberschlaumeier spielen zu müssen, lasst es sein.

    ein schönes Wocheende
  • Hallo September

    Was du da vor hast ist schon etwas gehobener Anspruch, was auch Erfahrung und Programmierkenntnisse in Bascom voraussetzt.
    Wie sieht es da bei dir aus? Wie würdest du dich einstufen?

    Fertigen Code wird dir hier vermutlich niemand schreiben, sondern eher Hilfestellung geben.
    Hast du denn schon selbst versucht das hinzubekommen? Wo hakt es?

    Grundsätzlich sind das verschiedene Thematiken, die du da anschneidest.

    Zum Einen sollen die Effekte per Interrupt laufen.
    Dann solltest du ja den Drehencoder abfragen, und zwar so, dass möglichst ohne dass der Laufeffekt ruckelt.

    D.h. du musst den Drehencoder vermutlich auch zu Fuß und per Interrupt abfragen.

    Dann musst du kurze und lange Tastendrucke vom Taster unterscheiden. Damit fällt Debounce weg. Und Delay kannste auch vergessen. Auch das muss per Interrupt gemacht werden.

    In Summe muss also alles in dem Interrupt machen. Zumindest würde ich das so machen.

    Ich sehe also 3 Schwerpunkte,
    • Tastenabfrage
    • Effektweiterschaltung und
    • Encoder-Abfrage
    Mein Tip wäre, einen Timer-Interrut mit z.B. 1kHz (1ms) laufen zu lassen.
    In der ISR verwendest du 3 Zählervariablen, die bei jedem Interrupt inkrementiert werden.
    Durch unterschiedliche Grenzwerte kannst du nun für die Aufgaben (Tastenabfrage, Effekt, Encoder-Abfrage) unterschiedliche Timings einstellen.

    Tasten z.B. alle 20ms, Encoder alle x ms und selbes für die Effekt-Weiterschaltung. Wobei hier der Grenzwert abhängig von Encoderwert justiert wird. Große Werte bedeuten langsame Effekte und kleine Werte schneller lauf.

    Kannst du das nachvollziehen?
  • Hier im Forum wird gerne geholfen, wenn jemand beispielsweise fehlerhaften oder nicht optimal funktionierenden Code postet. Wenn Du jetzt außer einer Vorstellung von Deinen Wünschen nichts lieferst, und im gleichen Atemzug anmerkst, dass es ja keiner wagen soll Beiträge ohne funktionierenden Code zu posten (und so liest sich das nämlich für mich), dann finde ich das ganz schön frech.

    Dies mag in anderen Foren üblich sein, bei uns jedoch nicht. Wie bereits Michael geschrieben hat, sinkt dadurch mit Sicherheit die Hilfsbereitschaft der User hier. Wer hat schon Lust Gefahr zu laufen, sich für seine Hilfeleistung im Nachhinein dumm anmachen zu lassen.

    Wenn Du Freude an unserem Forum haben möchtest, solltest Du das beherzigen.

    Gruß Christian
    Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
  • ceperiga
    Guten Abend.

    zu Michael

    Ob man das gartig nennen mag liegt wohl auf der Seite des Betrachters. In vielen Foren ist es nunmal üblich, dass sich einige Forenmitglieder über Dinge auslassen, die gar nicht zur Debatte stehen, und damit den ganzen Thread unnötig aufblähen. Das ist mir beim Durchstöbern auch hier schon aufgefalllen.

    Aber zu deiner Frage. An 5 I/O PINS ( Laut Herstellerdatenblatt PB0-PB5 ) hängt jeweils einer MOSFET Treiberstufe, die eine Kette von in Serie- oder Reihe geschalteten LEDs ansteurt. Über MCUCR INT0 und den Pins PA0 und PA1 soll, so entnehme ich das dem Datenblatt der Encoder angeschlossen und bei Toogle ein Interrupt ausgelöst werden.
    Der Taster könnte über INT1 mit PULLUP auf LOW Flanke abgefragt werden. ( Pin irgend einer aus der Gruppe PD ) bis ich mir über das Platinenlayout im klaren bin.

    zu

    Mitch64



    hier würde ich ganz ehrlich zugeben, dass ich zwar schon eine ganze Weile mit AVRs rummache, aber auch schon zur Erkenntnis gekommen bin, dass der Einstieg vor ca. 2 Jahren über ein Arduino wohl doch nicht die klügste Entscheidung war. Der damit erzeugte Code ist gigantisch aufgebläht, und kotz langsam. Vor knapp einem 1/4 Jahr habe ich mit Bascom angefangen, und schon erste, eher kleine oder as Gimik zu bezeichnende Projekte mehr zu Übungszwecken umgesetzt. Also eher der Anfänger, der aber weiter kommen will.

    Dass ich ier kein fertiges Programm geliefert bekomme, ist mir völlig klar, und erwarte ich auch nicht. Die LEDs auch Richtungsbestimmt ein und auszuschalten ist nicht das Problem.
    Jetzt zu deiner Frage im Detail woran es hakt. Zum ersten den Lauf an exakt einer Stelle anzuhalten. Da ich mich nicht nur mit dem Datenblatt auseinder gesetzt habe, sondern nun auch beginnen möchte das ganze mal in Assembler zu machen, und dabei bin ich wirklich noch der absolute Anfänger, habe ich aber schon anhand einiger Tutorials herausbekommen, dass der MC die meiste Zeit im Sleep Modus herumdämmern kann.
    Er müsste nur geweckt werden, wenn:
    1) die Verweilzeit abgelaufen ist, und die Pin-Zustände umgeschaltet werden müssen
    2) wenn er auf ein Event, einen ext. Interrupt reagieren muss

    Das würde ich jetzt so umsetzen wollen, dass die Verweilzeit zwischen den Portumschaltungen über einen Timer Overflow mit anschließender Interuptauslösung bewerkstelligt wird.
    Die ext. Interrupte beträfen somit die Taster, wie auch Encoder funktion. Bezüglich des Encoders habe ich schon in Erfahrung gebracht, dass der Interrupt gemeinsam für beide Encoder-Ports A%B auf ein Toogle hier auch wieder Pull-UP gegen GND reagieren müsste, und das Signalverhältnis zu zweiten Encoderport ausgewertet werden müsste. Ich hoffe mal das ich das richtig neschrieben habe.

    Für den Ein- und Ausschaltvorgang müsste über einen zweiten Timer erfasst werden ( nach einer Verweilzeit von ca. 20ms zum Übergehen der Tasterprellung ) wie lange dieser gedrückt wurde. Entweder das Lauflicht soll anhalten, und der aktuelle LED-Port auf High bleiben, oder zum Abschalten alle Ports auf Low gestzt werden, um dann wieder in den Sleep Modus zu verfallen.

    Ja, damit hatte ich schon fast das selbe auf dem Schirm, wie du es auch dargestellt hast.

    Noch einige Anmerkung am Rande: Mit den ganzen Zusatzbibliotheken unter C passt das mit diesem gewünschten Funktionsumfang nicht in einen 2313. Deswegen, und weil auch die Verfügbarkeit anderer AVRs mit entsprechender Portanzahl zZ eher beschränkt ist, ich aber auch nicht auf einen fetten Mega zugreifen will, ich aber auch schon sehr gute Meinungen und Kritiken, besonders über den schlankeren Code -> Hex-File gelesen habe, wollte ich es nun auch einmal damit versuchen.

    und zum Schluss zu

    ceperiga

    genau solche Beiträge wie einer übe deinem Post sind die, die meinte. Nichts aber auch gar nichts zum Thema beitragen, aber fette und dumme Sprüche ablassen. Damit stelle ich diese Aussage


    ceperiga schrieb:

    Dies mag in anderen Foren üblich sein, bei uns jedoch nicht. Wie bereits Michael geschrieben hat, sinkt dadurch mit Sicherheit die Hilfsbereitschaft der User hier. Wer hat schon Lust Gefahr zu laufen, sich für seine Hilfeleistung im Nachhinein dumm anmachen zu lassen.
    schon einmal in Frage.
    Auf klare Fragen gibt es klare Antworten.

    Wenn ich gefragt hätte, wer schreibt mir für Geld ein entsprechendes Programm schreibt, würde ich diese Antwort von Charly so stehen lassen.

    Wer etwas definiertes einfordert, sollte sich dann auch an seine Definitionen erinnern.

    Und ebenso diese Vermutungen, dass ich über einen nur mittelprächtigen Programmcode mit Schimpf und Schande herfallen würde, gehört in den Bereich von spekulativen Annahmen.

    gute Nacht und Gruße nach draußen
  • Also du willst das Licht nach Links oder nach Rechts laufen lassen und in der "Mitte" bleibt es stehen? Sprich du willst nen "Nullpunkt"?

    Für das Stoppen brauchst du ja nur ne Variable die auf True oder False gesetzt wird mit deinem Taster. Wenn einer der beiden gesetzt ist, wird auf den anderen gewechselt.

    Wie steuerst du die Durchschaltung an den Pins mit dem LED's denn an? Delay kannst ja erden. In dem Moment "steht" dein Programm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von darasol ()

  • Hallo,

    im Prinzip fast richtig.
    Nur besteht zudem der Wunsch, deswegen finde ich den Begriff Nullpunkt unpassend, dass das Lauflicht aus der Anhalteposition via Taster, dann auch wieder via Encoder Dreh in die eine oder andere Richtung gestartet werden kann. Damit, wenn du den Anhaltpunkt, oder wie man diese Stelle auch immer bezeichnen will, gibt es keinen festen Punkt oder Stellung des Encoders, der bestimmt das die Bewegung jetzt gestoppt werden soll.

    Gruß und gute Nacht
  • hallo Pluto
    gestatte mir die Frage - kannst du lesen ? und das gelesene auch verstehen ?
    Bereits im Eingangspost, entgegen deiner Behauptung , seht zu lesen um welchen AVR es sich handel.
    Für dich noch einmal ganz groß ATMEL ATTINY 2313
    in meiner ersten Antwort steht zu lesen, welche Pins genutzt werden sollen, und wie die nachfolgende Ansteuerung der LEDs erfolgen wird.
    Beitag 4 und 5 haben mit dem eigentlich Thema gar nichts zu tun, dass fällt nur unter die Kategorie "Betroffene Hunde bellen" !
    Danke das du mir für diese Beiträge auch noch die Schuld gibst
    Was den Schaltplan angeht, ist das vollkommen egal, den die Pins sind genannt, und es soll hier auch nicht darum gehen, wie man LEDs nachfolgend einer AVR ansteuert, oder wie das Platinenlayout mal sein soll. Der Ansteuerzustand der LEDs wird mit einem High Pegel erfolgen. Aber das steht auch schon da. Nun die Frage zurück, was hat dein Beitrag inhaltlich mit meiner Anfrage zu tun ?
    Grüße



  • Ich hätte ja gerne geholfen, aber die Informationen sind zu dünn, um überhaupt ein Codeschnipsel schreiben zu können.
    Ein Schaltplan sagt halt doch mehr aus, wie sich die Pins im Thread zusammen zu suchen. System-Takt ist ja auch unklar.
    Ebenso ist unklar wie viele LED's da anzusteuern sind und wie schnell der Durchlauf-Effekt sein soll.

    Und wenn sich hier jeder selbst ein Schaltplan malen soll (aufgrund deiner dünnen Angaben), finde ich das auch nicht in Ordnung.

    Du willst hilfe? - Dann benimm dich entsprechend.
    Kennst du den Spruch: "Die Hand die einen Füttert, die beißt man nicht"?
    Denk mal drüber nach.

    Für mich ist dieser Thread an dieser Stelle beendet, und ich habe auch keine weitere Motivation mehr, hier noch helfen zu wollen.
    Die Herausforderung mit dem Code wäre interessant gewesen. Aber ich werde wohl mein Wissen für mich behalten.
  • hallo

    danke.
    Das Thema hat sich nun ohnehin erledigt.
    Danke einer besseren Community als die hier, und einem sehr guten Tutorial habe ich das Problem nun allein fast über Nacht lösen können.

    Ich verstehe auch nicht die grundsätzlich Einstellung hier, dass man einen Schaltplan posten soll, wenn in der Programmierung ohnehin nur die Portbezeichnungen relevalt sind. Was nützt der beste oder schlechteste Schaltplan, wenn dort nur PIN-Nummern, aber keine Portbezeichnungen dranstehen ? Aber wenn ihr euch die Arbeit machen wollt, erst im Datasheet nachzulesen, hinter welchem PIN welcher Port steckt, eure Sache.
    Man(n) kann auch übe dieses Forum von schon einem fast begeisterungsfähigen Eifer sprechen, mit dem man sich um Randerscheinungen mehr kümmert, als durch gezielte Rückfragen, fehlende Informationen einfordert.

    @Michael -> du hast mich als einziger hier, auf den richtigen Dreh gebracht.

    Damit Thema beendet und der Thread kann von mir aus auch geschlossen, auch gelöscht werden.

    bleibt alle schön Gesund
  • Ich denke auch, Du bist in einem anderen Forum besser aufgehoben. Ich "belle" übrigens, wenn es mir passt, da ich Administrator dieses Forums bin. Das kehre ich eigentlich nie raus und reagiere auch selten auf solche Beiträge. Du hast dich allerdings schon im Ton vergriffen. Wenn Du das nicht bemerkt hast, sollte Dir das eigentlich zu denken geben.

    Sicherlich schweifen die Threads in unserem Forum manchmal aus, aber das ist für die meisten von uns Hobby und stört uns nicht weiter. Der Grundton ist im Kern freundlich. Nur manchmal muss man etwas moderieren :)

    Wir löschen übrigens Beiträge nur aus wichtigem Grund. Deine Ausführungen bleiben also erhalten.

    Apropos Bellen: wer mit so einem ellenlangen Post (6) reagiert, erweckt den Eindruck, selber getroffen worden zu sein :D

    Viel Erfolg bei Deinem Projekt

    Christian
    Wenn das die Lösung ist, möchte ich mein Problem wieder haben.