Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Keyboards
A computer keyboard typically uses a microprocessor to scan the switches. Similarly in remote control units for TVs etc.select row
lines switches
scanning
one column at a time has a voltage applied. If a switch on the column is pressed the corresponding row has the voltage row select
lines switches
ports
This requires some of the lines on the MPU to be configured as input or output lines. These collections of wires are select termed ports. row
lines switches
in port
mpu out port
Port scanning
Typically each port is several bits wide, we use a shifting bit to scan
outport:=1 --- set col 1 on repeat if inport>0 then processs switch outport:=outport+outport; --- shift column bit up until outport>32
The problem
Mechanical switches play an important and extensive role in practically every computer, microprocessor and microcontroller application. Mechanical switches are inexpensive, simple and reliable. In addition, switches can be very noisy. The apparent noise is caused by the closing and opening action that seldom results in a clean electrical transition. The connection makes and breaks several, perhaps even hundreds, of times before the final switch state settles.
Whenever the switch is open, the high input on D propagates to Qn after n clock cycles. If it closes even momentarily, the output goes low and stays low until there has been a period of n cycles without a switch closure
software debounce
Consider a simple push button application. In this case, some event should occur when a button is pushed. Ideally the invoked event will occur immediately, and only once for each button push. The system should be also ready to respond to a repeat button push as soon as possible after the button is released. This presents an apparent dilemma. How is the difference between switch bounce and repeated button pushes determined?
Assume that the bounce period is less than 10 milliseconds. If the switch input level is stable for longer than 10 milliseconds, then bouncing has stopped and the input level represents the pushed or released switch state. The Brute Force method only cares about a button-push event because this is what invokes the action. It recognizes the switch release state as the stable state and everything else is considered unstable. When the switch becomes unstable, the action is invoked permitting nothing to happen until the switch returns to the released stable state.
Program Design
To go any further we need to know how to:
power
ground
The switch is connected to pin 4 When you push it the input goes towards ground, in digital terms it reads as 0
LED driving
The board has 8 LEDs It has only 4 input output pins available to drive them This would imply that it could drive only 4 LEDs, How does it manage it ?
How could we get LED D0 and D1 on at the same time? Electrically this is impossible. We can fool the human eye though, by rapidly flashing the two LEDs thousands of times a second. It then looks as though both are on all the time.
Tristate Logic
Normal logic uses the convention that high voltage is 1 and low voltage is 0. You will all recall that in addition to high an low outputs, a pin can be TRISTATE Tristate is needed in order to drive the LED matrix.
If we are trying to light LED D0, then clearly only pins 2 and 3 must be active.
we want 2 low and 3 high if pin 5 was active we would get another light on if pin 5 was low, then d2 would be on as well if pin 5 was high then d5 would be on as well
Timers
A timer is basically a counter operated by the processor clock. It can count down a fixed number of clock cycles. Almost all micro controllers have built in timers.
PIC timers
1.
2.
3.
3 timers Watchdog timer used to wake from sleep 8 bit TIMER0 16 bit Timer 1
timer0
This is in register 1, it counts instruction cycles Its rate of counting is controlled by the bottom 3 bits of the option register, which is register 81 Option value count rate n 1/2n+1 6 1/128 the maximum option value is 7
prescaler logic
10 ms
We want to wait 10 ms. Since the instruction cycle of the chip is 200ns, this amounts to 50,000 instructions. 50000= c350 hex If we set the prescaler to divide by 256, then when the timer reaches c4 hex we have waited just over 10ms
InitTimer
Set the option register Set the timer register. Problem the option register is register 81hex, we can only address registers 0 to 7Fhex with normal instructions
Register banks
Processor has two banks of registers, bank0 and bank1. Bank0 for normal use, bank1 contains special control registers. Which one you access is controlled by the status register
C =carry flag z = zero flag PD,TO give cause of timeout interrupts RP0 selects the register bank
to select bank 1 use instruction BSF 3,5 ; set bit 5 of reg 3 to select bank 0 use instruction BCF 3,5 ; clear bit 5 of reg 3
if this bit is set an interrupt will be generated on wrap round of timer 0 keep it 0 for now
this bit is set when the timer0 wraps round past 255
This flag is set when the timer wraps round. we want to count C4=196 cycles if we initialise the timer to 256-196=60 then it will wrap round at the right time
timer 1
This is a 16 bit timer that counts one step each instruction. Its low byte is in reg 0Eh and the high byte in register 0Fh It is controlled by register 10h ( T1CON) To switch it on set bit 0 of T1CON When it wraps round it sets bit 0 of register 0Ch This is much simpler to use for large counts
Register 5 , also called GPIO is mapped to the i/o pins on the chip We can test the switch by monitoring GPIO bit 3, to which pin 4 ( switch input) is connected +5
Control of I/O
GPIO is an 6-bit wide, bi-directional port. The corresponding data direction register is TRISIO. Setting a TRISIO bit (= 1) will make the corresponding GPIO pin an input (i.e., put the corresponding output driver in a tristate mode). Clearing a TRISIO bit (= 0) will make the corresponding GPIO pin an output (i.e., put the contents of the output latch on the selected pin). The exception is GP3, which is input only and its TRISIO bit will always read as 1.
Reading the GPIO register reads the status of the pins, whereas writing to it will write to the port latch. All write operations are read-modify-write operations. Therefore, a write to a port implies that the port pins are read,this value is modified, and then written to the port data latch.
;Bank 0 ;Init GPIO ;Set GP<2:0> to ;digital IO ;Bank 1 ;Disable analog input ;Set GP<3:2> as inputs ;and set GP<5:4,1:0> ;as outputs
If switch was low then bit 3 will be 0 and btfss will not skip the next instruction thus you will do the goto If switch was high, then the bit 3 will be 1 and then the goto will be skipped.
#define Bank0 0x00 #define Bank1 0x80 #define SWITCH GPIO,3 #define D0_1Tris B'11001111' #define D0On B'00010000' #define D0Off B'00000000 #define Flags 0x20 #define LEDOn Flags,0 We define Flags as register 20 it will be used to hold working values for the program
Initialise i/o
Init call 0x3FF ; retrieve factory calibration value ; comment instruction if using
simulator BANKSEL Bank1 movwf OSCCAL ; update register with factory cal value movlw D0_1Tris ; set direction so LEDs D0, D1 are outputs movwf TRISIO ; all others are inputs (high-z) clrf ANSEL ; configure A/D I/O as digital banksel Bank0 ; change back to PORT memory bank movlw CM2 | CM1 | CM0 ; comparator digital I/O movwf CMCON clrf Flags ; set initial LED state as off call ToggleLED ; light initial LED goto Main
Main program
repeat while not switch down do nothing; toggle LED wait for debounce forever;
Assembler
Main btfsc SWITCH goto Main call ToggleLED call SwitchDebounce goto Main ; wait in loop until SWITCH closure sensed ; SWITCH closure grounds input pin ; SWITCH closure sensed - toggle LED ; wait for switch to release and settle
; clear flag to indicate LED is off ; data for all LED outputs low ; send data to GPIO port ; return to calling routine
; set flag to indicate LED is on ; data to forward bias LED0 ; and reverse bias LED1 ; send data to GPIO port ; return to calling routine
Test state
btfss goto goto LEDOn TurnLedOn TurnLedOff
The first instruction skips the following instruction if the LEDOn flag is set. Thus if it is not on, the goto TurnLedOn instruction is executed, if it is on, the mpu goes to TurnLedOff
Debounce routine
SwitchDebounce call inittim SD2 btfss 5,3 goto SwitchDebounce btfss PIR1,0 goto SD2 return
; test SWITCH input ; SWITCH was low - reset timer ; wrap round? ; not counted to zero yet, continue ; full countdown ; and no bounces exit
END