IT技術互動交流平台

福彩天下官网

作者(zhe)︰楊奉(feng)武456  來源︰IT165收集(ji)  發布日期︰2020-02-21 20:45:10

一開(kai)始沒寫好就(jiu)上傳了,,,,,,,,這次(ci)來個全的(de)

自己學(xue)MSP430是為了寫一篇關于PID的(de)文章,需(xu)要430在proteus上做仿真,一則認為在自動控制(zhi)算法上PID真的(de)很經典,PLC設(she)備(bei)上大(da)多是模塊式的(de),拿(na)來就(jiu)是參考(kao)說(shuo)明(ming)書(shu)設(she)置,設(she)置,,,而對于單片機而言就(jiu)是程序!!!只有自己寫出(chu)來PID算法,才能對PID有更深(shen)刻的(de)理解(jie),..二來感覺自己已經好久都沒有寫一篇讓自己感到(dao)滿意的(de)文章了......

這些天,,,,今(jin)天終于解(jie)除了我的(de)很大(da)疑(yi)惑了,,,,,,,終于可以完成(cheng)這篇普(pu)通普(pu)通定時器中斷的(de)文章了,,,,,,其(qi)實(shi)說(shuo)普(pu)通也不普(pu)通,,MSP430的(de)定時器確實(shi)設(she)計的(de)很強悍,,,,,,,,

其(qi)實(shi)對于普(pu)通定時器吧!不外(wai)乎,,,,定時,,,,產生中斷,,,,細(xi)節問題就(jiu)不說(shuo)了,,,,看(kan)ci)蟻旅嫻de)理論(lun)介紹部分(fen),,,我更注重于實(shi)戰講解(jie),,因(yin)為自己學(xue)習也喜歡听一步一步實(shi)戰講解(jie)的(de).然後再.

看(kan)一下具體的(de)理論(lun)資料,,,,,,然後就(jiu),,,,,懂了,,,,會(hui)了

CCR0   和  TACCR0  是一個哈,,,,,,,,別在別處(chu)看(kan)到(dao)CCR0就(jiu)蒙了哈,,,這是設(she)置的(de)計數比較(jiao)值(zhi),,

430的(de)定時器能選(xuan)擇時鐘來源,,具體看(kan)下面,,,如果(guo)不選(xuan)擇那麼就(jiu)是用一個引(yin)腳(特定的(de))的(de)輸(shu)入PWM作為他的(de)時鐘了

先上菜----外(wai)部引(yin)腳來四(si)個上升沿(yan)就(jiu)進入下面的(de)中斷函數  

實(shi)質----內部kao)剖AR在計數到(dao)CCR0(TACCR0)時就(jiu)進來了

__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ P4OUT ^= BIT1; //P4_1引(yin)腳反轉(zhuan)}

然後再來一個上升沿(yan),,就(jiu)會(hui)進入---溢出(chu)中斷-------可以取(qu)消(xiao),不讓他有溢出(chu)中斷   

實(shi)質----內部kao)剖AR在計數到(dao)CCR0後,,再來一個上升沿(yan)就(jiu)變成(cheng) 0 了,,,然後就(jiu)就(jiu)進來了

__interrupt void Timer_A1 (void) //A1,A2,溢出(chu)中斷都會(hui)進{ switch( TAIV ) { case TAIV_TAIFG://溢出(chu)中斷  P4OUT ^= BIT1; //P4_1反轉(zhuan)  break; }}

下面是完整的(de)程序

P1_0引(yin)腳,來四(si)個上升沿(yan)TAR變為4,,P4_1反轉(zhuan),,,再來一個沿(yan)TAR變為0,再來四(si)個,TAR變為4,,P4_1反轉(zhuan),再來一個沿(yan)TAR變為0,再來四(si)個,TAR變為4,,P4_1反轉(zhuan),,,循環

所以發現zhi)諞淮ci)來四(si)個P4_1反轉(zhuan),,,,後來的(de)都是來5個再反轉(zhuan)了,,所以如果(guo)你想(xiang)來四(si)個反轉(zhuan),,那麼TACCR0應(ying)該為3

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1; TACTL = TASSEL_0 + MC_1+ TAIE + TACLR;//時鐘外(wai)部引(yin)腳輸(shu)入,增計數模式,產生溢出(chu)中斷(可以取(qu)消(xiao)),清除一下溢出(chu),,其(qi)實(shi)嚴謹一點嘛,先清除再說(shuo) TACCR0 = 3;//計數值(zhi)3 TACCTL0 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ P4OUT ^= BIT1; }#pragma vector = TIMERA1_VECTOR__interrupt void Timer_A1 (void) //A1,A2,溢出(chu)中斷都會(hui)進{ switch( TAIV ) { case TAIV_TAIFG://溢出(chu)中斷  P4OUT ^= BIT1;  break; }}

現在去掉溢出(chu)中斷

 

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1; TACTL = TASSEL_0 + MC_1+TACLR;//外(wai)部引(yin)腳模式,,增計數模式 TACCR0 = 3;//計數值(zhi)3,其(qi)實(shi)是4,,因(yin)為有一個溢出(chu)變為0 TACCTL0 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ P4OUT ^= BIT1; }

下面是一些具體解(jie)釋

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1+BIT2; TACTL = TASSEL_0 + MC_2+TACLR;//外(wai)部引(yin)腳模式,,連續計數模式 TACCR0 = 4;//計數值(zhi)4 TACCTL0 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ P4OUT ^= BIT1; }

可以這樣

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1+BIT2; TACTL = TASSEL_0 + MC_2+TACLR;//外(wai)部引(yin)腳模式,,連續計數模式 TACCR0 = 4;//計數值(zhi)4 TACCTL0 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ TACCR0 = TACCR0 + 4;//******這里,這里***********// P4OUT ^= BIT1; }

因(yin)為是連續計數模式,所以可以用TACCR1了,,,,

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1+BIT2; TACTL = TASSEL_0 + MC_2+TACLR;//外(wai)部引(yin)腳模式,,連續計數模式 TACCR0 = 4;//計數值(zhi)4,TAR==TACCR0進入它的(de)中斷函數 TACCTL0 = CCIE;//允(yun)許(xu)中斷 TACCR1 = 6;//計數值(zhi)6,TAR==TACCR1進入它的(de)中斷函數 TACCTL1 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ TACCR0 = TACCR0 + 4;//******這里,這里***********// P4OUT ^= BIT1; }#pragma vector = TIMERA1_VECTOR__interrupt void Timer_A1 (void) //A1,A2,溢出(chu)中斷都會(hui)進(共用){ switch( TAIV ) { case TAIV_TACCR1://計數' TACCR1 '的(de)中斷  TACCR1 = TACCR1 + 6;  P4OUT ^= BIT2;  break; }}

既然有溢出(chu)中斷那麼再加上溢出(chu)中斷吧

#include 'io430.h'void main( void ){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//關閉看(kan)門(men)狗 P4DIR = BIT1+BIT2+BIT3; TACTL = TASSEL_0 + MC_2 + TAIE +TACLR;//外(wai)部引(yin)腳模式,,增計數模式 TACCR0 = 4;//計數值(zhi)4,TAR==TACCR0進入它的(de)中斷函數 TACCTL0 = CCIE;//允(yun)許(xu)中斷 TACCR1 = 6;//計數值(zhi)6,TAR==TACCR1進入它的(de)中斷函數 TACCTL1 = CCIE;//允(yun)許(xu)中斷 __enable_interrupt();//打開(kai)總中斷}#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A0 (void) //定時器A0中斷服務(wu)程序{ TACCR0 = TACCR0 + 4;//******這里,這里***********// P4OUT ^= BIT1; }#pragma vector = TIMERA1_VECTOR__interrupt void Timer_A1 (void) //A1,A2,溢出(chu)中斷都會(hui)進(共用){ switch( TAIV ) { case TAIV_TACCR1://計數' TACCR1 '的(de)中斷  TACCR1 = TACCR1 + 6;  P4OUT ^= BIT2;  break; case TAIV_TAIFG://溢出(chu)中斷,,,,ffff變0時  P4OUT ^= BIT3;  break;  }}

下面是理論(lun)知識的(de)介紹,,,看(kan)了上面再看(kan)一下下面,,,,,

 

通俗來講,430F249有三個振蕩(dang)器,LFXT1,,XT2,,DCO,

內部的(de)主(zhu)時鐘MCLK,,子(zi)系統時鐘SMCLK和輔助時鐘ACLK是由這三個振蕩(dang)器來源提(ti)供的(de).

MCLK:主(zhu)時鐘

可以選(xuan)擇3個振蕩(dang)器(LFXT1、XT2、DCO)之一,或它們1/2/4/8分(fen)頻後作為其(qi)信號源;

SMCLK:子(zi)系統時鐘

可以選(xuan)擇2個振蕩(dang)器(XT2、DCO),或它們1/2/4/8分(fen)頻後作為其(qi)信號源;

ACLK:輔助時鐘

只能由LFXT1時鐘信號或1/2/4/8分(fen)頻後作為其(qi)信號源chu)/p>

有三個呢(ne)!!!真多

 

自從博客可以復制(zhi)pu)程計感覺真是太方便了

Tag標簽︰定時器  
  • 福彩天下官网

About IT165 - 廣(guang)告服務(wu) - 隱(yin)私聲明(ming) - 版權申明(ming) - 免責條款(kuan) - 網站地圖 - 網友投(tou)稿 - 聯系方式
本站內容來自于互聯網,僅(jin)供用于網絡技術學(xue)習,學(xue)習中請遵循相關法律法規
福彩天下官网 | 下一页