Hei. Olisin kysynyt vähän neuoa kun kutsun loop function sisältä toista functiota niin ohjelma pysähtyy. Tarviiko arduinossa kutsua loop functioita kun toinen functio on ajettu läpi. Tässä koodini jos selkeyttää.
void loop(){ // run over and over again buttonState = digitalRead(buttonPin); Serial.println(buttonState); if (buttonState == HIGH) { // turn LED on: valinta ++; piirretty=0; if (valinta==5){ valinta=0; } } if (valikko==0 && piirretty==0){ piirra_valikko(); piirretty=1; } } void piirra_valikko(){ if (valikko==0){ piirra_valinta(); GLCD.ClearScreen(); GLCD.CursorTo(6,0); GLCD.Puts("Raiselift"); GLCD.CursorTo(2,2); GLCD.Puts("Kuljettaja"); GLCD.CursorTo(2,3); GLCD.Puts("Auma"); GLCD.CursorTo(2,4); GLCD.Puts("Paiva"); GLCD.CursorTo(2,5); GLCD.Puts("Kalibroinnit"); GLCD.CursorTo(2,6); GLCD.Puts("Tilastot"); GLCD.DrawHoriLine(0,7,128,BLACK); } }
edit: Elikkä ohjelma ei tulosta serialiin kuin yhden kerran 0, ja tarkoitus olisi että se tulostaisi jatkuvasti buttonin tilan.
Funktiota loop ei ehdottomasti tarvitse kutsua. Ensimmäinen arvaus on, että koodisi jää silmukkaan jossain päin piirra_valintaa.
anna tulla seuraava arvaus, kun olen kokeilut jättää sen pois. piirra_valikko function se jää, mutta miksi?
Tuleeko LCD:n näytölle mitään?
Itse laittaisin tuon emuun pyörimään ja steppailisin eteenpäin rivi kerrallaan katsoen mihin jää.
Laita rivien väliin printtejä ja katso, mihin jää. Eihän piirra_valinta()
sisällä loputonta looppia? Tarkista nämä ja laita piirra_valinta()
kin näkyviin.
Sain toimimaan! Toi drawhoriline jää näköjään jotenkin jumittamaan. Vielä yksi kysymys: C-kielessä ei ilmeisesti ole Booleania? olisiko jollakulla jokin kirjasto jolla tämän saisi? Tuntuu turhalta varata muistia shortilla jos tarvitsee vain tiedon päällä:pois.
C-kielessä ei ole boolean tyyppiä. C:ssä yleisesti booleanin virkaa hoitaa integer, jossa käytetään arvoa 0 tai 1.
Tumppu kirjoitti:
Vielä yksi kysymys: C-kielessä ei ilmeisesti ole Booleania? olisiko jollakulla jokin kirjasto jolla tämän saisi? Tuntuu turhalta varata muistia shortilla jos tarvitsee vain tiedon päällä:pois.
Kyllä se boolean vie tavun tilaa joka tapauksessa. Tiedäthän muuten että short vie kaksi tavua muistia, kun char vie vain yhden.
Mikrokontrollereissa on rekisterit usein kortilla, joten sikäli 8 totuusarvon tallettamisessa yhteen tavuun voidaan ajatella jopa perustelluksi toiveeksi.
En tiedä onko siihen valmista kirjastoa, mutta eikös sellaisen kirjoita itsekin alle 5 minuutissa?
Itse olen kirjoittanut vastaavan Pawnilla. Tosin vain taulukkosyntaxilla, ei siis mitenkään dynaaminen. Toive ei kuitenkaan ole perusteltu, koska Tumppu varmasti tarkoitti samanlaista booleania kuin esimerkiksi C++, joka edelleen vie tavun tilaa.
No en nyt ottanut kantaa Tumpun toiveeseen, vaan yleisesti totesin että mikrokontrollerien ihmeellisessä maailmassa toive saada totuusarvot tiiviimmin voi olla perusteltu. Itse asiassa esim. PICeissä rekisterien kirjoittaminen ja testaaminen on suoraan assemblerissa tuettu bittitasolla. Ja käyttömuisti on rekisterit. AVR:istä (Arduinoista) en tiedä kun en ole koodaillut assemblerilla.
Kiitoksia vastauksista. Itselläni on Arduino Mega 1280 elikkäs flashistä löytyy (of a 126976 byte maximum)joten tuo on riittävä tarkoitukseeni, mutta näin tulevaisuutta ajatellen ajattelin varmistaa asian, ettei yritä mennä perse-edellä puuhun.
Suosittelen, että opettelet käyttämään tietotyyppejä uint8_t, int8_t, uint16_t jne.
Ei jää turhia arvailuja muistin käytöstä.
Tumppu kirjoitti:
flashistä löytyy (of a 126976 byte maximum)
Tosin eihän niitä muuttujia yleensä flashiin laiteta. Mutta muistiakin tuossa on kyllä 8 kilotavua, joten sekin riittää hienosti useimpiin tarkoituksiin ilman suurempaa säätöä.
Jos Arduinolle kelpaa tavallinen C, voit käyttää bittikenttiä tietueissa. Tietueen kokonaiskoko on silti aina kokonaisia tavuja.
struct bitit { unsigned char b0: 1, b123: 3, b45: 2, b6: 1, b7: 1; }; struct bitit data; data.b0 = 1; // 1 data.b123 = 6; // 110 data.b45 = 0; // 00 data.b6 = 1; // 1 data.b7 = 0; // 0
Muussa tapauksessa voit käyttää itse bittioperaatioita yksittäisten bittien lukemiseen ja vaihtamiseen. Siinä tapauksessa yllä mainitut tyypit (uint8_t ym.) ovat hyviä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.