Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Arduino Mega loop pysähtyy

Sivun loppuun

Tumppu [10.07.2011 19:54:25]

#

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.

Pete2 [10.07.2011 21:47:58]

#

Funktiota loop ei ehdottomasti tarvitse kutsua. Ensimmäinen arvaus on, että koodisi jää silmukkaan jossain päin piirra_valintaa.

Tumppu [10.07.2011 22:28:41]

#

anna tulla seuraava arvaus, kun olen kokeilut jättää sen pois. piirra_valikko function se jää, mutta miksi?

Grez [10.07.2011 22:41:01]

#

Tuleeko LCD:n näytölle mitään?

Itse laittaisin tuon emuun pyörimään ja steppailisin eteenpäin rivi kerrallaan katsoen mihin jää.

Hennkka [10.07.2011 22:58:08]

#

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.

Tumppu [10.07.2011 23:25:24]

#

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.

jalski [10.07.2011 23:34:27]

#

C-kielessä ei ole boolean tyyppiä. C:ssä yleisesti booleanin virkaa hoitaa integer, jossa käytetään arvoa 0 tai 1.

Pete2 [11.07.2011 00:31:24]

#

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.

Grez [11.07.2011 00:52:02]

#

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?

Pete2 [11.07.2011 01:02:15]

#

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.

Grez [11.07.2011 01:22:01]

#

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.

Tumppu [11.07.2011 08:06:53]

#

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.

Juice [11.07.2011 09:36:06]

#

Suosittelen, että opettelet käyttämään tietotyyppejä uint8_t, int8_t, uint16_t jne.

Ei jää turhia arvailuja muistin käytöstä.

Grez [11.07.2011 13:58:44]

#

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öä.

Metabolix [14.07.2011 17:57:30]

#

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ä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta