日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]  In my last post I implement "Key Debounce" with port polling, port polling is not very efficient. And this time, I will use change notification instead of port polling. It generates interrupt and

  In my last post I implement "Key Debounce" with port polling, port polling is not very efficient. And this time, I will use change notification instead of port polling. It generates interrupt and starts debounce when the level of digital port changes, so it will eliminate the MCU load of port polling.


  On my PIC32MZ EC Starter Kit, every I/O port pin (RAx-RKx) can be used as a change notification pin (CNAx-CNKx). The CN pins are configured as follows:


  1.Disable CPU interrupts.

  2.Set the desired CN I/O pin as an input by setting the corresponding TRISx register bits = 1.

  3.Enable the CN Module by setting the ON bit (CNCONx<15>) = 1.

  4.Enable individual CN input pins, enable optional pull-ups or pull-downs.

  5.Read the corresponding PORTx registers to clear the CN interrupt.

  6.Configure the CN Interrupt Priority bits, CNIP<2:0> (IPC6<20:18>), and Sub-priority bits,CNIS<1:0> (IPC6<17:16>).

  7.Clear the CN Interrupt Flag bit, by setting the CNIF bit (IFS1<0>) = 0.

  8.Configure the CN pin interrupt for a specific edge detect using the EDGEDETECT bit in the CNCONx register, and set up edge control using the CNENx/CNNEx bits.

  9.Enable the CN Interrupt Enable bit, by setting the CNIE bit (IEC1<0>) = 1.

10.Enable CPU interrupts.


  The CNSTATx registers indicate whether a change occurred on the corresponding pin since the last read of the PORTx bit. It is ridiculous that data sheet or reference manual mentions CNSTATx register but gives no figure or details. After so many times retry, I get to know it has to clear CNSTATx bit corresponding to CN pin in the CN interrupt service routine. Otherwise, the interrupt service routine may not work.


  Anyway, I get this change notification application work, and the following is the implementation.


  TIMER module:



void Timer1_Init(void)

{

T1CON = 0x8010;

PR1 = 0x30D3;

IPC1SET = 0x5;

TMR1 = 0;

IEC0SET = 0x10;

IFS0CLR = 0x10;

}


void Timer1_Write(unsigned int value)

{

TMR1 = value & 0xFFFF;

}


  KEY module ( enable change notification interrupt, debounce function):



#define DEBOUNCE_Input (PORTB & 0x1000)

#define DEBOUNCE_Open() ANSELB = 0xFFFFEFFF

#define DEBOUNCE_IOCtl() CNPUBSET = 0x1000

#define DEBOUNCE_Output LedState

#define DEBOUNCE_ThreholdLow 0

#define DEBOUNCE_ThreholdHigh 100

//extern volatile unsigned char DEBOUNCE_TimeFlag;

extern volatile unsigned char DEBOUNCE_EventStart;



  volatile unsigned char DEBOUNCE_EventStart;

//volatile unsigned char DEBOUNCE_TimeFlag;

unsigned long DEBOUNCE_PreInput;

unsigned int DEBOUNCE_Integrator;


void Key_Init(void)

{

DEBOUNCE_EventStart = 0;

DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

//DEBOUNCE_TimeFlag = 0;

DEBOUNCE_Open();

DEBOUNCE_IOCtl();

DEBOUNCE_PreInput = DEBOUNCE_Input;

CNENBSET = 0x1000;

IPC29SET = 0x12000000;

IFS3CLR = 0x800000;

IEC3SET = 0x800000;

CNCONBSET = 0x8000;

}


void Key_Debounce(void)

{

if (DEBOUNCE_EventStart)

{

if (DEBOUNCE_Input == 0)

{

if (DEBOUNCE_Integrator-- == DEBOUNCE_ThreholdLow)

{

DEBOUNCE_Output = 0;

DEBOUNCE_PreInput = DEBOUNCE_Input;

DEBOUNCE_EventStart = 0;

DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

}

}

else //if (DEBOUNCE_Input == 1)

{

if (DEBOUNCE_Integrator++ == DEBOUNCE_ThreholdHigh)

{

DEBOUNCE_Output = 1;

DEBOUNCE_PreInput = DEBOUNCE_Input;

DEBOUNCE_EventStart = 0;

DEBOUNCE_Integrator = DEBOUNCE_ThreholdHigh / 2;

}

}

}

}


  LED module:



#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 _LED_STATE_t {

/* Describe structure member. */

OFF = 0,


/* Describe structure member. */

ON = 1


} LED_STATE_t;

LED_STATE_t PreLedState, LedState;


void Led_Init(void)

{

LED_OPEN();

LED_IOCTL();

LED_SETON();

LedState = ON;

PreLedState = LedState;

}


void Led_Scheduler(void)

{

if (LedState != PreLedState)

{

LED_ONOFF();

PreLedState = LedState;

}

}


  MAIN module (main function, timer1 ISR, CNB ISR):



#include

#include "Led.h"

#include "Key.h"

#include "Timer.h"

#include "Interrupt.h"

#include

#include "ConfigurationBits.h"


void __ISR(_CHANGE_NOTICE_B_VECTOR,ipl4AUTO) CNB_Handler(void)

{

if ((CNSTATB & 0x1000) == 0x1000)

{

DEBOUNCE_EventStart = 1;

CNSTATBCLR = 0x1000;

unsigned long tmp = DEBOUNCE_Input;

}

IFS3CLR = 0x800000;

}


void __ISR(_TIMER_1_VECTOR,ipl1AUTO) Timer1_Handler(void)

{

//DEBOUNCE_TimeFlag = 1;

Key_Debounce();

Timer1_Write(0);

IFS0CLR = 0x10; // Clear flag

}


void main(void)

{

Led_Init();

Key_Init();

Timer1_Init();

Mvec_Interrupt();

while (1)

{

Led_Scheduler();

}

}


  The application runs well on PIC32MZ EC Starter Kit, SW1(connects to RB12) pressed, LED1(RH0) is off, SW1 released, LED1 is on.


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

Animoca Brands、 Hailstone Ventures 領(lǐng)投 香港2022年3月16日  /美通社/ -- 革命性數(shù)字資產(chǎn)交易所Wombat Exchange,宣布完成由區(qū)塊鏈游戲巨頭 Anim...

關(guān)鍵字: change 數(shù)字資產(chǎn)

(全球TMT2022年1月14日訊)近日,IBM Watson Advertisin(IBM)g宣布,其旗下The Weather Company的數(shù)據(jù)已可通過Amazon Web Services(AWS)的AWS...

關(guān)鍵字: change IBM AWS

點擊上方藍(lán)字關(guān)注我們!TechExchange是TI舉辦的一場為期三天的行業(yè)盛典,全球同步舉行,通過線上主題演講,技術(shù)分享,圓桌討論和線上Demo等環(huán)節(jié),攜手全球從業(yè)者共同探討行業(yè)最前沿的話題與應(yīng)用。就在今晚,TILiv...

關(guān)鍵字: change

點擊上方藍(lán)字關(guān)注我們!TechExchange是TI舉辦的一場為期三天的行業(yè)盛典,全球同步舉行,通過線上主題演講,技術(shù)分享,圓桌討論和線上Demo等環(huán)節(jié),攜手全球從業(yè)者共同探討行業(yè)最前沿的話題與應(yīng)用。就在今晚,TILiv...

關(guān)鍵字: change

谷歌剛剛發(fā)布了最新的Android 11測試版,即Android 11 Beta3。 這基本上是候選版本,因為它幾乎是我們在未來幾周內(nèi)看到的最終版本。

關(guān)鍵字: android11 api beta exposure notification

Microchip公司的PIC32MZ EF系列是高達(dá)250MHz的集成浮點單元(FPU),具有廣泛的外設(shè)和包括局域網(wǎng)(CAN)的極好的連接選擇,工作電壓2.1V到 3.6V,DSP增強(qiáng)核具有四

關(guān)鍵字: Microchip pic32mz 處理器

本月7日凌晨,Apple意外發(fā)布了iOS13.5的第二個Beta版本,iOS13.5beta4,在此之前,Apple還發(fā)布了iOS13.4.5的Beta版本,這次是iOS13.5。 從Beta3到Beta4的第二版,我不...

關(guān)鍵字: ios13.5 notification exposure

內(nèi)容交換公司BDx開始擴(kuò)張東南亞業(yè)務(wù) 香港2020年4月9日 /美通社/ -

關(guān)鍵字: change 數(shù)據(jù)中心 新加坡

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

關(guān)鍵字: interrupt pic32mz timer tutorial

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

關(guān)鍵字: interrupt pic32mz tutorial external
關(guān)閉