Čudno obnašanje

Arduino je pojav za katerega bi težko rekli, da opisuje samo HW ali samo SW, zato mu tu namenajm poseben prostor.

Moderator: tilz0R

Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 25 Sep 2025, 21:04

Pozdravljeni,

Arduino se mi zelo čudno obnaša.

Torej tukaj imam void, ki skrbi za nastavljanje simbolov. Vhodni parameter index pove, katero mesto Stringa call hočem spreminjati. Najprej vzame začetno vrednost na tem mestu, nato pa se spreminja z vrtenjem enkoderja (rot).

Koda: Izberi vse
void editCallsing(uint8_t index){
    rot = call[index];
    while(!digitalRead(OK_BTN)){
        call[index] = (uint8_t)rot;
        sendStringDataToDisplay(call, "t2");
        _delay_ms(150);
    }
}


Ker je najdaljša dolžina klicnega znaka 6 znakov to funkcjo kličem 6x:
Koda: Izberi vse
if(input[1] == '0'){
    for(uint8_t i = 0; i < 6; i++){
         _delay_ms(100);
         sendDataToDisplay(i, "h0");
         editCallsing(i);
     }
}


Ta vrstica nastavi cursor, da veš kateri znak urejaš.
Koda: Izberi vse
sendDataToDisplay(i, "h0");


Problem je v tem, da se program ne ustavi v while() zanki. Vhod OK_BTN je nastavljen kot INPUT_PULLUP in napetosti so prave. Dodal sem še 1k pullup upor.


Ali ima kdo kakšno idejo, kaj bi še naredil?

lp, Lovro
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a VolkD » 25 Sep 2025, 23:15

Verjetno nima veze s tvojo težavo,... No vseeno poizkusi pobegniti od funkcije _delay_ms(). Tvoj način pisanja namreč iz zajčka naredi želvico, saj procesor večino časa ne dela ničesar in ta čas ni na voljo ostalim opravilom.
Razišči funkcijo millis().
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 67341
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20435 krat
Prejel zahvalo: 10482 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Čudno obnašanje

OdgovorNapisal/-a VolkD » 26 Sep 2025, 00:53

Mogoče ti bo tole bolj v pomoč: https://forum.arduino.cc/t/using-millis ... ide/483573

Cel prograqm boš torej moral zastaviti precej drugače,... mogoče bo potem tudi tvoja napaka izginila. Sploh če boš najprej pogledal kako je z gumbom.
Tole bo tudi dobro branje: https://forum.arduino.cc/t/correct-use- ... 1177014/10
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 67341
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20435 krat
Prejel zahvalo: 10482 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 26 Sep 2025, 07:27

VolkD je napisal/-a:Verjetno nima veze s tvojo težavo,... No vseeno poizkusi pobegniti od funkcije _delay_ms(). Tvoj način pisanja namreč iz zajčka naredi želvico, saj procesor večino časa ne dela ničesar in ta čas ni na voljo ostalim opravilom.
Razišči funkcijo millis().


Millis() in delay() sem se izogibal, ker naredita interrupt na vsako 1us kar bi zelo upočasnjevalo delovanje. Sploh, ker takrat računa z unsigned long.

_delay_ms() pa je v editCallsign() zaradi komunikacije z zaslonom. Tukaj bom naredil, da pošlje celoten nov znak, če se razlikuje od starega. _delay_() pa mora biti v for zanki zaradi gumba, da ne bo preskočilo umesnih mest.

Bom poizkusil == LOW
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 26 Sep 2025, 07:31

******* sem smotan…

Vse je čisto neumna napaka razmišljanja. Stanje vhoda je normalno 5V (1), ko pa pritisnem gumb je pa 0V (0).
while(!1) bo težko prešel v zanko :_banghead

Seveda sem to odkril šele ko sem pisal prejšnji prispevek.
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a VolkD » 26 Sep 2025, 07:47

Lovro7 je napisal/-a:Millis() in delay() sem se izogibal, ker naredita interrupt na vsako 1us kar bi zelo upočasnjevalo delovanje.

Millis() != delay() !!!

Najpočasnejša pa je dejansko tvoja varianta, saj v času _delay_ms() procesor dobesedno stoji ( vrti se v "prazni" zanki).

Pri interuptih moraš vedno paziti kako časovno potratna je koda, ki se pod takim interuptom izvaja. En sam INC, pa čeprav long, je zanemarljiv. Razen tega je pomembno tudi, kako boš porabil čas, ko "procesor ne dela nič". Še več,... fino je tudi, da lahko vidiš koliko časovne rezerve še imaš (štetje loop-ov glavne zanke).
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 67341
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20435 krat
Prejel zahvalo: 10482 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 26 Sep 2025, 09:32

VolkD je napisal/-a:
Lovro7 je napisal/-a:Millis() in delay() sem se izogibal, ker naredita interrupt na vsako 1us kar bi zelo upočasnjevalo delovanje.


Najpočasnejša pa je dejansko tvoja varianta, saj v času _delay_ms() procesor dobesedno stoji ( vrti se v "prazni" zanki).

Pri interuptih moraš vedno paziti kako časovno potratna je koda, ki se pod takim interuptom izvaja. En sam INC, pa čeprav long, je zanemarljiv. Razen tega je pomembno tudi, kako boš porabil čas, ko "procesor ne dela nič". Še več,... fino je tudi, da lahko vidiš koliko časovne rezerve še imaš (štetje loop-ov glavne zanke).


Tukaj se čisto strinjam. V for zanki imam namenoma _delay_ms(), ki ustavi vse razen interruptov, kar mi je tudi cilj.

Drugače pa delaya ne uporabljam nikjer druge v kodi ravno zaradi tega.
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 26 Sep 2025, 22:58

Sedaj vse deluje!

Tisti interupti za funkcijo millis() so ovirali delovanje enkoderja. Zato sem napisal svojo funkcijo mill(), ki uporablja timer1, da naredi interupt vsakih 10ms.
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a VolkD » 27 Sep 2025, 00:05

Lovro7 je napisal/-a:Tisti interupti za funkcijo millis() so ovirali delovanje enkoderja. Zato sem napisal svojo funkcijo mill(), ki uporablja timer1, da naredi interupt vsakih 10ms.
Ne sprejmem tvoje razlage kot pravilne. Imam delujoč rotacijski enkoder in uporabljam tudi millis() funkcijo.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 67341
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 20435 krat
Prejel zahvalo: 10482 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Čudno obnašanje

OdgovorNapisal/-a Lovro7 » 27 Sep 2025, 02:25

VolkD je napisal/-a:Ne sprejmem tvoje razlage kot pravilne. Imam delujoč rotacijski enkoder in uporabljam tudi millis() funkcijo.


Ja, sem se tudi malo čudno izrazil. Nimam samo interrupta za enkoder. Imam tudi interrupt za sprejemanje in oddajanje, ADC in še za programski serijski port. Večji problem kot enkoder je ta programski serijski port.
Ko so se vsi ti interrupti nakopičili je bil manjši problem tako na sprejemu po serijskem portu kot na enkoderju, ki je malo zaostajal.

1 cikelj ure pri 16MHz traja 0,0625us. To pomeni, da bo naredil 16 ciklov vsako us. V teh 16 ciklih je tudi ta millis(). Potem pa je vprašanje, koliko to ovira progam?
Seveda pa je odvisno, kakšna je ostala koda. V tem primeru je čas pri programskem serijskem portu zelo pomemben.
Vse je lahko žarnica, če je dovolj toka.
S57LKR
Uporabniški avatar
Lovro7
 
Prispevkov: 464
Pridružen: 11 Feb 2024, 20:19
Kraj: Velenje (Šmartno ob Paki)
Zahvalil se je: 157 krat
Prejel zahvalo: 158 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 13

Re: Čudno obnašanje

OdgovorNapisal/-a reber » 27 Sep 2025, 05:21

Če mi je kaj znano, prekinitev za millis() ni vsako us, ampak vsako ms, torej na vsakih 16000 clock pulse. Bolj naj te zanima koliko traja glavna zanka in dolžina nekaterih inštrukcij, prekinitev, ki lahko bistveno motijo izvajanje programa. Seveda je jasno, da se lahko trajanje glavne zanke spreminja, odvisno od programa in poteka programa.

Nikoli se nisem spuščal v hude detajle, ker nimam znanja, je pa moj sin testiral sam arduino core, bootloader, millis() in še kaj, koliko svojega časa v zanki dodaja. V prazen uC brez bootloaderja, brez vsega, je v asemblerju napisan ih nekaj vrstic kode poslal nanj in z osciloskopom sva potem merila odziv na enem izhodu. Na izhodu je bil 50:50 kvadratni signal. Razlika v frekvenci je očitna, skoraj prazen uC bo glavno zanko zelo hitro izvajal, medtem ko dodatki, kot so prekinitve, se očitno vidijo na oscilogramu, kot izpuščeni impulzi.

Za štetje kolikokrat se glavna zanka izvede v eni sekundi, lahko dodaš nekaj vrstic in podatek pošlješ na LCD, serial, ... nekaj kar se že uporablja. Ta dodatek ne bo bistveno vplival, tudi če to pošiljaš na LCD, če je le ta v aplikaciji že uporabljen in izpisuje nekaj.
Sporočila sprejemam na e-mail objavljen na www.reber.si
Uporabniški avatar
reber
 
Prispevkov: 2299
Pridružen: 17 Mar 2015, 20:30
Kraj: Bled
Zahvalil se je: 269 krat
Prejel zahvalo: 886 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 255


Vrni se na Arduino

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost