Port Byteweise abfragen JO-IT-Mega r3

Danke Combie

Das du dich mit dem Datenblatt befasst ist mir Sonnenklar und sehe ich an deinen Ausführungen. Deine Anregung Datenblatt lesen ist ja richtig und nehme ich auf, da gibt es Erklärungen die ich verstehe und umsetzen kann, manch anderes erschließt sich einfach nicht (ADCW). Vielleicht wird in einigen Jahren doch noch ein Programmierer aus mir :wink:

Ich vermute das ADCW nichts mit deinem ADC Projekt zu tun hat.

Möchte.. (Hier jetzt die Aufgabe, Pin A0 unter Zuhilfenahme der 1,1V Referenz lesen und A1 mit der Vcc Referenz) versuchen.)
Wozu sind die Referenzen nötig, geht es da um mehr Genauigkeit?

Es wird genutzt!

    #if defined(ADC_MODELL_MEGA_BIG)
      int Adc::readValue()
      {
    //    byte muxbits = ADMUX & 0b00011111; // sourceMask
        if((lastMux > MUX_ADC7) && (lastMux < MUX_REF)) // differenzalinput
        {
          int value = ADCW;
          return (value & _BV(9))?value | 0b1111111000000000:value; // Vorzeichen erweitern
        }
        return (ADMUX&_BV(ADLAR))?ADCH:ADCW;
      }
    #endif

Wenn du den ganzen Code zeigen würdest, gäbe es bestimmt eine Vorschläge.

Dazu wird es sicher einige Meinungen geben.

Ziel ist aus einer vorgebenen Leistung z.B 200 Watt die Phasenanschnittlänge zu berechnen und Stufenlos per Digital Ausgang den Triak anzusteuern.
Dabei habe ich auf Schleifen, Interupts und Delay verzichtet um viele Programmzyklen zu schaffen.
Seit ich von DigitalRead auf PinX umgestellt habe funktioniert das Super im Prinzip fertig. Nur wenn Analogread ausgeführt wird treten einzelne Blinzler auf.
Jetzt möchte ich diesen Weg mal weiterverfolgen und sehen wo es hinführt.

Wenns eine Sackgasse wird werde ich dein Angebot gerne annehmen

wird es schon mal nicht gehen.

Vielleicht der falsche Weg. Um den Nulldurchgang zu finden bietet sich ein Interrupt an.

macht man dann in den ermittelten Pausen wo es nicht stört.

Weil analogRead() den Wandlungsvorgang startet und wartet bis er fertig ist, also kurz blockierend wirkt. Deswegen in dem Fall besser den gesamten Vorgang aufteilen. Wandlung starten, in der Zwischenzeit andere Dinge machen und entweder per Interrupt das Ende der Wandlung signalisiert bekommen oder ohne Interrupt auf das Flag pollen.

Warum nicht.
X ySek. nach Nulldurchgang schaltet der DA das Triakgate ein, Ergebnis einer Formel.
Die Reaktionszeit des DA fällt da nicht groß ins Gewicht.

Das ist die Idee, der kritische Moment wo nichts blockieren soll ist der Nulldurchgang und das Timing der Anschnittdauer zu berechnen . Also werde ich einfach zum Test Analogread mit einem Flag kurz sperren.

Danke, das könnte den Blinzler erklären.
Mir gefällt mal die Idee von wwerner ganz gut, Analogread ausführen wenns nicht stört.

Andererseits die Wandlung starten und in der Zwischenzeit im Programm weitermachen ohne Interrupt auf das Flag pollen wär schon elegant.
Schaut kompliziert aus, wäre das so eine art Multithreding selbstgebaut?

Interrupts:
Wenn ich das richtig verstanden habe blockiert ein Interrupt u.a. den Timmer bis er wieder gelöst wird. Dann würden Zeitvergleiche die andere Funktionen steuern in die Hose gehen.
Mir ist es lieber ich Programmiere im Vordergrund etwas mehr und habe dann Abläufe die ich besser durchschauen kann.
Hat vielleicht auch mehr Lerneffekt

Auch, aber auch um ausnutzen der Auflösung.

Mach doch!

Der ADC Block arbeitet sowieso unabhängig vom Rest des Kerns.

Du wirst schon wissen was du warum tust.

Daher ist es wichtig, den Interrupt so kurz wie möglich zu machen. Also nur eine Zeit speichern oder eine Variable setzen.

Wie gesagt, zeige mal den ganzen Code.

So gehts keine Blinzler mehr

Schade, eigentlich...

Momentan bin ich mit der einfachen Lösung zufrieden, es soll ja auch mal in Betrieb gehen. Luft zum Optimieren ist sicher noch vorhanden😁

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.