微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > AVR M16怎么实现用PB3的oc0输出多个相位修正PWM波控制多个I/O

AVR M16怎么实现用PB3的oc0输出多个相位修正PWM波控制多个I/O

时间:10-02 整理:3721RD 点击:

  1. //ICC-AVR application builder : 2013/5/16 23:37:13
  2. // Target : M16
  3. // Crystal: 16.000Mhz

  4. #include <iom16v.h>
  5. #include <macros.h>

  6. void port_init(void)
  7. {
  8. PORTA = 0xFF;
  9. DDRA  = 0xFF;
  10. PORTB = 0xFF;
  11. DDRB  = 0xFF;
  12. PORTC = 0xFF; //m103 output only
  13. DDRC  = 0xFF;
  14. PORTD = 0xFF;
  15. DDRD  = 0xFF;
  16. }

  17. //TIMER0 initialize - prescale:256
  18. // WGM: PWM Phase correct
  19. // desired value: 10mSec
  20. // actual value:  8.160mSec (18.4%)
  21. void timer0_init(void)
  22. {
  23. TCCR0 = 0x00; //stop
  24. TCNT0 = 0x01; //set count
  25. OCR0  = 0xFF;  //set compare
  26. TCCR0 = 0x64; //start timer
  27. }


  28. #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
  29. void timer0_ovf_isr(void)
  30. {

  31. //PORTD = 0x00;//TCNT0 = 0x01; //reload counter value
  32. }

  33. #pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
  34. void timer0_comp_isr(void)
  35. {
  36.         //TCNT0 = 0x01;
  37.         //delay_ms(15);
  38.         if(PORTD == 0xFE)
  39.                 PORTD = 0xFF;
  40.         else
  41.                 PORTD =0xFE;
  42.         //PORTD += 0x02;//compare occured TCNT0=OCR0
  43. }


  44. //call this routine to initialize all peripherals
  45. void init_devices(void)
  46. {
  47. //stop errant interrupts until set up
  48. CLI(); //disable all interrupts
  49. port_init();
  50. timer0_init();

  51. MCUCR = 0x00;
  52. GICR  = 0x00;
  53. TIMSK = 0x02; //timer interrupt sources
  54. SEI(); //re-enable interrupts
  55. //all peripherals are now initialized
  56. }

  57. void delay_ms( unsigned int ms )                                                                                // ms 延时
  58. {
  59.         unsigned int        j;
  60.         for( ; ms >        0; ms--        )
  61.                 {
  62.                 for( j = 1600; j > 0; j-- )
  63.                         {
  64.                         NOP();
  65.                         NOP();
  66.                         }
  67.                 }
  68. }

  69. void main(void)
  70. {
  71. init_devices();
  72. PORTD = 0xFE;
  73. PORTB = 0xE3;
  74. OCR0 = 0xC8;
  75. //insert your functional code here...
  76. }

复制代码

m16的每个I/O口都为LED灯,低电平亮,高电平灭......
主要为了实现各个I/O口的占空比控制......
搞了好久都不行,求大神帮忙了......先说声谢谢了.


已退回1积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top