Mit Asksinpp millis() nutzen

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

kbach
Beiträge: 112
Registriert: 21.01.2014, 14:24
System: Alternative CCU (auf Basis OCCU)
Wohnort: bei Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 2 Mal

Mit Asksinpp millis() nutzen

Beitrag von kbach » 08.03.2023, 09:26

Hallo,
ich würde gern in einem AskSinPP- Sketch folgendes Signal verarbeiten:
Kommt der Burst (Cannel 0) möchte ich ein Signal an einem Ausgang (Channel 1) erzeugen.
Bildschirmfoto von 2023-03-08 08-43-13.png
Das klappt im Test mit einem Atmel328p auch sehr einfach:

Code: Alles auswählen

enableInterrupt(A4, irqUp, RISING);

void irqBurst(void) { 

  t = millis();
  if (t-t1 < 6) {
    digitalWrite(A3, LOW);
  }
  if (t-t1 > 45 ) {
    digitalWrite(A3, HIGH);
  }
  t1 = t;
}
Baue ich das jedoch in AskSinPP ein liefert millis() unerwartete Ergebnisse - es funktioniert nicht. In Loop hatte ich millis() getestet. Da liefert es die erwarteten Werte. Im Interrupt bekomme ich viel zu kleine Werte, die auch noch unerwartet springen.
Gibt es innerhalb von AskSinPP noch eine andere Möglichkeit mein Vorhaben umzusetzen?
Schon mal vielen Dank!

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Mit Asksinpp millis() nutzen

Beitrag von jp112sdl » 08.03.2023, 09:30

Innerhalb eines Interrupts tickt der millis() des ATMega nicht weiter.
Das hat nix mit AskSin zu tun...

Es gibt da aber irgendwelche Workarounds. Google mal nach "arduino interrupt millis not working"

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

kbach
Beiträge: 112
Registriert: 21.01.2014, 14:24
System: Alternative CCU (auf Basis OCCU)
Wohnort: bei Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 2 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von kbach » 08.03.2023, 10:18

millis() muss im Interrupt ja auch nicht weiter ticken. Soweit ich gelesen habe schreibt millis() in ein Register. Dieses wird beim Eintritt in die ISR ausgelesen. Anders wäre es, würde ich millis() innerhalb der ISR erneut aufrufen. Da hast Du auf jeden Fall Recht, das geht nicht, weil millis() selbst auf einem Interrupt basiert und Interrupts beim Atmel328p nicht kaskadierbar sind - habe ich zumindest so gelesen.
Die Finger habe ich mir schon wund gegoogle. Das eber gesagte war schon mein Ergebnis. Ich hoffe, das stimmt so. Im Test (ohne AskSinPP) funktioniert es ja auch so auf dem Atmel328p. Nur warum geht es mit AskSinPP nicht?

kbach
Beiträge: 112
Registriert: 21.01.2014, 14:24
System: Alternative CCU (auf Basis OCCU)
Wohnort: bei Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 2 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von kbach » 08.03.2023, 11:39

An diesem Link habe ich mich orientiert:
[url]https://arduino.stackexchange.com/quest ... outine/url]
Danach sollte das Lesen von millis() in ISR kein Problem darstellen. Tut es aber. Was habe ich da falsch verstanden?

jp112sdl
Beiträge: 12116
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 849 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Mit Asksinpp millis() nutzen

Beitrag von jp112sdl » 08.03.2023, 11:56

Geht dein AskSin-Sketch in der loop() in einen powerSave-Mode (Idle / Sleep) ?

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von papa » 08.03.2023, 12:02

Benutzt der Sketch Idle oder Sleep ?
Dann gehen die Timer zwischendurch aus und das passt dann alles nicht mehr.

Du könntest auch die LED-Klasse missbrauchen, um ein Blinksignal zu erzeugen.
https://github.com/pa-pa/AskSinPP/blob/ ... /Led.h#L31
Anfragen zur AskSin++ werden nur im Forum beantwortet

TomMajor
Beiträge: 1793
Registriert: 30.08.2017, 23:25
Hat sich bedankt: 175 Mal
Danksagung erhalten: 399 Mal
Kontaktdaten:

Re: Mit Asksinpp millis() nutzen

Beitrag von TomMajor » 08.03.2023, 12:43

millis() und AskSinPP zusammen geht oft schief da je nach Konfiguration des Sketches beide den gleichen 16bit Timer1 benutzen.

Baue dir ein eigenes millis() z.B. mit Timer2, das kannst du auch in der ISR benutzen, dein code ist an sich korrekt.
Da dies ein 8bit timer ist muss ggf. die overflow Behandlung impl. werden um auf 16bit aufzubohren falls 8bit für die Zeitspanne nicht reichen.
Viele Grüße,
Tom

kbach
Beiträge: 112
Registriert: 21.01.2014, 14:24
System: Alternative CCU (auf Basis OCCU)
Wohnort: bei Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 2 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von kbach » 08.03.2023, 14:01

Vielen Dank den Experten für die schnelle Hilfe!
Mein Fehler: powerSave-Mode(idle)
Auskommentiert und schon geht es.

kbach
Beiträge: 112
Registriert: 21.01.2014, 14:24
System: Alternative CCU (auf Basis OCCU)
Wohnort: bei Berlin
Hat sich bedankt: 5 Mal
Danksagung erhalten: 2 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von kbach » 09.03.2023, 12:57

Hallo,
nun gibt es doch noch ein Problem. Nachdem millis() funktioniert, funktioniert meine Signalerkennung soweit auch. Leider scheint da doch ab und an etwas millis() zu stören. Da dachte ich, ich könnte den Vorschlag von Tom aufgreifen und mit Timer2 ein eigenes millis() testen. Das funktioniert auf einem nackten ATMega328p auch. Leider kann ich dann mit aspsinpp die ISR nicht compilieren. Ich vermute, es liegt wieder daran, dass die EnableInterrupt benutzt wird. Die unterstützt doch aber nur Interrupts an Pins, nicht an Timern, oder habe ich was übersehen?
Mit papa's Vorschlag, die LED- Classen zu nutzen komme ich leider nicht klar - ist mir zu hoch :-(.
Wie kann ich bitte Timer2 mit asksinpp nutzen?
Gruß

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Mit Asksinpp millis() nutzen

Beitrag von papa » 09.03.2023, 13:36

Hast Du NORTC definiert ?
https://github.com/pa-pa/AskSinPP/blob/ ... ck.cpp#L44

Wie soll denn das Signal genau aussehen ? Vielleicht kann ich Dir ja das mit der LED-Klasse auch schnell erklären.
10ms an - 10 ms aus - 30 Wiederholungen ?
Anfragen zur AskSin++ werden nur im Forum beantwortet

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“