Interrupts and reset operations Overview Introduction to interrupts – What are they – How are they used 68HC11 interrupt mechanisms – Types of interrupts – Interrupt priorities Resets and their operation/use Readings: Text, sections 3.6 -- 3.10 Interrupts: an overview Mechanism for responding to external events – CPU suspends execution of current routine – Jumps to a special interrupt service routine (ISR) – After executing the ISR, it returns to what it was executing before Interrupts: an overview Why use interrupts? ... Efficiency! – Interrupts increase processor system efficiency by letting an I/O device request CPU time only when that device needs immediate attention. – “Main” programs can perform routine tasks without continually polling for I/O device status. Interrupts: an overview Interrupts allow the processor to interact with slow devices in an efficient manner – Consider Lab 2: » Required that a counter be updated every second while monitoring a digital input Pseudocode: Interrupts: an overview Loop: update counter delay check for digital input goto Loop » What about inputs that occur during delay? Interrupts: an overview – Use a timer that can generate an interrupt » Pseudocode Loop: check for input goto Loop Timer_ISR: update counter reset timer return Interrupts: an overview Interrupt Vectors – Interrupt Vector Table located at $FFC0-$FFFF in memory (ROM area) – Each type of interrupt has an entry in the table » Entry contains address of interrupt service routine (16-bit value) » See p.3 of the Programming Reference Guide or Table B-2 in text Interrupts: an overview What happens when an interrupt occurs? – CPU finishes processing current instruction – CPU automatically stacks registers to save the current state of the processor » Pushed onto stack in following order: PC, IY, IX, ACCA, ACCB, CCR – Fetches address of ISR from vector table – Jumps to ISR address Interrupts: an overview – ISR should end with RTI instruction (Return from Interrupt) » Automatically pulls registers off stack » Returns to original program (using value of PC that was pulled Interrupts: an overview Sources of interrupts – I/O » SCI, SPI » Parallel I/O (STRBA) – Timer, pulse accumulator, real-time interrupt – External pins » XIRQ*, IRQ* Interrupts: an overview – Software interrupt » SWI instruction – Illegal opcode trap – COP failure – Clock monitor – RESET* pin Interrupts: an overview Masks and enables – Some interrupts are maskable » If interrupt is masked (or disabled), it will be ignored by the CPU » Can be enabled/disabled by setting bits in control registers – Non-maskable interrupts » Can be used for interrupts that should never be ignored Interrupts: an overview – I bit in CCR is the interrupt request mask » If set, all maskable interrupts are disabled Use CLI and SEI instructions to clear/set I bit is initially set after system reset » To only mask some interrupts, clear I and set the individual masks in the control registers – X bit in CCR is the XIRQ mask » Masks the XIRQ* pin (non-maskable interrupt) » Initially set after system reset » Software can clear it, but cannot set it 68HC11 interrupts -- 18 in all Non-maskable -- 3 types – XIRQ* » On reset, this interrupt is masked » During initialization, XIRQ can be enabled using a TAP instruction (clear the X bit in the CCR) » Once enabled during initiation, its state will not change » Used for high priority interrupt sources -- safety 68HC11 interrupts -- 18 in all – Illegal opcode fetch » When an opcode is decoded, if it is invalid, this interrupt will occur » User should write trap routine to deal with the error – Software generated interrupt (SWI) » Instruction SWI behaves like an interrupt » Enables development tools such as breakpoints in Buffalo monitor 68HC11 interrupts -- 18 in all Maskable -- 15 types – These interrupts are masked as a group by the I bit in the CCR – IRQ* » External pin » Primary off-chip maskable interrupt » Can be set to either low-level or falling-edge sensitive 68HC11 interrupts -- 18 in all Default is level sensitive (IRQE=0 in OPTION register) Edge sensitive can be set within first 64 cycles after reset (IRQE=1 in OPTION register) – Other interrupts based on operation of internal support hardware -- timers, serial I/O, parallel I/O, etc. 68HC11 interrupts -- 18 in all Interrupt Priority – What if two interrupts occur at the same time? » Interrupts have assigned priority levels PSEL3-0 in HPRIO register can be used to designate highest priority interrupt – Default is IRQ* 68HC11 interrupts -- 18 in all » Higher priority interrupt is serviced first When CPU recognizes an interrupt, it sets the I bit – Prevents additional interrupts I bit is restored by RTI » It is possible to clear the I bit in the ISR (CLI instruction) to allow the ISR to be interrupted (nested interrupts) Usually a bad idea 68HC11 resets Resetting the processor brings the system up into a known point from which normal operations can be initiated – Primarily concerned with the initialization of operating conditions and key register values Similar to interrupt except that registers are not stacked 68HC11 resets 68HC11 supports 3 types of resets – Power on or RESET* » Occurs when a rising edge is detected on input power Vdd (i.e., at power up) or when user asserts the input RESET* line » Power up reset delays reset actions for 4096 clock cycles to allow clock to stabilize » RESET* must be held low for 6 clock cycles in order to be recognized (vs. it being used as an output signal) 68HC11 resets – Computer Operating Properly (COP) watchdog timer failure reset » When activated, causes the processor to reset if no activity is detected for a long period of time » Processor must periodically execute code segment to reset the watchdog timer to avoid the reset Write $55 to COPRST ($103A) followed by writing $AA 68HC11 resets » Examples of use: System is waiting for sensor input but sensor has failed and will never provide input EMI may cause interference in fetching instructions/data » Enable the watchdog during initialization operations (NOCOP bit in CONFIG register) 68HC11 resets – Clock monitor reset » Causes a reset if clock frequency drops below 10 kHz » Clock frequencies from 10 kHz to 200 kHz can cause unpredictable reset actions » Once the low frequency clock is detected, system should have ~1000 clock cycles to reset before clock dies completely (based on time constant of crystal) 68HC11 resets 68HC11 Instructions – RTI -- Return from Interrupt – CLI -- Clear I bit in CCR – SEI -- Set I bit in CCR – WAI -- Wait for Interrupt » Stacks registers and waits for an unmasked interrupt » Reduces power consumption 68HC11 resets – STOP » If S bit in CCR is set, this acts like a NOP » Else Causes all system clocks to halt Minimum power standby mode Registers and I/O pins are unaffected Can recover with RESET*, XIRQ*, or unmasked IRQ* signal 68HC11 resets Specifying Interrupt Service Routine Addresses – The starting addresses of all interrupt service routines are specified in the jump table at addresses FFC0 -- FFFF -- ROM area in the HC11 – Table contents and thus the ISR addresses must be specified at the time of manufacture 68HC11 resets 68HC11 resets – In evaluation units such as the EVBU, we can not change the contents of the ROM jump table (the table had to be completed during manufacture) » In the table, the ISR starting addresses are specified to be in the RAM area of the memory system » This RAM area is, in effect, a second “pseudojump table” for user to specify the real ISR starting addresses -- sort of like indirect addressing Each entry is 3 bytes -- allows for unconditional jump statement to the ISR address 68HC11 resets » Thus, to use interrupts in your programs, you must Determine the ISR starting address specified in the jump table at FFC0 At that specified address in RAM, store the opcode for a JMP instruction followed by the address of the ISR 68HC11 resets » Table 3-2 in the EVBU manual lists the jump table addresses for the ISRs WARNING: the addresses in the tables should ALL start with 00 instead of E0. For example, the clock monitor ISR is at addresses $00FD-00FF in RAM 68HC11 resets Reentrant subroutines – Any subroutines called by an ISR should be reentrant, especially if used elsewhere in your program » A “reentrant” subroutine can be called again before it returns from a previous call – Example: Subroutine to convert 8-bit hex value into 2 ASCII digits ;****************** ; Hex_To_ASCII: Calls routine Convert_Nibble to convert 4-bit ; value to ASCII ; Input: Hex value in ACCA ; Output: ASCII digits in ACCA and ACCB 68HC11 resets Temp_Storage DS 1 ; temporary result Hex_To_ASCII: TAB ANDB #$0F JSR Convert_Nibble ; STAB Temp_Storage TAB LSRB LSRB LSRB LSRB JSR Convert_Nibble LDAA Temp_Storage result in B 68HC11 resets Reentrant Subroutines – To make subroutines reentrant, don’t use allocated memory for passing parameters or temporary storage – Use the stack or registers instead ;****************** ; Hex_To_ASCII: Assume Convert_Nibble is also reentrant. ; Input: Hex value in ACCA ; Output: ASCII digits in ACCA and ACCB ;****************** 68HC11 resets Hex_To_ASCII: TAB ANDB #$0F JSR Convert_Nibble ; result in B PSHB ; save on stack TAB LSRB LSRB LSRB LSRB JSR Convert_Nibble PULA ; get first result RTS 68HC11 resets