Jännite kyykkää?

Ikuisuusongelmani jatkuvat.

Ohjaan 328:lla gsm-modeemia siten, että jännite kytketään tarvittaessa
siihen päälle. MCU:n ja gsm:n välissä on FETti.

Kaikki toimii OK, kun laitteen käynnistää. Setup antaa modeemille
jännitteen, tarkistaa sen toiminnan (olemassaolon), sulkee jännitteen
ja loop nukuttaa MCU:n. Herätys on ulkoisella keskeytyksellä. OK, kun
MCU herätetään, niin annetaan taas modeemille jännite ja lähetetään
tekstari. Tässä tulee kämy -> ilmeisesti käyttöjännite kyykkää tai tapahtuu
jotain muuta outoa, koska MCU nähdäkseni resetoituu ja boottaa
itsensä: koodi ei etenekään loopin mukaan, vaan mennään taas
setuppiin. Näin ainakin näyttäisi olevan.

Kysymys kuuluu, että mikä neuvoksi? Jännitelähde on yksi LiPo, 328
toimii 8MHz kiteellä ja fuset olen mielestäni asettanut BDO 1.8V (tämä
pitää tarkastaa kunhan kotiudun). MCU:n edessä ei ole regulaattoria eikä
konkkia ole oikeastaan missään, toki 100nF MCUn edessä.

Kertokaapa, jos tulee jotain simppeliä mieleen, auttaisi kovasti.

Kuulostaa softabugilta.

Kannattaa lähteä sulkemaan virhevaihtoehtoja pois, niin helpottaa vianetsintää. Koita vaikka ensimmäisenä syöttää laitetta ulkoisella virtalähteellä tai kytke Modeemi toiseen virtalähteeseen tms.

Luullakseni ei ole softabugi. Koodi on simppeli kuin mikä. Testaan tietty
vielä koodin kun pääsen “sorvin ääreen”. Kokeilen myös erillistä jännitteensyöttöä
modeemille, niin saa yhden virhelähteen eliminoitua. Toisaalta en haluaisi
kahta eri jännitesyöttöä, yhdellä LiPolla pitäisi pärjätä.

Gsm-powerien suunnitteluperusteita löysin mm.
cpg.com.tr/File/AC75/2811200 … ly_v03.pdf

Voisi tietenkin koettaa rakennella jotain esim. TPS77601 ympärille. RuuviTrackerissa
näyttää olevan TPS73733, jossa jännitteen pudotus on vain 130mV ja ulos tulee tarvittaessa
ampeerin verran… huvikseni en kuitenkaan LDOta laita, jos ei sitä aivan välttämättä
tarvita.

Lisävinkkejä?

En tietenkään tarkoittanut että muutat designia vaan, että vianhakumielessä testaat ensin erillisellä powerilla GSM:lle. Kun olet testin tehnyt, raportoit tänne, niin laitetaan lisävinkkejä tulosten perusteella :slight_smile:.

Ps. Yksinkertaisimmassakin softassa voi olla hyvinkin monimutkainen bugi :wink:

Olen samaa mieltä kaneetistasi PS…

Muistaakseni olen testannut koodin niin että ohjelma ei käynnistä gsm-modeemia
vaan ledin, jolloin kuprua ei tule, mutta en sano varmaksi ennenkuin pääsen testaamaan.

Raportoin lisää kun saan testejä aikaiseksi. :nerd:

Ainakin oma virheeni on perintaeisesti se, että kirjoitan kiljoona riviä koodia toimivan peruspalikan päälle, ja huomaan ettei mikään enää tämän jälkeen toimi. Sitten meneekin taaksepäin debugatessa tunti jos toinenkin. Helpompaa tehdä koodia moduuli kerrallaan ja testata valmiiksi asti. Sitten on hyvän versionhallinnan ja dokumentoinnin avulla helppo etsiä vikaa…

Mutta testaamalla tuosta selviää. Gsm-pulikka pois ja ledi tilalle. Jos toimii, niin sitten pulikalle oma jännitteensyöttö ja taas testaus. Jos toimii, niin kaksi akkua syöttämään virtaa ja testausjälleen. Sen jälkeen jo tietääkin mitä siinä pitäis tehdä :slight_smile:

Mutta aloita koodista. Siellä, siellä se väinö-vika on!

Noo, olen joskus menneisyydessäni koodannut kymmenkunta vuotta työkseni - modulaarista tietokantasoftaa, joten joku haju mulla on hyvästä koodauskäytännöstä. Mutta ympäristöt ovat erilaisia, ja Arduino C:ssa (vai miksi sitä pitäisi nimittää?) on paljon asioita, joita en ymmärrä tai tajua että miksi näin.

Sain hommani toimimaan yhdelläkin akulla, mutta en ihan niin kuin haluaisin.

Eli mulla on pseudokielellä seuraavat rakenteet:

Setup

  • normaalit alustukset
  • setUpModem(0)
    End Setup

Loop

  • goto sleep
    -herätys int nastalla 3
    -setUpModem(1)
    End Loop

SetUpModem siis haarautuu parametrilla niin, että parametrilla 0 pitäisi nostaa
modeemi ekan kerran ylös (virran kytkemisen jälkeen) ja antaa tietty ilmoitus
(tekstarilla jotain sellaista kuin “ready”). Loopissa nukutaan ja kun tulee herätys,
niin mennään taas setUpModemiin ja toimitaan parametrin 1 mukaan (tekstarilla
“alarm” tms.). Mutta mutta: jostain ihme syystä herätyksen jälkeen setUpModem
toimisi niin kuin se saisi parametrin 0! Ihan kuin ohjelma menisi sleepin jälkeen
takaisin setup -funktioon! WTF! Olen aika varma, että mulla ei ole pahempia
ohjelmakupruja, mutta JOTAIN tässä tietenkin on vialla. Olen käyttänyt sleeppiin
jotain GetHubissa ollutta kirjastoa, nh0_sleep tai jotain. Epäilen että siinä on
jotain häikkää, vaikka tuskin on. Kokeilen illalla ilman mitään kirjastoja, eli
vakio sleep.h :lla.

Muuten onko Arduinossa joku WD käytössä. Eli jos ei palata loop functiosta ajoissa, niin annetaan reset?

Edit:
Ite mielummin kirjoittelen suoraan C:llä ja AVR Studiolla kääntelen ja Dragonilla mahollisesti debuggailen, jos on tarvetta.

WD voi olla käytössä tai sitten ei; en nyt pääse tarkistamaan, mutta tarkistan tänään myöhemmin. Eipä tullut mieleeni, kiitos vinkistä!

Eli testinä vaikka loop functioon vertailu missä tarkistellaan aiempaa heräämis ehtoa ja sitten suoritetaan tuo setUpModem(1)

Itellä sellainen käsitys arduino käyttiksestä, että loop functiota kutsutaan timerin keskeytyksestä ja kun loop on ajettu niin mennään takasi nukkuun. Eli pitäs olla kohtuu tasanen tahti miten tota kutsutaan.

Tota aattelin, kun CircleOS on tohon tyyliin tehty. Ite softalla 2 functiota (Application_Ini ja Application_Handler). Initissä määritellään tahti millä Handler funtiota kutsutaan (100 HZ, 1kHz tai 5 kHz). Tollaset Handler tyyppiset ratkaisut tehään niin, että sen sisälle tehään tilakone eli ite handlerin sisälle ei jäädä odotteleen mitään pitempiä aikoja.

Oletko selvittänyt jo oliko kyse WD:stä? :slight_smile:

Moi,

En päässyt selvyyteen; yhtenä aika varmana osatekijänä
jäljitin PIRin, johon kytketään virta samalla kuin muuhunkin
elektroniikkaan: PIR nyökkii on-off tilaa kun siihen pannaan
virrat, joten on-off aiheuttaa ulkoisen keskeytyksen… taisi
olla niin yksinkertainen juttu. Eli juuri niin kuin sanoit:
katso koodia… :open_mouth: