• 《LED调光-DMX512灯光协义接收控制》转


    源:http://blog.163.com/zhaojun_xf/blog/static/30050580200951023046891

    来自:

    作者:龙图开发网  

    文章来源:龙图开发网  

    时间:2009-5-18 10:15:01 

    //LED调光-DMX512灯光协义接收控制   
    //龙图开发网 http://www.longtoo.com   原创,转载请注明出处
    //ICC-AVR application builder : 2007/12/14 
    // Target : M8
    // Crystal: 8.000Mhz
    
    #include <iom8v.h>
    #include <macros.h>
    
    #define uint unsigned int               //16 bit
    #define uchar unsigned char             //8 bit
    #define bit char                        // 1     bit
    #define ulong unsigned long             //32     bit
    
    #define     FLASH_LED_PORTC          PORTC
    #define     FLASH_LED_PORTD          PORTD
    #define     FLASH_LED_R_ON          (1<<PC1) 
    #define     FLASH_LED_R_OFF         (0<<PC1)
    #define     FLASH_LED_G_ON          (1<<PC2) 
    #define     FLASH_LED_G_OFF         (0<<PC2)
    #define     FLASH_LED_B_ON          (1<<PC0) 
    #define     FLASH_LED_B_OFF         (0<<PC0)
    #define     DMX_control_receive     (0<<PD2)
    #define     DMX_control_send        (1<<PD2)
    
    int JS_01;  
    int JS_001=0,JS_002=0,JS_003=0;
    int CUR_BYTE_A=0,IADDRESS_A=1;
    char JS_1=0,JS_2=0,JS_3=0,JS_4=0,JS_5=0,JS_6=0;
    //              RED          GREEN           BLUE           RGB
    char DMX_DATA_1=0,DMX_DATA_2=0,DMX_DATA_3=0,DMX_DATA_4=0;
    
    char LED_TRANSFER_DATA[256]=
    {
      50,50,50,50,50,50,
      49,49,49,49,49,48,48,48,48,48,
      47,47,47,47,47,46,46,46,46,46,
      45,45,45,45,45,44,44,44,44,44,
      43,43,43,43,43,42,42,42,42,42,
      41,41,41,41,41,40,40,40,40,40,
      39,39,39,39,39,38,38,38,38,38,
      37,37,37,37,37,36,36,36,36,36,
      35,35,35,35,35,34,34,34,34,34,
      33,33,33,33,33,32,32,32,32,32,
      31,31,31,31,31,30,30,30,30,30,
      29,29,29,29,29,28,28,28,28,28,
      27,27,27,27,27,26,26,26,26,26,
      25,25,25,25,25,24,24,24,24,24,
      23,23,23,23,23,22,22,22,22,22,
      21,21,21,21,21,20,20,20,20,20,
      19,19,19,19,19,18,18,18,18,18,
      17,17,17,17,17,16,16,16,16,16,
      15,15,15,15,15,14,14,14,14,14,
      13,13,13,13,13,12,12,12,12,12,
      11,11,11,11,11,10,10,10,10,10,
      9,9,9,9,9,8,8,8,8,8,
      7,7,7,7,7,6,6,6,6,6,
      5,5,5,5,5,4,4,4,4,4,
      3,3,3,3,3,2,2,2,2,2,
      1,1,1,1,1,0,0,0,0,0
    };
    
    //------------------------------------------------
    void port_init(void)
    {
      PORTB = 0xFF;
      DDRB     = 0x00;
      PORTC = 0xFF; //m103 output only
      DDRC     = 0xFF;
      PORTD = 0xFF;
      DDRD     = 0xFF;
    }
    
    //TIMER0 initialisation - prescale:64
    // WGM: Normal
    // desired value: 1mSec
    // actual value:     1.000mSec (0.0%)
    void timer0_init(void)
    {
      TCCR0 = 0x00; //stop
      TCNT0 = 0x83; //set count
      TCCR0 = 0x03; //start timer
    }
    
    #pragma interrupt_handler timer0_ovf_isr:10
    void timer0_ovf_isr(void)
    {
      TCNT0 = 0x83; //reload counter value
    }
    
    //TIMER1 initialisation - prescale:8
    // WGM: 0) Normal, TOP=0xFFFF
    // desired value: 100uSec
    // actual value: 100.000uSec (0.0%)
    void timer1_init(void)
    {
    TCCR1B = 0x00; //stop
    TCNT1H = 0xFF; //setup
    TCNT1L = 0x9C;
    OCR1AH = 0x00;
    OCR1AL = 0x64;
    OCR1BH = 0x00;
    OCR1BL = 0x64;
    ICR1H     = 0x00;
    ICR1L     = 0x64;
    TCCR1A = 0x00;
    TCCR1B = 0x02; //start Timer
    }
    
    #pragma interrupt_handler timer1_ovf_isr:9
    void timer1_ovf_isr(void)
    {
      //TIMER1 has overflowed
      TCNT1H = 0xFF; //reload counter high value
      TCNT1L = 0x9C; //reload counter low value
      LED_RGB();
    }
    
    //UART0 initialisation
    // desired baud rate: 250000
    // actual: baud rate:250000 (0.0%)
    // char size: 8 bit
    // parity: Disabled
    void uart0_init(void)
    {
      UCSRB = 0x00; // RXEN //disable while setting baud rate
      UCSRA = 0x02; // RXC=0--     RXC      TXC      UDRE     FE      DOR     PE       U2X      MPCM
      UCSRB = 0xFC; // 0XDF --     RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8     TXB8
      UCSRC = 0x06; // 9 bit--     URSEL UMSEL UPM1 UPM0     USBS UCSZ1 UCSZ0 UCPOL 
      UBRRH = 0x00; // set baud rate hi
      UCSRC = 0x8E; // 9 bit     86 
      UBRRL = 0x03; //set baud rate lo       ( 0x01 u2x=0)
    }
    
    #pragma interrupt_handler uart0_rx_isr:12
    void uart0_rx_isr(void)
    {    
      DMX_RECEIVE();     //uart has received a character in UDR
    }
    
    #pragma interrupt_handler uart0_udre_isr:13
    void uart0_udre_isr(void)
    {
      //character transferred to shift register so UDR is now empty
      //FLASH_LED_PORTD=DMX_control_receive;         //DMX_control_receive; //pd2=0     PD2 
    }
    
    #pragma interrupt_handler uart0_tx_isr:14
    void uart0_tx_isr(void)
    {
      //character has been transmitted
    }
    
    //call this routine to initialise all peripherals
    void init_devices(void)
    {
      //stop errant interrupts until set up
      CLI(); //disable all interrupts
      port_init();
      timer0_init();
      timer1_init();
      uart0_init();
      MCUCR = 0x00;
      GICR     = 0x00;
      TIMSK = 0x05; //timer interrupt sources
      SEI(); //re-enable interrupts
      //all peripherals are now initialised
    }
    
    void LED_FLASH()
    {
      ++JS_01;
      if (JS_01==500)
      {
          //FLASH_LED_PORTC^=FLASH_LED_R_OFF;
          //FLASH_LED_PORTC^=FLASH_LED_G_OFF;
          //FLASH_LED_PORTC^=FLASH_LED_B_OFF;
      }
      if (JS_01==1000)
      {
          JS_01&=0;
      }
    }
    
    void LED_RGB()     //100us
    {
      //FLASH_LED_PORTC=FLASH_LED_R_ON|FLASH_LED_R_ON|FLASH_LED_R_ON;
      ++JS_1;++JS_2;++JS_3;
      if (JS_1==50) 
      {JS_1=0;FLASH_LED_PORTC=FLASH_LED_R_OFF|FLASH_LED_G_OFF|FLASH_LED_B_OFF;}  //ALL==0
      if (JS_1==LED_TRANSFER_DATA[DMX_DATA_1]) {FLASH_LED_PORTC|=0x02;}//FLASH_LED_R_ON;} // on==1
      if (JS_1==LED_TRANSFER_DATA[DMX_DATA_2]) {FLASH_LED_PORTC|=0x04;}//FLASH_LED_G_ON;}
      if (JS_1==LED_TRANSFER_DATA[DMX_DATA_3]) {FLASH_LED_PORTC|=0x01;}//FLASH_LED_B_ON;}
      if (JS_1==LED_TRANSFER_DATA[DMX_DATA_4]) 
      {FLASH_LED_PORTC|=0x02;FLASH_LED_PORTC|=0x04;FLASH_LED_PORTC|=0x01; }//RGB
    }
    
    //*****************************************
    void DMX_RECEIVE()
    {        
      unsigned char status, resh, resl;
      char DMX_ADDRESS_PAN,CODE_Data,DMX_DATA_PAN;
      
      while ( !(UCSRA & (1<<RXC)) );      // NO USE 
      // from buffer  
      status = UCSRA;  
      resh      = UCSRB;                                          
      resl      = UDR;
      resh = (resh >> 1) & 0x01;     // TAKE RXB8                               
      if (resh==1)           //(1<<RXB8))
      {                     //LED_DISPLAY_V4=15;         //test ok  
        DMX_DATA_PAN=1;                                             
        if     (CUR_BYTE_A==IADDRESS_A+0)     DMX_DATA_1=resl; 
        if     (CUR_BYTE_A==IADDRESS_A+1)     DMX_DATA_2=resl;  
        if     (CUR_BYTE_A==IADDRESS_A+2)     DMX_DATA_3=resl;
        if     (CUR_BYTE_A==IADDRESS_A+3)     DMX_DATA_4=resl;
        if     (DMX_ADDRESS_PAN==1)      
        ++CUR_BYTE_A;     //DMX address count register
        if (CUR_BYTE_A==513)           CUR_BYTE_A&=0;        
      }   
      else                     //(0<<RXB8)
      {                
        CODE_Data=resl; 
        if (CODE_Data==0) 
        {        //test ok  
          CUR_BYTE_A = 0; 
          CODE_Data     = 0xff;
          DMX_ADDRESS_PAN=1;
        }
        else
          DMX_ADDRESS_PAN=0;
        }   
        // DMX_PORTD|=DMX_control_send;     //pd6=1             
    }
    
    void main(void)
    {
      init_devices();
      FLASH_LED_PORTD=DMX_control_receive; //DMX_control_receive; //pd2=0     PD2
      //insert your functional code here...
    }
  • 相关阅读:
    【应用】Linux内存调试工具:valgrind
    Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法
    MYSQL连接时错误码2059解决办法
    Python encode()、decode()方法详解
    genymotion自动化使用
    论文数据集
    Native Apps、Web Apps和Hybrid Apps
    C# 中如何进行私有(private)函数测试
    Windows10 计划任务开始失败
    如果系统盘后面是恢复盘,如何扩充系统盘
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/3941177.html
Copyright © 2020-2023  润新知