Chapter 12 - Capturing Inputs part 1

Download Report

Transcript Chapter 12 - Capturing Inputs part 1

Chapter 12
Capturing Input
Button Inputs
Di Jasio - Programming 32-bit Microcontrollers in C
Inputs Packing
int readK( void)
{
// returns 0..F if keys pressed, 0 = none
int c = 0;
if ( !_RD6) // leftmost button
c |= 8;
if ( !_RD7)
c |= 4;
if ( !_RA7)
c |= 2;
if ( !_RD13) // rightmost button
c |= 1;
return c;
} // readK
Di Jasio - Programming 32-bit Microcontrollers in C
De-Bouncing
int getK( void)
{
// wait for a key pressed and debounce
int i=0, r=0, j=0;
int c;
// 1. wait for a key pressed for at least .1sec
do{
Delayms( 10);
if ( (c = readKEY()))
{
if ( c>r)
// if more than one button
r = c;
// take the new code
i++;
}
else
i=0;
} while ( i<10);
// 2. wait for key released for at least .1 sec
i =0;
do {
Delayms( 10);
if ( (c = readKEY()))
{
if (c>r)
// if more then one button
r = c;
// take the new code
i=0;
j++;
// keep counting
}
else
i++;
} while ( i<10);
// 3. check if a button was pushed longer than 500ms
if ( j>50)
r+=0x80;
// add a flag in bit 7
// 4. return code
return r;
} // getK
Di Jasio - Programming 32-bit Microcontrollers in C
Rotary Encoders
Di Jasio - Programming 32-bit Microcontrollers in C
Polling Example
/*
** Rotary.c
*/
// configuration bit settings, Fcy=72MHz, Fpb=36MHz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#include <p32xxxx.h>
#include <explore.h>
#include <LCD.h>
#define ENCHA
#define ENCHB
_RA9
_RA10
// channel A
// channel B
main( void)
{
int i = 0;
char s[16];
initLCD();
// main loop
while( 1)
{
while( ENCHA);
//
Delayms( 5);
//
i += ENCHB ? 1 : -1;
while( !ENCHA);
//
Delayms( 5);
//
detect CHA falling edge
debounce
wait for CHA rising edge
debounce
// display relative counter value
clrLCD();
sprintf( s, "%d", i);
putsLCD( s);
} // main loop
} // main
Di Jasio - Programming 32-bit Microcontrollers in C
Interrupt Driven
Rotary Encoder State Machine Diagram
Rotary Encoder State Machine Transitions Table
Di Jasio - Programming 32-bit Microcontrollers in C
Interrupt Driven Example
/*
** Rotary2.c
*/
// configuration bit settings, Fcy=72MHz, Fpb=36MHz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#include
#include
#include
#include
<p32xxxx.h>
<plib.h>
<explore.h>
<LCD.h>
#define ENCHA
#define ENCHB
#define TPMS
_RA9
_RA10
(FPB/1000)
// encoder channel A
// encoder channel B
// PB clock ticks per ms
// state machine definitions
#define R_IDLE
0
#define R_DETECT
1
volatile int RCount;
char RState;
void initR( void)
{
// init state machine
RCount = 0;
RState = 0;
// init Timer2
T2CON = 0x8020;
PR2 = 5*TPMS/4;
mT2SetIntPriority( 1);
mT2ClearIntFlag();
mT2IntEnable( 1);
} // init R
Di Jasio - Programming 32-bit Microcontrollers in C
// init counter
// init state machine
// enable Timer2, Fpb/4
// 5ms period
Interrupt Service Routine
void __ISR( _TIMER_2_VECTOR, ipl1) T2Interrupt(
void)
{
static char d;
switch ( RState) {
default:
case R_IDLE:
// waiting for CHA rise
if ( ! ENCHA)
{
RState = R_DETECT;
if ( ! ENCHB)
d = -1;
}
else
d = 1;
break;
case R_DETECT:
// waitin for CHA fall
if ( ENCHA)
{
RState = R_IDLE;
RCount += d;
}
break;
} // switch
mT2ClearIntFlag();
} // T2 Interrupt
Di Jasio - Programming 32-bit Microcontrollers in C
Example (cont.)
main( void)
{
int i = 0;
char s[16];
initEX16();
initLCD();
initR();
// init and enable interrupts
// init LCD module
// init Rotary Encoder
// main loop
while( 1)
{
Delayms( 100);
// place holder for a complex app.
clrLCD();
sprintf( s, "RCount = %d", RCount);
putsLCD( s);
} // main loop
} // main
Di Jasio - Programming 32-bit Microcontrollers in C
Keyboards
Physical Interface (5-pin DIN)
Physical Interface (6-pin mini-DIN)
Di Jasio - Programming 32-bit Microcontrollers in C
PS2 Communication Protocol
Host Communication Waveform
Di Jasio - Programming 32-bit Microcontrollers in C
Input Capture Modules
Figure 15-1 (DS61143)
Di Jasio - Programming 32-bit Microcontrollers in C
PS/2 Bit Timing
Di Jasio - Programming 32-bit Microcontrollers in C
IC State Machine
Di Jasio - Programming 32-bit Microcontrollers in C
IC ISR
void __ISR( _INPUT_CAPTURE_1_VECTOR, ipl1) IC1Interrupt( void)
{ // input capture interrupt service routine
int d;
// 1. reset timer on every edge
TMR2 = 0;
switch( PS2State){
default:
case PS2START:
if ( ! PS2DAT)
{
KCount = 8;
KParity = 0;
PR2 = TMAX;
T2CON = 0x8000;
PS2State = PS2BIT;
}
break;
// verify start bit
} // switch state machine
//
//
//
//
// clear interrupt flag
d = IC1BUF;
mIC1ClearIntFlag();
init bit counter
init parity check
init timer period
enable TMR2, 1:1
case PS2BIT:
KBDBuf >>=1;
// shift in data bit
if ( PS2DAT)
KBDBuf += 0x80;
KParity ^= KBDBuf;
// update parity
if ( --KCount == 0)
// if all bit read, move on
PS2State = PS2PARITY;
break;
case PS2PARITY:
if ( PS2DAT)
KParity ^=
if ( KParity &
PS2State =
else
PS2State =
break;
case PS2STOP:
if ( PS2DAT)
{
KBDCode = KBDBuf;
KBDReady = 1;
T2CON = 0;
}
PS2State = PS2START;
break;
// verify parity bit
0x80;
0x80)
// if parity odd, continue
PS2STOP;
PS2START;
Di Jasio - Programming 32-bit Microcontrollers in C
} // IC1 Interrupt
// verify stop bit
// save code in mail box
// set flag, code available
// stop the timer
// discard capture
Using Stimulus Files
Di Jasio - Programming 32-bit Microcontrollers in C
Test Program
/*
** PS2ICTest.c
**
*/
// configuration bit settings, Fcy=72MHz, Fpb=36MHz
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#include <p32xxxx.h>
#include <explore.h>
#include "PS2IC.h"
main()
{
int Key;
initEX16();
initKBD();
while ( 1)
{
if ( KBDReady)
{
Key = KBDCode;
KBDReady = 0;
}
} // main loop
} //main
Di Jasio - Programming 32-bit Microcontrollers in C
// init and enable interrupts
// initialization routine
// wait for the flag
// fetch the key code
// clear the flag
Simulator Profiler
Di Jasio - Programming 32-bit Microcontrollers in C