En este capítulo combinaremos las entradas anteriores sobre los servos y el pulsador capacitivo, para mejorar la técnica de programación de servos y comprobar el uso práctico del mTouch.
Partimos de la placa base que hemos usado otras veces, un servo, un led y una moneda.
Configuramos sel temporizador TIMER2 para generar interrupciones cada 10 ms y cada dos interrupciones sacamos un pulso de anchura definida por la variable retardo hacia el servo.
Mientras tanto el programa principal espera las pulsaciones en la moneda para incrementar la variable de retardo e iluminar el led.
#include <main.h> #define RMIN (int16)500 #define RMAX (int16)2500 int count; int16 retardo,ms,sg; #int_TIMER2 void TIMER2_isr(void) { count=!count; if (count) { output_high(PIN_B3); delay_us(retardo); output_low(PIN_B3); ms+=20; } if (count>50) { sg++; count=0; } } int16 v0; int16 leer_t(void) { output_high(PIN_A1); output_low(PIN_A0); set_adc_channel(1); delay_us(100); output_float(PIN_A0); set_adc_channel(0); delay_us(100); v0=read_adc(); if (v0>999) v0=999; return(v0); } void main() { setup_adc_ports(sAN0|sAN1); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel( 0 ); setup_timer_2(T2_DIV_BY_16,196,16); //630 us overflow, 10.0 ms interrupt count=0; sg=0; ms=0; retardo=1500; enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); while(TRUE) { if ((leer_t()<400)) { if (ms>500 || sg) { output_toggle(PIN_B0); retardo+=250; if (retardo>RMAX) retardo=RMIN; } sg=0; ms=0; } } }
Así queda el montaje funcionando:
1 ping