www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

ESP32 prekinitve in timerji

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4580
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Sob Mar 11, 2023 5:25 pm    Naslov sporočila:  ESP32 prekinitve in timerji Odgovori s citatom

Čisto brez idej sem ostal. Kot da bi prvič programiral Sad 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
eboc
Član
Član



Pridružen-a: Tor 10 Maj 2005 8:42
Prispevkov: 258
Aktiv.: 1.16

PrispevekObjavljeno: Ned Mar 12, 2023 9:28 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Ned Mar 12, 2023 11:31 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4580
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Pon Mar 13, 2023 6:55 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
eboc
Član
Član



Pridružen-a: Tor 10 Maj 2005 8:42
Prispevkov: 258
Aktiv.: 1.16

PrispevekObjavljeno: Pon Mar 13, 2023 8:39 pm    Naslov sporočila:   Odgovori s citatom

Kaj pa dela oz. ne dela?
Vecina ESP32 ima 2 jedri lahko bi tu tical problem: kje se ISR izvede.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4580
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Pon Mar 13, 2023 9:08 pm    Naslov sporočila:   Odgovori s citatom

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 Sad

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4580
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Pon Mar 13, 2023 9:49 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group