我目前正在学习PIC汇编,并且我已经涉及到计时器这一主题。我知道计时器会根据预分频器递增其寄存器中的值,直到发生溢出,在这种情况下它将发送中断。
我不明白我应该如何配置预分频器,以便定时器以我选择的时间间隔(例如1s)发送中断。示例代码将不胜感激。
((我正在使用PIC16F877A中的Timer1)
我知道定时器根据预分频器递增其寄存器中的值,直到发生溢出,在这种情况下它将发送中断。
这是部分正确的。 该值将根据所选的时钟输入和预分频器递增。预分频器仅将时钟输入划分为不同的时间单位。我将使用Microchip应用笔记AN580中的示例。
假设您选择了一个外部时钟源(设置为TMR1CS
),并且该时钟源为32.768kHz,则输入到预分频器功能块的频率为32.768kHz。通过将T1CKPS1
和T1CKPS0
设置为所需的值,可以在以下比例之间选择预分频器:1:1、1:2、1:4和1:8。将增加TIMER1寄存器的时钟频率可以是以下任意一种:
Prescale .... T1CKPS1 .... T1CKPS0 .... FREQUENCY(kHz)1 .................. 0 .................. 0 ........... ...... 32.7682 ......... 0 .................. 1 ........... ...... 16.3844 .................. 1 .................. 0 .......... ...... 8.1928 ......... 1 .................. 1 ........... ...... 4.096
溢出时间是TIMER1计数到最大值所花费的时间。使用16位计数器,最大计数为2 ^ 16 = 65536个计数。溢出时间就是计数的数量除以频率。这为我们提供了以下基于预分频值的溢出时间:
Prescale .... FREQUENCY(kHz) .... TIME]1 .................. 32.768 ........................ 22 .................. 16.384 ........................ 44 .................. 8.192 .......................... 88 ............ 4.0961 ........................ 16
最后,TIMER1具有匹配寄存器TMR1H
和TMR1L
。这使我们可以设置一个低于最大计数的值,这将产生相同的溢出时间效果。同样,您只需将计数数除以频率即可。例如,假设我们选择了Prescale 1:
TMR1H
.... TMR1L .... 时间0x80 .......... 0x00 ......... 10xC0 .......... 0x00 ......... 0.50xE0 .......... 0x00 ......... 0.250xF0 .......... 0x00 ......... 0.125以下代码段摘自Microchip的应用笔记AN580,并给出了在TIMER1上设置1秒中断的示例。我建议您完整阅读本应用笔记,并意识到这是使用外部振荡器的一个示例。您还可以选择使用内部时钟频率-可能会给您更精细的计时。
START CLRF STATUS ;Do initialization (Bank0) BCF T1CON, TMR1ON ;Timer1 is NOT incrementing : : ;Do initialization stuff here : MOVLW 0x80 ;TIM1H:TMR1L = 0x8000 gives 1 second MOVWF TMR1H ; overflow, at 32kHz. CLRF TMR1L ; CLRF INTCON CLRF PIR1 BSF STATUS, RP0 ;Bank1 CLRF PIE1 ;Disable all peripheral interrupts ; BSF PIE1, TMR1IE ;Enable TMR1 Interrups ; ; Initialize the Special Function Registers (SFR) interrupts ; BCF STATUS, RP0 ;Bank0 CLRF PIR1 BSF INTCON, PEIE ;Enable Peripheral Interrupts BSF INTCON, GIE ;Enable all Interrupts ; MOVLW 0x0E MOVWF T1CON ;Enable T1 Oscillator, Ext Clock, Async, prescaler = 1 BSF T1CON, TRM1ON ;Turn Timer1 ON ; zzz SLEEP GOTO zzz ;Sleep, wait for TMR1 interrupt
我不明白我应该如何配置预分频器,以便定时器以我选择的时间间隔(例如1s)发送中断。
您可以使用此公式来确定您的时间:时间=计数/(频率/预分频)
您必须设置timer0的预分频值,例如T0PS <2:0> = 001,您也可以使用TOCON的后3位进行分配,例如TOCON = 00000111如果您的计时器在10毫秒内产生中断,并且如果您将预分频器分配给2,则您的中断在20毫秒内发生,则预分频器负责增加周期数。但是,您必须考虑TOPS <2:0> = 0意味着您的预分频器为2。必须将PSA = 0才能使用Timer0的预分频器。