Четверг, 25.04.2024, 15:49
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по МК » Почему в протеусе работает а в реальности на половину
Почему в протеусе работает а в реальности на половину
rrjcnzДата: Суббота, 31.03.2012, 21:10 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Здравствуйте. подскажите в чём причина.

Вот программа.
Code


#include <mega128.h>
#include <delay.h>   
#include "3310lcd.C"
#include <stdio.h>   

int CH[9];
int CH_t[9];
int CH_tn[9];

int SD[25];
int s,i;

#define S1 PORTA.0
#define S2 PORTA.1
#define S3 PORTA.2
#define S4 PORTA.3
#define S5 PORTA.4
#define S6 PORTA.5
#define S7 PORTA.6
#define S8 PORTA.7

#define S9  PORTC.0
#define S10 PORTC.1
#define S11 PORTC.2
#define S12 PORTC.3
#define S13 PORTC.4
#define S14 PORTC.5
#define S15 PORTC.6
#define S16 PORTC.7

#define S17 PORTD.0
#define S18 PORTD.1
#define S19 PORTD.2
#define S20 PORTD.3
#define S21 PORTD.4
#define S22 PORTD.5
#define S23 PORTD.6
#define S24 PORTD.7

#define CH_in1 PINE.0
#define CH_in2 PINE.1
#define CH_in3 PINE.2
#define CH_in4 PINE.3
#define CH_in5 PINE.4
#define CH_in6 PINE.5
#define CH_in7 PINE.6
#define CH_in8 PINE.7

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0;
TCNT1L=0;

s++;

      if (s==1540)      
      {
      s=0;     
      };   
        
if (s>SD[1]) {S1=0;}else{S1=1;};
if (s>SD[2]) {S2=0;}else{S2=1;};
if (s>SD[3]) {S3=0;}else{S3=1;};
if (s>SD[4]) {S4=0;}else{S4=1;};
if (s>SD[5]) {S5=0;}else{S5=1;};
if (s>SD[6]) {S6=0;}else{S6=1;};
if (s>SD[7]) {S7=0;}else{S7=1;};
if (s>SD[8]) {S8=0;}else{S8=1;};   

if (s>SD[9])  {S9=0; }else{S9=1; };
if (s>SD[10]) {S10=0;}else{S10=1;};
if (s>SD[11]) {S11=0;}else{S11=1;};
if (s>SD[12]) {S12=0;}else{S12=1;};
if (s>SD[13]) {S13=0;}else{S13=1;};
if (s>SD[14]) {S14=0;}else{S14=1;};
if (s>SD[15]) {S15=0;}else{S15=1;};
if (s>SD[16]) {S16=0;}else{S16=1;};   

if (s>SD[17]) {S17=0;}else{S17=1;};
if (s>SD[18]) {S18=0;}else{S18=1;};
if (s>SD[19]) {S19=0;}else{S19=1;};
if (s>SD[20]) {S20=0;}else{S20=1;};
if (s>SD[21]) {S21=0;}else{S21=1;};
if (s>SD[22]) {S22=0;}else{S22=1;};
if (s>SD[23]) {S23=0;}else{S23=1;};
if (s>SD[24]) {S24=0;}else{S24=1;};      
}

// Timer3 output compare A interrupt service routine
interrupt [TIM3_COMPA] void timer3_compa_isr(void)
{
TCNT3H=0;
TCNT3L=0;
      if (CH_in1==1)//***********************************************************    
      {
      CH_t[1]++;
      CH_tn[1]=1;
      }
      else    
      {     
          if (CH_tn[1]==1)   
          {
          CH[1]=CH_t[1]*4;
          CH_t[1]=0;
          CH_tn[1]=0;
          };      
      };
        
      if (CH_in2==1)//***********************************************************    
      {
      CH_t[2]++;
      CH_tn[2]=1;
      }
      else    
      {     
          if (CH_tn[2]==1)   
          {
          CH[2]=CH_t[2]*4;
          CH_t[2]=0;
          CH_tn[2]=0;
          };      
      };    
        
      if (CH_in3==1)//***********************************************************    
      {
      CH_t[3]++;
      CH_tn[3]=1;
      }
      else    
      {     
          if (CH_tn[3]==1)   
          {
          CH[3]=CH_t[3]*4;
          CH_t[3]=0;
          CH_tn[3]=0;
          };      
      };    
        
      if (CH_in4==1)//***********************************************************    
      {
      CH_t[4]++;
      CH_tn[4]=1;
      }
      else    
      {     
          if (CH_tn[4]==1)   
          {
          CH[4]=CH_t[4]*4;
          CH_t[4]=0;
          CH_tn[4]=0;
          };      
      };
        
      if (CH_in5==1)//***********************************************************    
      {
      CH_t[5]++;
      CH_tn[5]=1;
      }
      else    
      {     
          if (CH_tn[5]==1)   
          {
          CH[5]=CH_t[5]*4;
          CH_t[5]=0;
          CH_tn[5]=0;
          };      
      };
        
      if (CH_in6==1)//***********************************************************    
      {
      CH_t[6]++;
      CH_tn[6]=1;
      }
      else    
      {     
          if (CH_tn[6]==1)   
          {
          CH[6]=CH_t[6]*4;
          CH_t[6]=0;
          CH_tn[6]=0;
          };      
      };
        
      if (CH_in7==1)//***********************************************************    
      {
      CH_t[7]++;
      CH_tn[7]=1;
      }
      else    
      {     
          if (CH_tn[7]==1)   
          {
          CH[7]=CH_t[7]*4;
          CH_t[7]=0;
          CH_tn[7]=0;
          };      
      };
        
      if (CH_in8==1)//***********************************************************   
      {
      CH_t[8]++;
      CH_tn[8]=1;
      }
      else    
      {     
          if (CH_tn[8]==1)   
          {
          CH[8]=CH_t[8]*4;
          CH_t[8]=0;
          CH_tn[8]=0;
          };      
      };

}

void main(void)
{

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out   
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0   
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out   
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0   
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out   
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0   
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out   
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0   
PORTD=0x00;
DDRD=0xFF;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In   
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T   
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In   
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T   
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In   
// State4=T State3=T State2=T State1=T State0=T   
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x02;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x13;
OCR1AH=0x00;
OCR1AL=0x02;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Fast PWM top=ICR3
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x02;
TCCR3B=0x1A;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x13;
OCR3AH=0x00;
OCR3AL=0x02;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

ETIMSK=0x10;

// USART0 initialization
// USART0 disabled
UCSR0B=0x00;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

for (i=0;i<25;i++) {SD[i]=50;};

    LcdInit();
    LcdContrast (60);
      
      
while (1)
        {
          sprintf(lcd_buf,"%i",CH[1]);   
          LcdString(1,1);
            
          sprintf(lcd_buf,"%i",CH[2]);   
          LcdString(1,2);
            
          sprintf(lcd_buf,"%i",CH[3]);   
          LcdString(1,3);
            
          sprintf(lcd_buf,"%i",CH[4]);   
          LcdString(1,4);
                         
            
          sprintf(lcd_buf,"%i",CH[5]);   
          LcdString(6,1);
            
          sprintf(lcd_buf,"%i",CH[6]);   
          LcdString(6,2);
            
          sprintf(lcd_buf,"%i",CH[7]);   
          LcdString(6,3);
            
          sprintf(lcd_buf,"%i",CH[8]);   
          LcdString(6,4);
            
          LcdUpdate ();
        }
}



проблема в следующем:
прерывания TIM1_COMPA работает, а вот TIM3_COMPA работает только в протеусе. в чём проблема?

сначала я хотел вставить всё что есть в TIM3_COMPA в TIM1_COMPB, но работало только прерывание по TIM1_COMPA (если в TIM1_COMPA убрать TCNT1H=0;TCNT1L=0; то прерывание TIM1_COMPB работает, но всё тогда немножко работает с помехами).


Сообщение отредактировал rrjcnz - Суббота, 31.03.2012, 21:22
 
HiSERДата: Воскресенье, 01.04.2012, 09:14 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
прерывание чаще срабатывает чем оно успевает обработаться.
 
rrjcnzДата: Воскресенье, 01.04.2012, 11:45 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
то-есть что б работали прерывания TIM3_COMPA или TIM1_COMPB нужно только понижать частоту таймера? по другому ни как? sad

и почему в протеусе всё работает?


Сообщение отредактировал rrjcnz - Воскресенье, 01.04.2012, 11:48
 
HiSERДата: Понедельник, 02.04.2012, 23:17 | Сообщение # 4
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Протеус это не железяка.
Найти другое решение задачи.
 
rrjcnzДата: Вторник, 03.04.2012, 00:44 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Offline
Спасибо. Буду думать smile
 
Форум » Микроконтроллеры » Вопросы по МК » Почему в протеусе работает а в реальности на половину
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz