Hallo,
ich habe ein Projekt (nicht von mir) dass hervorragend auf einem ArduinoProMini läuft. Nun soll dieses Projekt künftig auf einem ESP32 laufen.
beim Kompilieren kommt folgende Fehlermeldung: 'SREG' was not declared in this scope
Soviel ich nun herausgefunden habe handelt es sich um Interrupt Funktion.... sofern das stimmt.... ich weiß was Interrupts sind jedoch habe ich das noch nie benutzt.
Wie gehe ich nun am besten vor, dass ich dieses Problem löse?
Hallo combie,
richtig wie erwähnt möchte ich eine Portierung von einem "ArduinoProMini" Projekt zu einem "ESP" machen. Wenn du erklären kannst was SREG ist und was das Pendant bei einem ESP ist dann wäre das hilfreich.
Hier der CodeSchnipsel wo überall SREG abgefragt wird:
uint8_t oldSREG = SREG;
cli();
TCCR1A = 0; //disable pwm by turning off COM1A1,COM1A0,COM1B1,COM1B0
if (state == PilotState12V) {
*out |= m_bit; // set pin high
}
else {
*out &= ~m_bit; // set pin low
}
SREG = oldSREG;
m_State = state;
}
//-- set EVSE duty cycle outputting a 1KHz square wave to digital pin 11 via Timer 1 ----------------------------------------------------------------------------------
int J1772Pilot::SetPWM(int amps)
{
float duty = 0.0;
float famps = (float) amps;
duty = famps / 0.6; // duty cycle in %
if (duty) {
// Timer1 initialization:
// 16MHz / 64 / (OCR1A+1) / 2 on digital 9
// 16MHz / 64 / (OCR1A+1) on digital 10
// 1KHz variable duty cycle on digital 10, 500Hz fixed 50% on digital 9
// pin 10 duty cycle = (OCR1B+1)/(OCR1A+1)
uint8_t oldSREG = SREG;
cli();
TCCR1A = _BV(COM1A0) | _BV(COM1B1) | _BV(WGM11) | _BV(WGM10);
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11) | _BV(CS10);
OCR1A = 249;
// 10% = 24 , 96% = 239
OCR1B = (int)((2.5 * duty) - 1.0);
SREG = oldSREG;
Warum das so in der Software eingebaut ist weiß ich leider nicht, da ich diese nicht erstellt habe.
Der dürfte einen ATmega328 als µC haben. Im Datenblatt findet sich "SREG – AVR Status Register". Es handelt sich um ein hardwarenahes Register, das es beim ESP32 so nicht gibt.
Beim Portieren kannst Du also nur die Funktionalität übertragen, nicht die Register.
Das sind Register vom Timer 1. Die drei Timer können unterschiedlich konfiguriert werden, sind also multifunktional. Was sie in Deinem Programm genau machen, ergibt sich aus dem Zusammenhang.
deshalb bin ich ja auch hier gelandet bzw. wäre natürlich vorteilhafter wenn sich jemand meldet der dieses Thema schon mal hatte und seine Expertise teilt... und der nächste der dann diese Problem hat und diesen Beitrag liest wäre sicher auch dankbar keine Diskussion um ein Thema herum lesen zu müssen sondern schnellst möglich die Lösung
Dein Programmausschnitt zeigt, daß da in C auf die AVR-Hardware zugegriffen wird.
Vermutlich wird es im Rest des Programms ähnlich aussehen.
Das läuft mehr oder weniger auf ein neuprogrammieren für den ESP32 hinaus.
Um welches Projekt geht es denn?
Das hast du da für SREG gefragt. Gilt aber für ALLES. Es ist nicht mal selbstverständlich, was das Pendant für ein int ist. Klar, eigentlich sollte in der AVR-Software int nur verwendet werden, wenn es für die Programmlogik egal ist, ob sich dahinter ein int_16t oder ein int32_t verbirgt. Aber das hat vermutlich nie jemand geprüft.
Dann wird das nichts. Sorry. Die Frage ist eher:
Ist es sinnvoller zu versuchen, die Quelle anzupassen, oder sollte man die gewünschte Funktionalität für den ESP neu erfinden?
Oder kann man gar die Funktionalität auch Hardware-unabhängig realisieren, und findet libs, die einem die Hardware-Abhängigkeit abnehmen?
Leute, leute....
Merkt ihr es denn gar nicht?
Ihm möchte, dass du, du und ich, ihm das bauen.
Irgendwelchen geheimen Kot reparieren.
Natürlich zügig, ohne Widerworte und Nachfragen. (das nervt alles nur)
Ihm selber kann das nicht, und will das auch offensichtlich nicht lernen!
Leute, leute....
Merkt ihr es denn gar nicht?
Ihm möchte, dass du, du und ich, ihm das bauen.
Irgendwelchen geheimen Kot reparieren.
Natürlich zügig, ohne Widerworte und Nachfragen. (das nervt alles nur)
Ihm selber kann das nicht, und will das auch offensichtlich nicht lernen!
ich bitte, dass hier sachlich und höflich diskutiert wird. Deine Beiträge sind zur Lösungssuche aber definitiv nicht hilfreich sorry!
Mittlerweile bin ich schon etwas weiter aber es tun sich lediglich noch mehr Fragezeichen auf.... ich muss das jetzt alles mal sichten damit ich meine Fragestellungen etwas detaillierter ausführe... Meine Eingangsvermutung bzw. Hoffnung, dass man statt SREG eine einfache Funktion oder andere Bezeichnung einfügt die dann auch für einen ESP passt und identisch funktioniert stellt sich mittlerweile als falsch heraus. Da geht es nun doch weiter in die Tiefe als ich ursprünglich gedacht hätte.
Hier wird in dem Register der allgemeine Interrupt ausgeschalten und danach der ursprüngliche Zustand wiederhergestellt. Unabhängig davon ob dieser vorher eingeschalten war oder nicht. Im allgemeinen bei Arduino immer eingeschalten. Das ESP Pendant kenne ich nicht.
Die SetPWM Methode ist etwas seltsam. Damit soll ein 1kHz Takt erzeugt werden mit einstellbarer Pulsweite. Schön und gut. Nur dazu muss man nicht mit jeden Aufruf die Timer Register neu initialisieren. Dazu reicht es nur die Pulsweite (OCR1B) zu ändern unter Einhaltung das dieser Wert nicht größer der Periode (OCR1A) ist. Dazu muss man auch keine allgemeinen Interrupt aus- und einschalten. Das trennt man in 2 Funktionen auf. Init und setDuty.
Das zum Grundverständnis. Nützt dir für den ESP nicht viel. Außer du kniest dich in die Register rein was die beim AVR und ESP machen. Das geht dann richtig in die Tiefe, dass geht ans Eingemachte. Besser wirst du kommen wenn du für den ESP eine Timer Lib hast die du stattdessen verwendest. Du musst ja nichts weiter machen wie den passenden Wert berechnen und der Funktion/Methode übergeben.
Es ist völlig ok, wenn dir meine Antworten nicht schmecken.
Aber mal im Ernst:
Eine solche PWM mit einem ESP32 zu erzeugen ist ein Klacks.
5 Minuten ESP Doku lesen, dann 2 Minuten schreiben und vielleicht noch 1,5 Minuten testen.
Auch für einen völligen Anfänger in der Zeit möglich.
Die anderen, da vermutlich noch auftretenden Schwierigkeiten, kann hier keiner, dank deiner Informationspolitik, erraten.
Also hacke gerne weiter auf mir rum.
Aber bedenke: Wenn du dich nicht bewegst, wirds wohl nix.
Alternativ:
Wende dich an den Ersteller der Library/Anwendung.
PS:
Ich erwarte, dass hier jeder freiwillig die Doku liest.
Untertänige Erfüllungsgehilfen sind auch hier selten
ach weisst Du, ich bin da nicht sonderlich böse bei solchen Threads. Es erspart es mir, mich mit fremden Code oder Projekten auseinaderzusetzen.
Würde ich sonst womöglich machen. Ich behaupte mal, relativ gut über den ESP32 bescheid zu wissen und mit AVR bin ich sozusagen groß geworden, wenn auch mehr in ASM als in C.
Wenn das alles ist, wäre analogWrite(pin, pwmWert);
alles was im Sketch stehen muss. Wenn ein ESP32 überhaupt PWM-Unterstützung bietet, ist das also alles. Ob die PWM-Frequenz unbedingt exakt dieselbe wie bei einem echten oder einem AVR- Arduino oder wie in diesem Sketch sein muss, ist eventuell völlig wurscht. Nur weil du ein Programm hast, was auf der bisherigen Hardware läuft, muss man das ja nicht unbedingt 150% genau so auf einer anderen Hardware machen.