 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4760 Aktiv.: 20.19 Kraj: Kobarid
|
Objavljeno: Sob Mar 11, 2023 5:25 pm Naslov sporočila: ESP32 prekinitve in timerji |
|
|
Čisto brez idej sem ostal. Kot da bi prvič programiral Delal sem že z zunanjimi prekinitvami in tudi timerji, ampak skupaj ne gre in ne gre. Po enem tednu še vedno nisem spisal delujočega primera.
Gre za to, da ob zunanji prekinitvi počakam za čas med 0 in 18ms potem sprožiti GPIO za 100uS in ga ugasnem.
Zunanje prekinitve pa se prožijo vsakih 20ms
Program pa mora biti pisan z prekinitvami zaradi točnosti timingov in tudi zato, da lahko v ozadju počnem še kaj drugega kot čakam.
hvaležen bom za vsak namig
Gre za pa za grelnik vode. In ne, opcija kjer časovno vklapljam grelec mi ni všeč! Na ta način lahko nadzorujem moč grelca in tudi bolj natančno je ter v neposredni bližini grelca ne pregreje medija. _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
eboc Član

Pridružen-a: Tor 10 Maj 2005 8:42 Prispevkov: 261 Aktiv.: 1.11
|
Objavljeno: Ned Mar 12, 2023 9:28 pm Naslov sporočila: |
|
|
samo ideja. V ISR se nekaterih stvari ne sme in nekaterih stvari ne mora delati. Mogoče sem spada tudi uporaba timerjev v ESP32.
ISR se mora hitro izvesti.
Mogoce bos moral resiti, da imas thread, ki caka na "signal" iz ISRja.
A to programiraš direkt v SDK Cju ali v Arduino? |
|
Nazaj na vrh |
|
 |
tilz0R Član


Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 5.70 Kraj: Črnomelj
|
Objavljeno: Ned Mar 12, 2023 11:31 pm Naslov sporočila: |
|
|
eboc je napisal/a: |
samo ideja. V ISR se nekaterih stvari ne sme in nekaterih stvari ne mora delati. Mogoče sem spada tudi uporaba timerjev v ESP32.
ISR se mora hitro izvesti.
Mogoce bos moral resiti, da imas thread, ki caka na "signal" iz ISRja.
A to programiraš direkt v SDK Cju ali v Arduino? |
V ISR samo štartaš timer. One time deal. _________________ Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4760 Aktiv.: 20.19 Kraj: Kobarid
|
Objavljeno: Pon Mar 13, 2023 6:55 pm Naslov sporočila: |
|
|
V prekinitvi samo štartam timer. V prekinitvi timerja pa samo prožim izhod.
Zagotovo imam nekaj narobe, samo kaj.....
Je pa največjoi hec, ker bi rad vsakič znova nastavil čas timerja. Tu v mojem testnemu primeru so časi ogromni, da lahko opazujem delovanje.
ja arduino okolje
Koda: |
void IRAM_ATTR prekin() {
timerAlarmEnable(timer);
}
void IRAM_ATTR onTimer() {
// Reset the delay time variable to the initial value
digitalWrite(LED,1);
delayTime += 1000;
timerWrite(timer,0);
timerAlarmWrite(timer, delayTime*1000, false);
}
void setup() {
// Initialize serial communication
Serial.begin(115200);
delayTime = INITIAL_DELAY;
// Attach the external interrupt to the interrupt pin
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), prekin, FALLING);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, delayTime * 1000, false);
}
void loop() {
delay(1000);
digitalWrite(LED,0);
} |
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
eboc Član

Pridružen-a: Tor 10 Maj 2005 8:42 Prispevkov: 261 Aktiv.: 1.11
|
Objavljeno: Pon Mar 13, 2023 8:39 pm Naslov sporočila: |
|
|
Kaj pa dela oz. ne dela?
Vecina ESP32 ima 2 jedri lahko bi tu tical problem: kje se ISR izvede. |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4760 Aktiv.: 20.19 Kraj: Kobarid
|
Objavljeno: Pon Mar 13, 2023 9:08 pm Naslov sporočila: |
|
|
Poiskusil sem z dvojedernim ESP32 wroom in enojedernim ESP32-C3. Isto je.
Ma poiskusil sem že en kup opciji
Karkoli probam ali se zresetia ali da deluje samo na prvo prekinitev ali deluje neprekinjeno pa da se nov čas ne nastavi... Skratka poznam vse kombinacije le tiste ne, kot bi želel  _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4760 Aktiv.: 20.19 Kraj: Kobarid
|
Objavljeno: Pon Mar 13, 2023 9:49 pm Naslov sporočila: |
|
|
Evo končno
Problem je bil, ko sem v prekinitvi nastavljav novo vrednost. Ne sme se! Četudi je timer izklopljen!
Koda: |
hw_timer_t *timer = NULL;
// Define the delay time variable
int delayTime = INITIAL_DELAY;
void IRAM_ATTR prekin() {
timerWrite(timer,0);
timerAlarmEnable(timer);
}
// Define the timer interrupt handler function
void IRAM_ATTR onTimer() {
// Reset the delay time variable to the initial value
Sedaj pa novim problemom na proti!
digitalWrite(LED,1);
delayTime += 1000;
timerAlarmDisable(timer);
}
void setup() {
// Initialize serial communication
Serial.begin(115200);
delayTime = INITIAL_DELAY;
// Attach the external interrupt to the interrupt pin
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(INTERRUPT_PIN, prekin, FALLING);
//attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), prekin, FALLING);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, delayTime * 1000, false);
pinMode(LED, OUTPUT);
}
void loop() {
int aaa;
// Do nothing
timerAlarmWrite(timer, delayTime*1000, false);
delay(1000);
digitalWrite(LED,0);
} |
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 458 dni
Powered by phpBB © 2001, 2005 phpBB Group
|