Agregar un push button o interruptor al circuito permite que el microcontrolador reciba instrucciones humanas. Otras formas de entrada al microcontrolador incluyen –pero no limitan- un teclado, un ratón, interruptores, audio – a través de micrófono- , displays sensible al tacto o digitalizadores. Desde luego existen muchos otros elementos o formas de entrada al microcontrolador, pero estas no son activadas por la voluntad del humano. Estas entradas caen en la categoría de sensores, esos dispositivos típicamente convierten alguna variable física en una variable eléctrica. Algunos ejemplos son los acelerómetros, los detectores de energía infrarroja o monitores de temperatura.
Los interruptores mecánicos son imperfectos ya que producen rebotes, estas variaciones entre voltaje alto (cinco volts) y voltaje bajo (tierra) antes de estabilizarse en un valor.
Se ha introducido un capacitor entre las ter minales del interruptor, el valor de este capacit or varia de 1 nf. a 220 nf. El programa para este circuito es:
#i ncl ude
#i ncl ude i nt mai n( voi d) { DDRB | = 1 << PI NB0; DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1;
whi l e ( 1) { PORTB ^= 1 << PI NB0; if (bit_is_clear(PINB, 1)) { _delay_ms(10); //rapido } else {
_ del ay_ms( 100) ; / / l ent o r espect al pr evi o }
} }
Ahor a un segundo ci r cui t o y pr ogr ama par a most r ar el r ebot e y su amor t i guami ent o con el capaci t or .
ef ect o del
#i ncl ude i nt mai n( voi d) { DDRB | = 1 << PI NB0; / / sal i da en PI NB0 PORTB ^= 1 << PI NB0; / / sol o conmut a Pi n 0 en el puer t o b DDRB | = 1 << PI NB2; / / sal i da en PI NB2 DDRB &= ~( 1 << PI NB1) ; / / ent r ada en PI NB1 PORTB | = 1 << PI NB1; / / se pone a uno PI NB1 par a una l ect ur a de al t o i nt Pr essed = 0; / / i ni ci al i zaci ón/ decl ar aci ón de l a vari abl e Pressed whi l e ( 1) { i f ( bi t _ i s _ cl ear ( PI NB, 1) ) / / ver i f i c a s i el bot ó n es pr e si onado { / / asegur a que el bot ón ha si do l i berado i f ( Pressed == 0) { PORTB ^= 1 << PI NB0; / / conmut a LED en pi n 0 PORTB ^= 1 << PI NB2; / / conmut a LED en pi n 2 Pressed = 1; } } el se { / / est e codi go se ej ecut a cuando el bot on no es pr esi onado. Pressed = 0; } } }
A cont i nuaci ón se pr esenta una sol uci ón en sof t ware pare evi t ar l os rebot es
i nt mai n( voi d) { DDRB | = 1 << PI NB0; / / sal i da PORTB ^= 1 << PI NB0; DDRB | = 1 << PI NB2; DDRB &= ~( 1 << PI NB1) ; PORTB | = 1 << PI NB1; i nt Pressed = 0; i nt Pr essed_Conf i dence_Level = 0; / / Medi ci on sobr e l a conf i anza en l a pr esi on de un / / bot on i nt Rel eased_Conf i dence_Level = 0; / / Medi ci on sobr e l a conf i anza en l a l i beraci on de / / un bot on whi l e ( 1) { i f ( bi t _ i s _c l ear ( PI NB, 1) ) {
Pr essed_Conf i dence_Level ++; / / I ncrement a l a conf i anza en pr esi on Rel eased_Conf i dence_Level = 0; / / Reset r el eased but t on conf i dence si nce t here i s a but t on press i f ( Pressed_Conf i dence_Level >500) / / I ndi cat or Buena pr esi on del bot on { i f ( Pressed == 0) { PORTB ^= 1 << PI NB0; PORTB ^= 1 << PI NB2; Pressed = 1; } / / cer o es una condci on que puede ser eval uada Pr essed_Conf i dence_Level = 0; } } el se { Rel eased_Conf i dence_Level ++; / / I ncr ement a l a conf i anza en pr esi on Pressed_Conf i dence_Level = 0; / / r eset ea el val or de conf i anza ( Rel eased_Conf i dence_Level >500 { Pressed = 0; Rel eased_Conf i dence_Level = 0; } } } }
A cont i nuaci ón un j uego
#i ncl ude #i ncl ude voi d Pr ocessPr essedBut t on( i nt But t onPressed) ; voi d ProcessRel easedButt on( i nt Butt onRel eased) ; i nt Pr essed_Conf i dence_Level [ 2] ; i nt Rel eased_Conf i dence_Level [ 2] ; i nt Pr essed[ 2] ; i nt LEDNumber [ 2] ; i nt mai n( voi d) { DDRB = 0b01111111; DDRD = 0b01111111; PORTB = 0b10000000; PORTD = 0b10000000; whi l e ( 1) { i f ( bi t _ i s _c l ear ( PI NB, 7) ) { ProcessPressedBut t on( 0) ; } el se {
Pr ocessRel easedBut t on( 0) ; } i f ( bi t _ i s _c l ear ( PI ND, 7) ) { ProcessPressedBut t on( 1) ; } el se { Pr ocessRel easedBut t on( 1) ; } } } voi d ProcessPressedBut t on( i nt Butt onPressed) { Pr essed_Conf i dence_Level [ But t onPr essed] ++; i f ( Pressed_Conf i dence_Level [ But t onPressed] > 500) { i f ( Pr essed[ But t onPr essed] == 0) { Pressed[ But t onPressed] = 1; i f ( But t onPr essed == 0) PORTB | = 1 << LEDNumber [ But t onPr essed] ; i f ( But t onPr essed == 1) PORTD | = 1 << LEDNumber [ But t onPr essed] ; LEDNumber [ But t onPr ess ed] ++; i f ( LEDNumber [ But t onPr essed] >6) { f or ( i nt i =0; i < 10; i ++) { i f ( But t onPr essed == 0) PORTB = 0b11111111; i f ( But t onPr essed == 1) PORTD = 0b11111111; _ del ay_ms( 10) ; i f ( But t onPr essed == 0) PORTB = 0b10000000; i f ( But t onPr essed == 1) PORTD = 0b10000000; _ del ay_ms( 10) ; } LEDNumber [ 0] = 0; LEDNumber [ 1] = 0; PORTB = 0b10000000; PORTD = 0b10000000; } } Pressed_Conf i dence_Level [ But t onPressed] = 0; } } voi d ProcessRel easedButt on( i nt Butt onRel eased) { Rel eased_Conf i dence_Level [ But t onRel eased] ++; i f ( Rel eased_Conf i dence_Level [ But t onRel eased] > 500) { Pr essed[ But t onRel eased] = 0; Rel eased_Conf i dence_Level [ Butt onRel eased] = 0; } }