Ich versuche hier eine 4-stellige Siebensegmentanzeige mit einem Arduino Pro Mini anzusteuern, und wie immer dabei möglichst wenig selbst arbeiten zu müssen :-)
Genutzte Softwarepakete :
Arduino AVR Boards Version 1.8.6 von Arduino
nutzt g++ Version 7.3.0 im Verzeichnis avr-gcc\7.3.0-atmel3.6.1-arduino7
Ich wollte die Multiplexfrequenz hochsetzen, aber wie sie sehen, sehen sie nix. Es kam kein Interrupt vom Timer. Das lag daran, dass die Dauer zwischen 2 Interrupts auf alles was mit 32 Bit geht gesetzt wurde. Das kam dadurch zustande, dass in der Methode attachInterrupt durch 0 geteilt wurde, um diesen Wert auszurechnen.
Das wiederum lag daran, dass die private Variable _nmuxes des Objektes auf 0 stand. Häh, die hätte 4 sein sollen, weil das Objekt wegen der 4-stelligen Anzeige so erzeugt wurde.
1
#include"Arduino.h"
2
#include"uMuxOutputLib.h"
3
intpins[8]={6,7,8,9,10,11,12,13};
4
intmuxes[4]={3,2,4,5};
5
uMuxOutputLibmuxer(8U,4U,pins,muxes,200U);
6
7
voidsetup(){
8
muxer.attachInterrupt();
9
}
Ok, die Klasse hat 2 Konstruktoren, einen ohne Angabe der Multiplexfrequenz und einen mit. Der mit, lädt die gewünschte Multiplexfrequenz in eine private Variable des Objekts und ruft dann den anderen Konstruktor mit den restlichen Parametern auf. So der Plan, aber der Parameter nmuxes kommt nicht an. Im aufgerufenen Konstruktor ist der Parameter nmuxes 0, und so nimmt das Schicksal seinen Lauf.
Dürfen überladende Konstruktoren sich so
einander aufrufen
Dürfen sie. Das ist ok.
Aber vielleicht ist der Wert "200u", den Du verwendest, ungültig. Sieh mal im Quelltext nach, wie die Variable "_freq" normalerweise initialisiert wird.
uMuxOutputLib::uMuxOutputLib(uint8_t npins, uint8_t nmuxes, int *pins,
int *muxes, unsigned int freq) {
_freq = freq;
uMuxOutputLib(npins, nmuxes, pins, muxes);
}
Frage : Wo liegt der Fehler ?
Du erzeugst in deinem Konstruktor ein namenloses lokales Objekt vom Typ uMuxOutputLib, das danach sofort wieder zerstört wird. Dieses lokale Objekt hat nichts mit dem ersten zu tun. Somit landen die Parameter alle im Nirwana.
Was mir gerade so einfällt: es geht ja nicht ohne Frequenz. Wenn man keine angibt, wird ein Standardwert von 70 Hz angenommen. Praktischerweise ist ja die Frequenz auch der letzte Parameter. Also müsste es unter C++ doch möglich sein, die 70 als Standardwert vorzugeben und so aus den 2 Konstruktoren einen zu machen.
Der richtige Weg wäre einen Fork zu erzeugen (ein Klick bei github). Dann diesen Fork mit git clone auf den eigenen Rechner holen, korrigieren und wieder nach github pushen. Dann kann man einen Pull Request an den Autor schicken. Der kann das dann übernehmen oder nicht, aber man hat den Fix für sich ordentlich behandelt und kommentiert.