Показано с 1 по 2 из 2
  1. #1
    Пользователь
    Регистрация
    21.03.2010
    Сообщений
    64
    Вес репутации
    186

    По умолчанию Перевод прошивки

    Люди выручайте, вопрос жизни и смерти, нужно перевести прошивку из ATMEGA8 для pic16f76
    вот код:
    Код:
    /*****************************************************
    Chip type           : ATmega8
    Program type        : Application
    Clock frequency     : 1,000000 MHz
    Memory model        : Small
    External SRAM size  : 0
    Data Stack size     : 256
    
    *****************************************************/
    #include <mega8.h>
    
    unsigned char nom_temp;
    unsigned int imp,kmh;
    
    void init(void);
    void display(unsigned char ch,unsigned char nom);
    
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    }
    
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    imp++;
    }
    
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
     if (nom_temp<3) nom_temp++; else nom_temp=1;
     switch (nom_temp)
     {
      case 1: {if (kmh>99) display((kmh/100)%10,3); break;}
      case 2: {if (kmh>9)  display((kmh/10)%10,2);break;}
      case 3: {display(kmh%10,1);break;}
     }
    }
    
    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    //kmh=imp*9/5;
    kmh=imp*79/100;
    //imp_s=imp;
    imp=0;
    TCNT1H=0x00;
    TCNT1L=0x00;
    }
    
    
    void init(void)
    {
    PORTB=0x00;
    DDRB=0xff;
    
    PORTC=0x00;
    DDRC=0xff;
    
    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=P State2=0 State1=0 State0=0 
    PORTD=0x08;
    DDRD=0xF7;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 15,625 kHz
    //TCCR0=0x03;
    
    // Clock value: 125,000 kHz
    TCCR0=0x02;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 3,906 kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x04;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x07;
    OCR1AL=0xA1;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: On
    // INT1 Mode: Falling Edge
    GIFR=0x00;
    MCUCR=0x0A;
    GICR|=0xC0;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x51;
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    }
    
    void display(unsigned char ch,unsigned char nom)
    {
    PORTD.0=0;PORTD.1=0;PORTD.2=0;
    PORTB.0=1;PORTB.1=1;PORTB.2=1;PORTB.3=1;PORTB.4=1;PORTB.5=1;PORTB.6=1;
    
    switch (ch)
    {case 0: {PORTB.1=0;PORTB.2=0;PORTD.7=0;PORTD.6=0;PORTD.5=0;PORTB.0=0;PORTD.4=1;break;}
     case 1: {PORTB.1=1;PORTB.2=0;PORTD.7=0;PORTD.6=1;PORTD.5=1;PORTB.0=1;PORTD.4=1;break;}
     case 2: {PORTB.1=0;PORTB.2=0;PORTD.7=1;PORTD.6=0;PORTD.5=0;PORTB.0=1;PORTD.4=0;break;}
     case 3: {PORTB.1=0;PORTB.2=0;PORTD.7=0;PORTD.6=0;PORTD.5=1;PORTB.0=1;PORTD.4=0;break;}
     case 4: {PORTB.1=1;PORTB.2=0;PORTD.7=0;PORTD.6=1;PORTD.5=1;PORTB.0=0;PORTD.4=0;break;}
     case 5: {PORTB.1=0;PORTB.2=1;PORTD.7=0;PORTD.6=0;PORTD.5=1;PORTB.0=0;PORTD.4=0;break;}
     case 6: {PORTB.1=0;PORTB.2=1;PORTD.7=0;PORTD.6=0;PORTD.5=0;PORTB.0=0;PORTD.4=0;break;}
     case 7: {PORTB.1=0;PORTB.2=0;PORTD.7=0;PORTD.6=1;PORTD.5=1;PORTB.0=1;PORTD.4=1;break;}
     case 8: {PORTB.1=0;PORTB.2=0;PORTD.7=0;PORTD.6=0;PORTD.5=0;PORTB.0=0;PORTD.4=0;break;}
     case 9: {PORTB.1=0;PORTB.2=0;PORTD.7=0;PORTD.6=0;PORTD.5=1;PORTB.0=0;PORTD.4=0;break;}
     case 10: {PORTB.1=0;PORTB.2=1;PORTD.7=1;PORTD.6=1;PORTD.5=1;PORTB.0=1;PORTD.4=1;break;}
     }
    switch (nom) 
    {
     case 1: {PORTD.0=1;PORTD.1=0;PORTD.2=0;break;}
     case 2: {PORTD.0=0;PORTD.1=1;PORTD.2=0;break;}
     case 3: {PORTD.0=0;PORTD.1=0;PORTD.2=1;break;}
    }
    
    }
    void main(void)
    {init();
    
    
    while (1)
    {  
    };
    
    }

  2. #2
    Пользователь
    Регистрация
    21.03.2010
    Сообщений
    64
    Вес репутации
    186

    По умолчанию Re: Перевод прошивки

    решил попробовать переписать, не могу разобраться с динамической индикацией , может подскажет кто,тест делаю в протеусе, символы как то смешивает непонятно и выводит черти что....
    Код:
    #define _pic16f877      // зададим тип процессора
    #include <pic.h>   
    
    
    __CONFIG(LVPDIS & UNPROTECT & PWRTDIS & WDTDIS & XT);
    
    // таблица знакогенератора
    const unsigned char CODE_TABLE[10] = {0b1000000,0b1111001,0b0100100,0b0110000,0b0011001,0b0010010,0b0000010,0b1111000,0b0000000,0b0010000};   
    const unsigned char a[3] = {0b00000001,0b00000010,0b00000100};    
    unsigned char in1;  //индикатор 1
    unsigned char in2;	//индикатор 2
    unsigned char in3;  //индикатор 3
    
    void    main(void)
    {
    
            // настроим порты на выход
            TRISB = 0b11111000;    // 1.2.3 на выход, общий анод
            TRISD = 0b00000000;     // abcdefg..
    
            PORTD = 1;              // очистим индикатор
            PORTB = 0b00000000;    
    
            OPTION = 0b10000010;    // запишем байт настройки в регистр OPTION
            INTCON = 0;             // Выключить все прерывания и сбросить T0IF
            TMR0 = 0;               // Сброс TMR0
    
            T0IE =1;               // Разрешить прерывания от TMR0
            GIE = 1;                // Разрешить все прерывания
    	in1 = 1;
    	in2 =2;
    	in3 =3;
    
           
            // зациклим программу
    while(1)
      {
         }
    
    }
    
    // обработка прерываний
    void interrupt all(void)
    {
    
                    // установим следующее знакоместо для отображения
            PORTD = CODE_TABLE[in1];
    		PORTB = a[0];        // выведем на индикатор
    
    		PORTD = CODE_TABLE[in2];   
    		PORTB = a[1];        // выведем на индикатор
    		
    	       
            PORTD = CODE_TABLE[in3];  
    		PORTB = a[2];       // выведем на индикатор
           
    
                     
       
    }

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •