Input Atmega microcontroller controleren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • De Dona
  • Registratie: December 2004
  • Laatst online: 09-10 14:01

De Dona

Wie anders?

Topicstarter
Ik ben eind vorige week begonnen met het programmeren van een Atmel microcontroller. Dit doe ik in 'C'.
De taal ken ik verder nog niet, maar tot nu toe is alles goed te begrijpen. Ik loop op dit moment tegen het volgende 'probleem' aan; ik weet niet wat nu de beste/makkelijkste manier is om een ingang te controleren op input (1/0).

Zo...
C:
1
2
3
if(PINB ~ (1 << PB0)) {
   DoeJeDing();
}


Of zo...
C:
1
2
3
if(!(PINB & (1 << PB0))) {
   DoeJeDing();
}


Of zijn er nog andere (minder omslachtigere) manieren? Ik heb zelf al een hoop zoekwerk verricht, maar ik zie door een shitload aan bomen het bos niet meer! :+

Acties:
  • 0 Henk 'm!

  • stereohead
  • Registratie: April 2006
  • Laatst online: 13:39
Je zegt dat je begint met C. Dan is het verstandig om ook eens te kijken daar macro's (Wikipedia: C preprocessor)

Dan krijg je bijvoorbeeld zoiets:

C:
1
2
3
4
5
6
7
8
// boven in je code
#define read_input(PORT,PIN) ((PORT & (1 << PIN)) > 0)


// dan in je code zelf
if(read_input(PINB, PB0)) { 
   DoeJeDing(); 
}


In feite doet dit precies hetzelfde als in je tweede voorbeeld. Alleen het is makkelijker leesbaar.

Acties:
  • 0 Henk 'm!

  • Sibylle
  • Registratie: Juli 2006
  • Laatst online: 13-07-2023
Voorbeeld van hoe ik het doe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ISR(TIMER0_OVF_vect){
    cli();
    refresh();

    //button1
    if( !(PIND & (1<<0)) ){ delay_ms(2);b1_flag=1;};
    //button2
    if( !(PIND & (1<<1)) ){ delay_ms(2);b2_flag=1;};
    //button3
    if( !(PIND & (1<<2)) ){ delay_ms(2);b3_flag=1;};

    //reset timer
    TCNT0=0b00000000;
    sei();
}


Hiermee zet ik btw de uitgang van hoog naar laag als ik het knopje induw. Dus als je van laag naar hoog wilt, dan andersom.

Ctrl+k


Acties:
  • 0 Henk 'm!

  • De Dona
  • Registratie: December 2004
  • Laatst online: 09-10 14:01

De Dona

Wie anders?

Topicstarter
stereohead schreef op dinsdag 08 november 2011 @ 00:10:

C:
1
2
3
4
5
6
7
8
// boven in je code
#define read_input(PORT,PIN) ((PORT & (1 << PIN)) > 0)


// dan in je code zelf
if(read_input(PINB, PB0)) { 
   DoeJeDing(); 
}


In feite doet dit precies hetzelfde als in je tweede voorbeeld. Alleen het is makkelijker leesbaar.
Bedankt! Die macro's maken de code inderdaad een stuk leesbaarder. Ik kan weer even vooruit!

Acties:
  • 0 Henk 'm!

  • jhonniedj
  • Registratie: Maart 2005
  • Laatst online: 11-10 22:14
dat leer ik op school niet eens, en ik krijg gewoon les in embedded systems,..
ik weet dat de ~(tilde) invert,.. maar op manier a, heb ik het nog nooit te zien gekregen!

ziet er beide trouwens al netjes uit :)

Acties:
  • 0 Henk 'm!

  • Sphere-
  • Registratie: November 2003
  • Laatst online: 28-08 19:53
jhonniedj schreef op dinsdag 08 november 2011 @ 00:47:
dat leer ik op school niet eens, en ik krijg gewoon les in embedded systems,..
ik weet dat de ~(tilde) invert,.. maar op manier a, heb ik het nog nooit te zien gekregen!

ziet er beide trouwens al netjes uit :)
Het eerste voorbeeld uit de OP klopt dan ook niet. De tilde voert een complement bewerking uit op wat er achter staat (1<<PB0). Dat zal uiteindelijk leiden tot een constante, in dit geval 0xFE. Dan staat er dus "if (PINB 0xFE)"
Er mist dus een operator.

Verder hoort dit meer thuis in een les over C dan embedded systems aangezien dit niet specifiek is voor embedded systems, ook al worden bitwise operaties daar wel vaker gebruikt.
Pagina: 1