有沒人測試過STC32G單片機的編碼器模式。
1.例程 中 P1口選擇P1.0 ,P1.2 ,STC32G 沒有P1.2 。這么郁悶的事也有。
2.換到P2 口也沒反應。
3.找到STC8H的編碼器歷程也不能用。
下面是STC8H編碼器模式歷程:
#include "reg51.h"
#include "intrins.h"
typedef struct TIM1_struct
{
volatile unsigned char CR1; /*!< control register 1 */
volatile unsigned char CR2; /*!< control register 2 */
volatile unsigned char SMCR; /*!< Synchro mode control register */
volatile unsigned char ETR; /*!< external trigger register */
volatile unsigned char IER; /*!< interrupt enable register*/
volatile unsigned char SR1; /*!< status register 1 */
volatile unsigned char SR2; /*!< status register 2 */
volatile unsigned char EGR; /*!< event generation register */
volatile unsigned char CCMR1; /*!< CC mode register 1 */
volatile unsigned char CCMR2; /*!< CC mode register 2 */
volatile unsigned char CCMR3; /*!< CC mode register 3 */
volatile unsigned char CCMR4; /*!< CC mode register 4 */
volatile unsigned char CCER1; /*!< CC enable register 1 */
volatile unsigned char CCER2; /*!< CC enable register 2 */
volatile unsigned char CNTRH; /*!< counter high */
volatile unsigned char CNTRL; /*!< counter low */
volatile unsigned char PSCRH; /*!< prescaler high */
volatile unsigned char PSCRL; /*!< prescaler low */
volatile unsigned char ARRH; /*!< auto-reload register high */
volatile unsigned char ARRL; /*!< auto-reload register low */
volatile unsigned char RCR; /*!< Repetition Counter register */
volatile unsigned char CCR1H; /*!< capture/compare register 1 high */
volatile unsigned char CCR1L; /*!< capture/compare register 1 low */
volatile unsigned char CCR2H; /*!< capture/compare register 2 high */
volatile unsigned char CCR2L; /*!< capture/compare register 2 low */
volatile unsigned char CCR3H; /*!< capture/compare register 3 high */
volatile unsigned char CCR3L; /*!< capture/compare register 3 low */
volatile unsigned char CCR4H; /*!< capture/compare register 3 high */
volatile unsigned char CCR4L; /*!< capture/compare register 3 low */
volatile unsigned char BKR; /*!< Break Register */
volatile unsigned char DTR; /*!< dead-time register */
volatile unsigned char OISR; /*!< Output idle register */
}TIM1_TypeDef;
#define TIM1_BaseAddress 0xFEC0
#define TIM1 ((TIM1_TypeDef xdata*)TIM1_BaseAddress)
#define PWMA_ENO (*(unsigned char volatile xdata *)0xFEB1)
#define PWMA_PS (*(unsigned char volatile xdata *)0xFEB2)
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P_SW2 = 0xba;
sbit P03 = P0^3;
unsigned char cnt_H, cnt_L;
void main(void)
{
P_SW2 = 0x80;
P1M1 = 0x0f;
P1M0 = 0x00;
PWMA_ENO = 0x00; //配置成TRGI 的pin需關掉ENO對應bit并配成input
PWMA_PS = 0x00; //00:PWM at P1
TIM1-> PSCRH = 0x00; //預分頻寄存器
TIM1-> PSCRL = 0x00;
TIM1-> CCMR1 = 0x21; //通道模式配置為輸入,接編碼器,濾波器4時鐘
TIM1-> CCMR2 = 0x21; //通道模式配置為輸入,接編碼器,濾波器4時鐘
TIM1-> SMCR = 0x03; //編碼器模式3
TIM1-> CCER1 = 0x55; //配置通道使能和極性
TIM1-> CCER2 = 0x55; //配置通道使能和極性
TIM1-> IER = 0x02; //使能中斷
TIM1-> CR1 |= 0x01; //使能計數器
EA = 1;
while (1);
}
/******************** PWM中斷讀編碼器計數值**************************/
void PWMA_ISR() interrupt 26
{
if (TIM1->SR1 & 0X02)
{
P03 = ~P03;
cnt_H = TIM1->CCR1H;
cnt_L = TIM1->CCR1L;
TIM1->SR1 &= ~0X02;
}
}
|