In my previous blog "PIC32MZ tutorial -- Output Compare", I shows how to apply Output Compare without interrupt to generate PWM signal. I also tried the Output Compare interrupt. I selected OC to be PWM mode without fault pin (OCM = "110") and enable its interrupt. Below is the initialization of OC.

void OC1_Init(void)
{
OC1CON = 0x0000;
//RPD1/RD1 -> OC1
RPD1R = 0xC; IPC1SET = 0x1E000000;
IFS0CLR = 0x80;
IEC0SET = 0x80; OC1RS = OC_MIN;
OC1R = OC_MIN;
OC1CON = 0x2E;
OC1CONSET = 0x8000; // Enable OC
}

  But the application run not properly. The symptom was the OC interrupt never happened ( I set a breakpoint in the OC interrupt service routine, never saw the application entry this interrupt service routine). I raised a support ticket for this issue to Microchip. And the fleedback was that PWM mode without fault pin would not generate interrupt. So I decided change the PWM mode to Continuous Pulses mode (OCM = "101") and enabled interrupt then retried. This time the whole application is like below, it runs very well.

#include <xc.h>

#include <sys/attribs.h>
#pragma config FMIIEN = ON // Ethernet RMII/MII Enable (MII Enabled) // need a 25MHz XTAL in MII mode, a 50MHz Clock in RMII mode.
#pragma config FETHIO = ON // Ethernet I/O Pin Select (Default Ethernet I/O)
#pragma config PGL1WAY = ON // Permission Group Lock One Way Configuration (Allow only one reconfiguration)
#pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration)
#pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration)
#pragma config FUSBIDIO = OFF // USB USBID Selection (Controlled by Port Function)
// DEVCFG2  7FF9B11A
#pragma config FPLLIDIV = DIV_3 // System PLL Input Divider (3x Divider)
#pragma config FPLLRNG = RANGE_5_10_MHZ // System PLL Input Range (5-10 MHz Input)
#pragma config FPLLICLK = PLL_POSC // System PLL Input Clock Selection (POSC is input to the System PLL)
#pragma config FPLLMULT = MUL_50 // System PLL Multiplier (PLL Multiply by 50) //PLL must output between 350 and 700 MHz
#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (2x Divider)
#pragma config UPLLFSEL = FREQ_24MHZ // USB PLL Input Frequency Selection (USB PLL input is 24 MHz)
#pragma config UPLLEN = OFF // USB PLL Enable (USB PLL is disabled)
// DEVCFG1  7F7F3839
#pragma config FNOSC = SPLL // Oscillator Selection Bits (System PLL)
#pragma config DMTINTV = WIN_127_128 // DMT Count Window Interval (Window/Interval value is 127/128 counter value)
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disable SOSC)
#pragma config IESO = OFF // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = EC // Primary Oscillator Configuration (External clock mode)
#pragma config OSCIOFNC = ON // CLKO Output Signal Active on the OSCO Pin (Enabled)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disabled, FSCM Disabled)
#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576)
#pragma config WDTSPGM = STOP // Watchdog Timer Stop During Flash Programming (WDT stops during Flash programming)
#pragma config WINDIS = NORMAL // Watchdog Timer Window Mode (Watchdog Timer is in non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled)
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window size is 25%)
#pragma config DMTCNT = DMT31 // Deadman Timer Count Selection (2^31 (2147483648))
#pragma config FDMTEN = OFF // Deadman Timer Enable (Deadman Timer is disabled)
// DEVCFG0  FFFFFFF7
#pragma config DEBUG = OFF // Background Debugger Enable (Debugger is disabled)
#pragma config JTAGEN = ON // JTAG Enable (JTAG Port Enabled)
#pragma config ICESEL = ICS_PGx2 // ICE/ICD Comm Channel Select (Communicate on PGEC2/PGED2)
#pragma config TRCEN = ON // Trace Enable (Trace features in the CPU are enabled)
#pragma config BOOTISA = MIPS32 // Boot ISA Selection (Boot code and Exception code is MIPS32)
#pragma config FECCCON = OFF_UNLOCKED // Dynamic Flash ECC Configuration (ECC and Dynamic ECC are disabled (ECCCON bits are writable))
#pragma config FSLEEP = OFF // Flash Sleep Mode (Flash is powered down when the device is in Sleep mode)
#pragma config DBGPER = ALLOW_PG2 // Debug Mode CPU Access Permission (Allow CPU access to Permission Group 2 permission regions)
#pragma config EJTAGBEN = NORMAL // EJTAG Boot (Normal EJTAG functionality)
// DEVCP0
#pragma config CP = OFF // Code Protect (Protection Disabled) #define Mvec_Interrupt() INTCONSET = 0x1000; asm volatile("ei"); #define OC1_VALUE (PORTD & 0x2)
#define OC_MAX (0x7A120)
#define OC_MIN (0x0)
#define STEP_VALUE (500) #define LED_IOCTL() TRISHCLR = (1<<0)
#define LED_SETON() LATHSET = (1<<0)
#define LED_SETOFF() LATHCLR = (1<<0)
#define LED_ONOFF() LATHINV = (1<<0)
#define LED_OPEN() ANSELH &= 0xFFFFFFFE typedef enum _eRUN_MODE
{
Stable1,
Welcome,
Stable2,
Goodbye,
} eRUN_MODE;
eRUN_MODE LED_RunMode; void OC1_Init(void)
{
OC1CON = 0x0000;
//RPD1/RD1 -> OC1
RPD1R = 0xC; IPC1SET = 0x1E000000;
IFS0CLR = 0x80;
IEC0SET = 0x80; OC1RS = OC_MIN;
OC1R = OC_MIN;
OC1CON = 0x2D;
OC1CONSET = 0x8000; // Enable OC
}
void LED_Init(void)
{
LED_SETOFF();
LED_OPEN();
LED_IOCTL();
LED_RunMode = Stable1;
} void T23_Init(void)
{
T2CON = 0x0;
T3CON = 0x0;
TMR2 = ;
TMR3 = ; //IPC3SET = 0x50000;
IPC3SET = 0x120000;
IEC0SET = 0x4000;
IFS0CLR = 0x4000; PR2 = 0xA120;
PR3 = 0x7; T2CON = 0x0008;
T2CON |= 0x8000;
}
void T45_Init(void)
{
T4CON = ;
T5CON = ;
TMR4 = ;
TMR5 = ;
IPC6SET = 0x6;
IFS0CLR = 0x1000000;
IEC0SET = 0x1000000;
PR4 = 0xE100;
PR5 = 0x05F5;
T4CON = 0x0008;
T4CON |= 0x8000;
} void __ISR(_OUTPUT_COMPARE_1_VECTOR,ipl7AUTO) OC1_Handler(void)
{
IFS0CLR = 0x80;
LED_SETOFF();
if (LED_RunMode == Stable1)
{
; // do nothing
}
else if (LED_RunMode == Stable2)
{
; // do nothing
}
else if (LED_RunMode == Welcome)
{
OC1RS = OC1RS + STEP_VALUE;
if (OC1RS >= OC_MAX)
{
T4CON = 0x0008;
TMR4 = ;
TMR5 = ;
PR4 = 0xE100;
PR5 = 0x05F5;
T4CON = 0x8008;
IFS0CLR = 0x1000000;
LED_RunMode = Stable2;
}
}
else // LED_RunMode == Goodbye
{
OC1RS = OC1RS - STEP_VALUE;
if (OC1RS == OC_MIN)
{
T4CON = 0x0008;
TMR4 = ;
TMR5 = ;
PR4 = 0xE100;
PR5 = 0x05F5;
T4CON = 0x8008;
IFS0CLR = 0x1000000;
LED_RunMode = Stable1;
}
}
Nop();
} void __ISR(_TIMER_3_VECTOR,ipl4AUTO) T23_Handler(void)
{
LED_SETON();
TMR2 = ;
TMR3 = ;
IFS0CLR = 0x4000;
Nop();
}
void __ISR(_TIMER_5_VECTOR,ipl1AUTO) T45_Handler(void)
{
if (LED_RunMode == Stable1)
{
LED_RunMode = Welcome;
//PR5 = 0x98;
PR4 = 0x9680;
PR5 = 0x98;
}
else if (LED_RunMode == Welcome)
{
; // do nothing
}
else if (LED_RunMode == Stable2)
{
LED_RunMode = Goodbye;
//PR5 = 0x98;
PR4 = 0x9680;
PR5 = 0x98;
}
else // LED_RunMode == Goodbye
{
; // do nothing
}
TMR4 = ;
TMR5 = ;
IFS0CLR = 0x1000000;
Nop();
}
void main(void)
{
LED_Init();
OC1_Init();
T23_Init();
T45_Init();
Mvec_Interrupt();
while()
{
LED_Scheduler();
}
}

PIC32MZ tutorial -- OC Interrupt的更多相关文章

  1. PIC32MZ tutorial -- External Interrupt

    In my older blog "PIC32MZ tutorial -- Key Debounce", I shows how to acheive key debounce w ...

  2. PIC32MZ tutorial -- Timer Interrupt

    An interrupt is an internal or external event that requires quick attention from the controller. The ...

  3. PIC32MZ tutorial -- Output Compare

    Output Compare is a powerful feature of embedded world. The PIC32 Output Compare module compares the ...

  4. PIC32MZ tutorial -- Input Capture

    Today I accomplish a simple application for PIC32MZ EC Starter Kit. This application uses Input Capt ...

  5. PIC32MZ tutorial -- 32-bit Timer

    The microcontroller is PIC32MZ2048ECH144 on the PIC32MZ EC Starter Kit. This microcontroller has fou ...

  6. PIC32MZ tutorial -- Change Notification

    In my last post I implement "Key Debounce" with port polling, port polling is not very eff ...

  7. PIC32MZ tutorial -- Key Debounce

    Today I accomplish a application on PIC32MZ EC Starter Kit. The feature of application is to light u ...

  8. PIC32MZ tutorial -- UART Communication

    At this moment, I accomplish the interface of UART communication for PIC32MZ EC Starter Kit. This in ...

  9. PIC32MZ tutorial -- Watchdog Timer

    Watchdog is a very necessary module for embedded system. Someone said that embedded system operates ...

随机推荐

  1. C++const限定符

    在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...

  2. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  3. python中字典的使用

    python中的字典的特性: 在字典中的元素是散列存放的,没有顺序, 在进行增删改查的时候使用字典中需要的关键字(key)即可. 一: 创建字典 1)直接定义一个: dict = {'ob1':'co ...

  4. 好的bootstrap文章

    http://www.cnblogs.com/gamehiboy/p/5176618.html http://www.cnblogs.com/landeanfen/p/5821192.html htt ...

  5. Eclipse启动tomcat时出现报错-拒绝访问

    今天新建项目,当选择项目的发布路径为tomcat的路径时 启动tomcat出现如下错误: Publishing the configuration... Error copying file to D ...

  6. [转]PHP如何关闭notice级别的错误提示

    1.在php.ini文件中改动error_reporting改为: error_reporting=E_ALL & ~E_NOTICE 2.如果你不能操作php.ini文件,你可以使用如下方法 ...

  7. Discuz模拟批量上传附件发帖

    简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 模拟上传 discuz 附件逻辑 dz附件储存在 ...

  8. javascript的一点学习

    最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...

  9. 安装SQL提示重启电脑失败,解决办法

    1. 打开注册表, 找到HKEY_LOCAL_MACHINE-->software-->Microsof-->MSSQLServer...统统删掉 2.HKEY_LOCAL_MACH ...

  10. 三种Singleton的实现方式

    来源:http://melin.iteye.com/blog/838258 三种Singleton的实现方式,一种是用大家熟悉的DCL,另外两种使用cas特性来实现. public class Laz ...