谢谢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; } } }
|