Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Kierroslaskentaohjelma

Sivun loppuun

blenheim [11.05.2004 16:03:46]

#

Moi!

Tässä olen pykäämässä kierroslaskentalaitteistoa pienoisautoille (hyvin hauska harrastus). Nyt vaan mietityttää miten tehdä C:llä ohjelmisto sille. Olisi tarkoitus hyödyntää mikrokontrolleria joka on rakennettu itse. Lisätietoa kontrollerista www.microsalo.com.
Miten saisin tehtyä ohjelman joka käynnistää kellon ja pysäyttää kellon kun auto vilahtaa valovastuksen ohi laseri kyydissään?
Tieto tulostuu nestekidenäytölle. Ajurikoodi on jo olemassa.

kaviaari [14.05.2004 15:17:15]

#

Autoon saa lisävauhtia jos otat laaserin pois autosta ja kiinnintät sen valovastuksen vastakkaiselle puolelle näin:

Valovastus) |rata| (Valonlähde

jolloin kun auto menee radalla tämän portin ohi muuttuu singaali 1 0:ksi.

Pienoinen varsinaisesta aiheesta poikkeama.

blenheim [14.05.2004 17:46:13]

#

Niin, mutta kun radalla on muitakin autoja ja ne sitten sekoittaa järjestelmän...
Lähinnä tätä kellokoodia nyt ajattelin hakea. Jos jollain on vinkkiä niin antakoon sen :)!

hunajavohveli [14.05.2004 21:45:04]

#

Osaako ohjelmasi siis jo vastaanottaa tietoa siitä, milloin auto kulkee valovastuksen ohi? Eli onko näiden vilahdusten välisen ajan laskeminen ainoa ongelmasi?

blenheim [15.05.2004 07:56:25]

#

Ainoa ongelma todellakin on tuo välähdysten välisen ajan laskeminen. Eli pitäisi saada yhden kierroksen pituus aikana selville.
Ohjelma osaa jo vastaanottaa tiedon (luultavasti) milloin auto kulkee valovastuksen ohitse. Ainakin suostui kääntymään, liitäntöjä ei ole vielä tehty tuon valovastuksen osalta. Eli en saa sitä vielä kiinni itse kontrolleriin, mutta toimii virtamittarilla tsekattuna.

peki [15.05.2004 08:36:49]

#

En paljoa elektroniikasta tiedä, mutta itse tekisin näin, jos osaisin:
Tekisin piirin, joka värähtelee ja antaa signaalia 1 mikrokontrolleriin aina värähdyksen sattuessa.
Asettaisin tämän piirin värähtelyajan noin 1ms(laskettavissa vastuksien ja kondensaattorien tehosta)
sitten aina kun saat tuon viestin kontrolleriin, kasvatat jotain muuttujaa yhdellä.
Ja kun tuo valosignaali tulee näytät vain muuttujan arvon ruudulla
ja nollaat muuttujan

hunajavohveli [15.05.2004 12:00:30]

#

Sinun pitää kai käyttää, jotain funktiota, joka vastaa QB:n TIMER:ia, eli palauttaa keskiyöstä kuluneiden sekuntien määrän. Kun ensimmäinen vilahdus tulee, tallennat senhetkisen ajan muistiin, kun tulee toinen vilahdus tallennat uudelleen senhetkisen ajan, ja sitten lasket noiden kahden ajan erotuksen, niin saat selville, kuinka paljon aikaa kului kahden vilahduksen välistä. En vain ole oikein varma, mikä funktio tuon ajan palauttaa, ja missä kirjastossa sellainen on. Kaikista kääntäjistä tuota ei välttämättä edes löydy.

sqwiik [15.05.2004 16:33:33]

#

Kirjastosta TIMER.H löytyy ainakin Timer-luokka, jossa on ajastus (start/stop/reset).

jutti [17.05.2004 21:53:41]

#

Sekunti on liian hidas tikittäjä. Itse käytän paljon allegroa ja siinä taitaa olla ohjelmoitavia timereitä. Yhden voisi panna tikittämään sadasosia.

[aiheen_vierestä]
Minä upottaisin peilin rataan siinä kohtaa, jossa auto menee. Sitten rakentaisin upean portin tai sillan peilin yläpuolelle. Siihen laseri ja valovastus ja vähän säätöä.

blenheim [18.05.2004 18:58:21]

#

Juu, kiitos vaan vastauksista. Mietin vain miten saan sen timerin toimiman halutulla tavalla.
Tarvitaanko siis kaksi if lausetta, jotta saan pysäytettyä vanhan ajan ja aloitettua samalla uuden ajan? Ja miten saan sen kellon käyntiin?

           if (PORTB == 1)
              {
              	timer0_start
              }

Noinko?

Ja toinen asia on, että miten saan sen ajan sitten tulostettua näytölle?

              lcd_puts("Aika:");
              Delay_ms(100);

Miten tuosta sitten pitäisi jatkaa?

peran [27.05.2004 17:17:02]

#

Osaisin tehdä PIC:n mikrokontrellerilla (PIC 16f84), joten selitän esimerkin pseudona miten se tapahtuu sillä.

main () {
alustetetaan muuttujat, ja avataan timerille ja PORTB:lle keskeytykset.
while (true) ;
}

Interrupt () {
   jos timerin keskeytys {
       aika++;
   }
   jos PORTB:n keskeytys {
       kierrosaika = aika*256 + timer0;
       timer0=0;
       aika=0;
       kierrosaikasadasosina = kierrosaika/???
               //(??? riippuu kiteestä)
       lcd_puts("Aika:");
       i=0;

       while (kierrosaikasadasosina>10) {
           i++;
           c[i]=(48+(kierrosaikasadasosina % 10)); // 48='0'
           kierrosaikasadasosina=kierrosaikasadasosina/10;
       }
       // Nyt pitäis olla c[1]=1/100s:t, c[2]=1/10s:t, c[3]=s:t ...
       // Tulostetaan käänteisenä
       while (i>0) {
           putc(c[i]);
           if (i==2) {
               Delay_ms(10); // tarvitaan vain jos lcd on hidas
               putc(c[i]);
           }
           i--;
           delay_ms(10); // saatetaan tarvita jos lcd on hidas
       }
       Delay_ms(100);
   }
}

Onkohan tosta mitään apua?


Sivun alkuun

Vastaus

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

Tietoa sivustosta