|
|
View previous topic :: View next topic |
Author |
Message |
Al Guest
|
Interrupt handling in general |
Posted: Wed Oct 08, 2003 8:45 am |
|
|
I've just recently started using my PCM PIC compiler. I find it very difficult to find useful into in the manual about interrupts. In the text for #INT_xxxx a lot of syntax is included with no information about how it works. What, for example, is #INT_BUTTON? Is it used to debounce RB0? Where is an example? A two hour coding project is dragging out into days. And the references I have found in the form, like http://www.pic-c.com/forum/general/posts/2138.html do not exist. I'm not impressed.[/b] |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Wed Oct 08, 2003 9:22 am |
|
|
If you study the datasheet on the part that you are programming it will make more sense to you. The defines are taken from the terminology in the datasheet. It took me about 3 mins to find this data.
2. For the 14000 the interrupts #INT_ADOF, #INT_RC, #INT_I2C and #INT_BUTTON
have been added.
Code: |
//////// Standard Header file for the PIC14000 device ////////
#device PIC14000
#nolist
/////////////////////////////// I/O definitions for INPUT() and OUTPUT_xxx()
#define PIN_A0 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43
#define PIN_C0 56
#define PIN_C1 57
#define PIN_C2 58
#define PIN_C3 59
#define PIN_C4 60
#define PIN_C5 61
#define PIN_C6 62
#define PIN_C7 63
#define PIN_D0 64
#define PIN_D1 65
#define PIN_D2 66
#define PIN_D3 67
#define PIN_D4 68
#define PIN_D5 69
#define PIN_D6 70
#define PIN_D7 71
/////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1
#define BYTE int
#define BOOLEAN short int
#define getc getch
#define getchar getch
#define puts(s) {printf(s); putchar(13); putchar(10);}
#define putc putchar
/////////////////////////////// Constants used for RESTART_CAUSE()
#define WDT_FROM_SLEEP 0
#define WDT_TIMEOUT 8
#define MCLR_FROM_SLEEP 16
#define NORMAL_POWER_UP 24
/////////////////////////////// Constants used for SETUP_COUNTERS()
#define RTCC_INTERNAL 0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_2 0
#define RTCC_DIV_4 1
#define RTCC_DIV_8 2
#define RTCC_DIV_16 3
#define RTCC_DIV_32 4
#define RTCC_DIV_64 5
#define RTCC_DIV_128 6
#define RTCC_DIV_256 7
#define WDT_18MS 8
#define WDT_36MS 9
#define WDT_72MS 10
#define WDT_144MS 11
#define WDT_288MS 12
#define WDT_576MS 13
#define WDT_1152MS 14
#define WDT_2304MS 15
#define L_TO_H 0x40
#define H_TO_L 0
#define RTCC_ZERO 0x0B20 // Used for ENABLE/DISABLE INTERRUPTS
#define INT_RTCC 0x0B20 // Used for ENABLE/DISABLE INTERRUPTS
#define RB_CHANGE 0x0B08 // Used for ENABLE/DISABLE INTERRUPTS
#define INT_RB 0x0B08 // Used for ENABLE/DISABLE INTERRUPTS
#define EXT_INT 0x0B10 // Used for ENABLE/DISABLE INTERRUPTS
#define INT_EXT 0x0B10 // Used for ENABLE/DISABLE INTERRUPTS
#define GLOBAL 0x0BC0 // Used for ENABLE/DISABLE INTERRUPTS
///////////////////////////////////// Constants used for SETUP_ADC_PORTS()
#define ALL_ANALOG 0x0 // To setup PORTA and PORTD, 'A'
#define RA0_RA1_RA2_ANALOG 0x1 // and 'D' values should be ORed
#define RA0_RA1_ANALOG 0x2
#define A_NO_ANALOGS 0x3
#define RD4_RD5_RD6_ANALOG 0x4
#define RD4_RD5_ANALOG 0x8
#define D_NO_ANALOGS 0xC
#define NO_ANALOGS 0xf
///////////////////////////////////// Constants used for SETUP_ADC()
#define CURRENT_0 0x00
#define CURRENT_2 0x10
#define CURRENT_4 0x20
#define CURRENT_7 0x30
#define CURRENT_9 0x40
#define CURRENT_11 0x50
#define CURRENT_13 0x60
#define CURRENT_16 0x70
#define CURRENT_18 0x80
#define CURRENT_20 0x90
#define CURRENT_22 0xA0
#define CURRENT_25 0xB0
#define CURRENT_27 0xC0
#define CURRENT_29 0xD0
#define CURRENT_31 0xE0
#define CURRENT_34 0xF0
///////////////////////////////////// 14000 Special
#define INT_RC 0x8C04
#define INT_BUTTON 0x8C10
#define INT_COMP 0x8C80
#list
|
Form the PIC14000 datasheet
Quote: |
10.6.1 EXTERNAL INTERRUPT
An external interrupt can be generated via the
OSC1/PBTN pin if IN (internal oscillator) mode is
enabled. This interrupt is falling edge triggered. When
a valid edge appears on OSC1/PBTN pin, PBIF
(PIR1<4>) is set. This interrupt can be disabled by
clearing PBIE (PIE1<4>). PBIF must be cleared in software
in the interrupt service routine before re-enabling
the interrupt. This interrupt can wake up the processor
from SLEEP if PBIE bit is set (interrupt enabled) prior
to going into SLEEP mode. The status of the GIE bit
determines whether or not the processor branches to
the interrupt vector following wake-up. The timing of the
external interrupt is shown in Figure 10-10.
|
PBTN = push button |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 08, 2003 12:26 pm |
|
|
And the references I have found in the form, like http://www.pic-c.com/forum/general/posts/2138.html do not exist. I'm not impressed.
------------------------------------------------------------------------------
That's a bad link because all the posts from the previous CCS forum
were appended to this new forum, but the links were not updated to
point to the new forum. So here's a repost of the INT_EXT example.
If you have a specific design problem, then tell us what you're trying
to do, and we'll help you to solve it.
Code: | #include "16F877.h"
#fuses HS, NOWDT, NOPROTECT, PUT, BROWNOUT, NOLVP
#use Delay(Clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#zero_ram
//-------------------------------
// GLOBALS
char got_interrupt;
char interrupt_count;
#bit INTF_BIT = 0x0B.1
//-----------------------------
// FUNCTION PROTOTYPES
#int_ext
void int_ext_isr(void);
//=============================
void main(void)
{
// Make pin B0 into an input.
output_float(PIN_B0);
// Enable pullups on all port B pins.
port_b_pullups(TRUE);
// Wait for them to pull up.
delay_us(10);
// Initialize the variables used by the interrupt routine,
// before enabling interrupts.
interrupt_count = 0;
got_interrupt = FALSE;
// Since we have port B pullups enabled, the normal state
// of Pin B0 is a high level. Let's set up the external
// interrupt to occur whenever we get a change from
// a high to a low level.
// We will connect a Normally-open push-button switch to Pin B0.
// The "common" pin of the switch goes to Ground.
// When we press the button, Pin B0 will go to logic low level.
ext_int_edge(H_TO_L);
// Make sure the external interrupt flag bit is cleared
// before enabling external interrupts.
INTF_BIT = 0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// Wait in this loop. Check the got_interrupt flag to see
// if an interrupt occurred. If so, display the count.
// Then clear the flag, wait 50 ms to avoid any "bounce"
// (multiple interrupts) when we press the pushbutton switch,
// which puts Ground on pin B0. Then re-enable interrupts.
while(1)
{
if(got_interrupt == TRUE)
{
printf("%d\n\r", interrupt_count);
// Clear the global flag which was set in the interrupt routine.
got_interrupt = FALSE;
// Wait for debounce period. This allows time for the switch contacts
// to quit bouncing.
delay_ms(50);
// Clear any interrupt which might have occurred during the debounce period.
INTF_BIT = 0;
// Then re-enable interrupts.
enable_interrupts(INT_EXT);
}
}
}
//========================
#int_ext
void int_ext_isr(void)
{
got_interrupt = TRUE;
interrupt_count++;
disable_interrupts(INT_EXT);
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|