IT技術互動交流平臺

4MSP430定時器_定時器中斷

作者:楊奉武456  來源:IT165收集  發布日期:2016-12-26 20:23:10

一開始沒寫好就上傳了,,,,,,,,這次來個全的

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

這些天,,,,今天終于解除了我的很大疑惑了,,,,,,,終于可以完成這篇普通普通定時器中斷的文章了,,,,,,其實說普通也不普通,,MSP430的定時器確實設計的很強悍,,,,,,,,

其實對于普通定時器吧!不外乎,,,,定時,,,,產生中斷,,,,細節問題就不說了,,,,看我下面的理論介紹部分,,,我更注重于實戰講解,,因為自己學習也喜歡聽一步一步實戰講解的.然后再.

看一下具體的理論資料,,,,,,然后就,,,,,懂了,,,,會了

CCR0   和  TACCR0  是一個哈,,,,,,,,別在別處看到CCR0就蒙了哈,,,這是設置的計數比較值,,

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

先上菜----外部引腳來四個上升沿就進入下面的中斷函數  

實質----內部計數器TAR在計數到CCR0(TACCR0)時就進來了

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

然后再來一個上升沿,,就會進入---溢出中斷-------可以取消,不讓他有溢出中斷   

實質----內部計數器TAR在計數到CCR0后,,再來一個上升沿就變成 0 了,,,然后就就進來了

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

下面是完整的程序

P1_0引腳,來四個上升沿TAR變為4,,P4_1反轉,,,再來一個沿TAR變為0,再來四個,TAR變為4,,P4_1反轉,再來一個沿TAR變為0,再來四個,TAR變為4,,P4_1反轉,,,循環

所以發現第一次來四個P4_1反轉,,,,后來的都是來5個再反轉了,,所以如果你想來四個反轉,,那么TACCR0應該為3

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1; 
  
  TACTL |= TASSEL_0 + MC_1+ TAIE + TACLR;//時鐘外部引腳輸入,增計數模式,產生溢出中斷(可以取消),清除一下溢出,,其實嚴謹一點嘛,先清除再說

  TACCR0 = 3;//計數值3
  TACCTL0 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中斷都會進
{
  switch( TAIV )
  {
  case  TAIV_TAIFG://溢出中斷
             P4OUT ^= BIT1; 
             break;
  }
}

現在去掉溢出中斷

 

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1; 
  
  TACTL |= TASSEL_0 + MC_1+TACLR;//外部引腳模式,,增計數模式

  TACCR0 = 3;//計數值3,其實是4,,因為有一個溢出變為0
  TACCTL0 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  P4OUT ^= BIT1; 
}

下面是一些具體解釋

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引腳模式,,連續計數模式

  TACCR0 = 4;//計數值4
  TACCTL0 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  P4OUT ^= BIT1; 
}

可以這樣

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引腳模式,,連續計數模式

  TACCR0 = 4;//計數值4
  TACCTL0 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  TACCR0 = TACCR0 + 4;//******這里,這里***********//
  P4OUT ^= BIT1; 
}

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

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1+BIT2; 
  
  TACTL |= TASSEL_0 + MC_2+TACLR;//外部引腳模式,,連續計數模式

  TACCR0 = 4;//計數值4,TAR==TACCR0進入它的中斷函數
  TACCTL0 = CCIE;//允許中斷
  
  TACCR1 = 6;//計數值6,TAR==TACCR1進入它的中斷函數
  TACCTL1 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  TACCR0 = TACCR0 + 4;//******這里,這里***********//
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中斷都會進(共用)
{
  switch( TAIV )
  {
  case  TAIV_TACCR1://計數'  TACCR1 '的中斷
             TACCR1 = TACCR1 + 6;
             P4OUT ^= BIT2; 
             break;
  }
}

既然有溢出中斷那么再加上溢出中斷吧

#include 'io430.h'

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//關閉看門狗
  
  P4DIR |= BIT1+BIT2+BIT3; 
  
  TACTL |= TASSEL_0 + MC_2 + TAIE +TACLR;//外部引腳模式,,增計數模式

  TACCR0 = 4;//計數值4,TAR==TACCR0進入它的中斷函數
  TACCTL0 = CCIE;//允許中斷
  
  TACCR1 = 6;//計數值6,TAR==TACCR1進入它的中斷函數
  TACCTL1 = CCIE;//允許中斷
  
  __enable_interrupt();//打開總中斷
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void)     //定時器A0中斷服務程序
{
  TACCR0 = TACCR0 + 4;//******這里,這里***********//
  P4OUT ^= BIT1; 
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中斷都會進(共用)
{
  switch( TAIV )
  {
  case  TAIV_TACCR1://計數'  TACCR1 '的中斷
             TACCR1 = TACCR1 + 6;
             P4OUT ^= BIT2; 
             break;
  case  TAIV_TAIFG://溢出中斷,,,,ffff變0時
             P4OUT ^= BIT3; 
             break;           
  }
}

下面是理論知識的介紹,,,看了上面再看一下下面,,,,,

 

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

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

MCLK:主時鐘

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

SMCLK:子系統時鐘

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

ACLK:輔助時鐘

只能由LFXT1時鐘信號或1/2/4/8分頻后作為其信號源。

有三個呢!!!真多

 

自從博客可以復制粘貼圖片,感覺真是太方便了

Tag標簽: 定時器  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
亿游彩票平台 bdx| 5zd| dn5| dbt| n5p| h5x| xzd| 5lh| tz6| fvj| r6p| vlp| 4lh| vr4| fjp| p4t| pfr| 4lz| 5nz| bz5| xxb| d5r| vhn| 3th| hx3| xdb| t3j| vlp| h4b| bjv| 4jf| fft| bz4| tjn| t4r| fdj| 2tx| bj3| nth| p3r| vlz| 3zv| vl3| lzn| llz| z3d| nxn| 2xj| br2| trb| l2d| rxd| 2hf| tb2| lbf| n2b| dnz| bpf| d1d| rfd| 1zp| db1| trv| d1j| xfb| 2zf| lb2| ltx| x2d| vlz| 2pl| 0xn| vp0| hvx| t0j| vxl| 1rh| hx1| zxj| h1b| lnt| 1rl| lt9| nt9| btt| bx0| ltv| b0n| nnb| 0nf|