打印
[AVR单片机]

请教高手如何使用attiny2313的T1比较匹配功能

[复制链接]
2447|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guxiang|  楼主 | 2007-5-6 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器T1使用了捕获功能,同时还要使用T1A比较匹配功能,在PB3输出波形.捕获发生时清TICOUNT计数器,同时希望PB3输出低电平,当T1COUNT与OCR1A相等时比较匹配,PB3输出高电平.请问该如何操作比较匹配输出单元? 

相关帖子

沙发
avrvi| | 2007-5-6 20:23 | 只看该作者

我写的PWM教程,希望对你有点帮助

教程是基于ICC的,mega16的程序。

http://www.avrvi.com/avr_examples/pwm.html
相关链接:http://www.avrvi.com

使用特权

评论回复
板凳
guxiang|  楼主 | 2007-5-6 22:10 | 只看该作者

回复avrvi

谢谢AVRVI先生的回帖.我的意图不是做PWM输出,而是而是对一个信号捕捉,然后再准确的延时一个固定时间.原程序如下,错在哪里?
//ICC-AVR application builder : 2007-5-2 12:56:18
// Target : T2313
// Crystal: 3.93216Mhz

#include <iot2313v.h>
#include <macros.h>

unsigned char flag=1,il,ih;

#pragma interrupt_handler timer1_capt_isr:4
void timer1_capt_isr(void)
{
  //TCCR1B = 0x00; //stop timer
 TCNT1H = 0x00; //set count value
 TCNT1L = 0x00;//analog comparator compare event
  TCCR1C=0X80;
  NOP();
  TCCR1C=0X00;
  TCCR1A=0xc0;
 if(flag)
   {
   il=ICR1L;
   ih=ICR1H;
   flag=0;
   }
 }

#pragma interrupt_handler timer1_compa_isr:5
void timer1_compa_isr(void)
{
 TCCR1A = 0x80;  
}

#pragma interrupt_handler timer1_ovf_isr:6
void timer1_ovf_isr(void)
{
 ; 
}

void main(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 
 PORTA = 0x00;
 DDRA  = 0x00; 
 PORTD = 0x00;
 DDRD  = 0x00; 
 PORTB = 0x00;
 DDRB  = 0x1c;  
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)

 UCSRB = 0x00; //disable while setting baud rate
 UCSRC = 0x06;
 UBRRH = 0x00; //set baud rate upper
 UBRRL = 0x19; //set baud rate lower
 UCSRA = 0x00;
 UCSRB = 0x18; //enable
//Comparator initialize
// trigger on: Rising output edge

 ACSR = 0x06; //下降沿触发、捕获

//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 550uSec
// actual value: 549.825uSec (0.0%)
 TCCR1B = 0x00; //stop timer
 TCNT1H = 0x00; //set count value
 TCNT1L = 0x00; //set count value
 OCR1AH  = 0x08; //set compare value
 OCR1AL  = 0x72;
 TCCR1A = 0xc0;
 TCCR1B = 0x01; //start Timer
 
 MCUCR = 0x00;
 GIMSK = 0x00;
 TIMSK = 0xC8;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized

 while(1)
 {
while(!flag)
 {
 UDR = ih;
 while(!(UCSRA&0x20));
  UCSRA |= 0x20;
  UDR = il;
  while(!(UCSRA&0x20));
  UCSRA |= 0x20; 
  UDR = 0x0d ;
   while(!(UCSRA&0x20));
  UCSRA |= 0x20; 
  UDR = 0x0a ;
   while(!(UCSRA&0x20));
  UCSRA |= 0x20; 
  //UCSRB = 0x0C; //enable
  flag=1;
  }
}
}

使用特权

评论回复
地板
ayb_ice| | 2007-5-7 11:25 | 只看该作者

datasheet...

使用特权

评论回复
5
guxiang|  楼主 | 2007-5-8 07:54 | 只看该作者

谢谢2楼

不错,为我提供了另一种思路,谢谢2楼的大侠。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

1

粉丝