Tiedote ylläpidolta:

Elektroniikkafoorumi sulkeutuu tietoturva ongelmien takia.
Käyttäjien tietoja (yv:t, sähköpostiosoite ja salasanan hash) on saattanut vuotaa vääriin käsiin.

Foorumi on asettettu vain luku tilaan. Vanhoja keskusteluja voi lukea palvelinsopimuksen päättymiseen asti.
Tietokannasta on poistettu kaikki salasanat, sähköpostiosoitteet ja yksityisviestit.

Jos haluat saada omat yksityisviestisi, lähetä sähköpostia yllapito@elektroniikkafoorumi.com
samasta sähköpostista mikä oli foorumin tiedoissa niin voin kaivella niitä varmuuskopioista.

Mielenkiintoni foorumin ylläpitoon on viime vuosina ollut vähäistä jo muutenkin joten tähän on hyvä lopettaa.
Kiitokset kaikille käyttäjilla ja pahoittelut mahdollisista ongelmista.

Päivitys: Näyttäisi siltä että mahdollinen vuoto koski vanhaa phpBB2 tietokantaa,
joten helmikuuta 2012 uudemmat tiedot pitäisi olla turvassa.

-Lahha
yllapito@elektroniikkafoorumi.com


Painike ongelma ohjelmassa

Keskustelua mikrokontrollereista ja niiden ohjelmoinnista.

Valvoja: Moderaattorit

Avatar
Jäsen
Jäsen
Viestit: 62
Liittynyt: Pe Heinä 29, 2011 23:00
ViestiLähetetty: Pe Tammi 20, 2012 10:06
Hei!
Tein tuossa äsken koodin yhdelle painikkeelle, ja nyt tuli tarve saada toinen painike samaan.
Koodi yhdelle painikkeelle:
Koodi: Valitse kaikki
int main(void)
{

DDRC &= ~(1<<PC1);
PORTC |= (1<<PC1);
while(1)
{
   if(!(PINC & (1<<PC1)))
   {
           ....
   }
}
}

Koodi kahdelle painikkeelle:
Koodi: Valitse kaikki
int main(void)
{

DDRC &= ~(1<<PC1), ~(1<<PC2);
PORTC |= (1<<PC1), (1<<PC2);
while(1)
{
   if(!(PINC & (1<<PC1)))
   {
           ....
   }
   if(!(PINC & (1<<PC2)))
   {
           ....
   }
}
}

Mitä teen väärin, kun laitan ton koodin, jossa on yksi painike, toimii, mutta kun laitan tuon, jossa on kaksi painiketta niin ei kumpikaan toimi enää?

Edit. Onglema selvisi.
Näin sen kuuluisi ollaa:
Koodi: Valitse kaikki

DDRC &= ~(1<<PC1) & ~(1<<PC2);
PORTC |= (1<<PC1) | (1<<PC2);


Jäsen
Jäsen
Viestit: 148
Liittynyt: Pe Marras 18, 2011 8:19
ViestiLähetetty: Pe Tammi 20, 2012 19:22
DDRC:n alustaminen on turhaa sillä DDR-rekisterit ovat oletuksena nollilla eli input-tilassa.

Edit.
Itse käytän bittien vääntelyyn makroja. Koodia on huomattavasti mukavampaa lukea.

Koodi: Valitse kaikki
#define set_bit(a, b)    a |= (1 << b)
#define clear_bit(a, b)  a &= ~(1 << b)
#define is_bit(a, b)     ((a & (1 << b)) != 0)

int main(void)
{
   set_bit(PORTC, 1); // C-portin 1-pinnin ylösvetovastus
   while(1)
   {
      if(!is_bit(PINC, 1)) // Onko pinnin 1 tulo nollassa (alasvetävä painike)
      {
         ....
      }
   }
}
Avatar
Jäsen
Jäsen
Viestit: 62
Liittynyt: Pe Heinä 29, 2011 23:00
ViestiLähetetty: La Tammi 21, 2012 0:47
Okei, näyttää paljon yksinkertaisemmalta lukee, täytynee kai opiskella noiden makrojen käyttöä, eikö ne toimi samalla periaatteela kuin funktiot?

Vanhempi jäsen
Vanhempi jäsen
Viestit: 476
Liittynyt: La Helmi 03, 2007 11:36
ViestiLähetetty: La Tammi 21, 2012 10:45
#define-makro ei tarkalleen ottaen mene kääntäjään asti vaan ns. preprosessori purkaa makrot auki ennen kuin itse käännös tapahtuu. Makrot ovat siis ainoastaan find & replace-tyyppisiä, ja niihin liittyy muutamia sudenkuoppia.

esimerkiksi

#define SUM(A,B) A+B

jos koodissa on sitten rivi

x = SUM(1,2)*3;

ei tuota tulokseksi 9 vaan 7, koska esiprosessori purkaa tuon lausekkeen muotoon x = 1+2*3; jonka jälkeen x on 7. Parempi tapa on määritellä

#define SUM(A,B) (A+B)

jolloin lauseke kääntyy muotoon

x = (1+2)*3;

Inline-funktiot ovat turvallisempi tapa toteuttaa asioita, tosin makrotkin on ok mutta niitä ei kannata kovin mutkikkaiksi tehdä.

t. Janne

Jäsen
Jäsen
Viestit: 148
Liittynyt: Pe Marras 18, 2011 8:19
ViestiLähetetty: La Tammi 21, 2012 11:45
jahonen kirjoitti:Inline-funktiot ovat turvallisempi tapa toteuttaa asioita, tosin makrotkin on ok mutta niitä ei kannata kovin mutkikkaiksi tehdä.

Juuri näin. Tällaisissa pikkukikkailuissa joissa vain halutaan tehdä siistimpää koodia eikä toiminnossa ole mitään elämää suurempaa ohjelmalogiikkaa, makrot ovat ihan paikallaan.
Jos taas toiminnon pitäisi tehdä jotain muutakin kuin vain yksi simppeli toiminto, on funkkari tietysti oikea vaihtoehto.

Kovin monimutkaista makrosta ei kannata tehdä siksikään että jokainen makron käyttö vie sen makron verran ohjelmamuistia jota ei mikrokontrollereissa koskaan ole liikaa :)
Funktio taas kasvattaa ohjelmaa vain sen yhden kerran ja jokainen kutsu käyttää hyppykäskyyn vain pari byteä (vai menikö niitä 4, en nyt muista).
Avatar
Jäsen
Jäsen
Viestit: 62
Liittynyt: Pe Heinä 29, 2011 23:00
ViestiLähetetty: La Tammi 21, 2012 13:15
okkei :) Kiitos tiedosta!

Paluu Mikrokontrollerit ja ohjelmointi

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa

cron