Re: Генератор работы форсунок инжекторного двигателя
	
	
		SBorovkov, спасибо. Реально подумал про avr studio, может тогда меньше будет тупых вопросов, но я тогда точно уйду от ардуины и процесинга :).
Сегодня наткнулся на пример с таймерами и там, прикольнула меня работа с avr studio. Сегодня - перезагрузка, avr studio начну пробовать. :)
	 
	
	
	
		Re: Генератор работы форсунок инжекторного двигателя
	
	
		ардуину (саму плату) можно с удобством использовать как отладочную плату, особенно в сочетании с макетной платой с пружинными контактами.
Как запустить проект arduino среды в avr studio, я писал тут:
http://www.compcar.ru/forum/showthread.php?t=5910
Как зашить полученную прогу в arduino:
У меня среда arduino шьет следующей строкой:
E:\arduino-0021\hardware\tools\avr\bin\avrdude -CE:\arduino-0021\hardware/tools/avr/etc/avrdude.conf -q -q -patmega168 -cstk500v1 -P\\.\COM8 -b19200 -D -Uflash:w:c:\Temp\build4629811770678680876.tmp\sket  ch_dec17a.cpp.hex:i
Поменяться в этой строке кроме путей могут:
-patmega168  это тип контроллера. В моем случае atmega168
-P\\.\COM8 - номер ком порта
Сам проверить не могу, поскольку сразу по получении заменил родной бутлоадер на другой, а перешивать туда-сюда его лень.
В avr studio тебе ничто не мешает по началу писать используя библиотеки arduino. Потом, я бы порекомендовал обратить внимание на библиотеку доступа к ногам контроллера. Супер библиотека. И ею можно пользоваться даже не понимая как она устроена.
тут описание http://easyelectronics.ru/rabota-s-p....html#more-339 . Можешь особо не разбираясь и не читая (если сложно) сразу в конце статьи скачать библиотеку. Там есть пара примеров к ней, сразу поймешь как пользоваться.
Единственное, в этой библиотеке оперируют не номерами контактов arduino платы, а стандартными портами avr контроллеров. 
Соответствие можно посмотреть в файле 
E:\arduino-0017\hardware\cores\arduino\pins_arduino.c
Если у тебя 1280 или 2560
// 0-7 PE0-PE7   works
// 8-13 PB0-PB5  works
// 14-21 PA0-PA7 works 
// 22-29 PH0-PH7 works
// 30-35 PG5-PG0 works
// 36-43 PC7-PC0 works
// 44-51 PJ7-PJ0 works
// 52-59 PL7-PL0 works
// 60-67 PD7-PD0 works
// A0-A7 PF0-PF7
// A8-A15 PK0-PK7
	 
	
	
	
		Re: Генератор работы форсунок инжекторного двигателя
	
	
		Вот код, который я тестировал в avr studio на предмет работы таймера
	Код:
	
#include <avr/version.h>
#include <avr/io.h>
#include <avr/interrupt.h>
uint8_t tcnt2;
int main(void)
{
    TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2  
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика 
    TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика 
    ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 
    TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2. 
        TCCR2B &= ~(1<<CS22); // эта и  следующая строка задает таймер увеличение TCNT2 каждые 32 такта.
        TCCR2B |= (1<<CS21) | (1<<CS20);
    tcnt2 = 251; //  32 такта* (256-251)=160 тактов. То есть каждые 10 мкс.
    TCNT2 = tcnt2;
        sei();
        for (;;);
}
ISR(TIMER2_OVF_vect)  
{ 
    TCNT2 = tcnt2;
}
 
	 
	
	
	
		Re: Генератор работы форсунок инжекторного двигателя
	
	
		Спасибо за советы.
В понедельник утром остановился на варианте ниже
	PHP код:
	
#define D22_High PORTA |=B00000001 
#define D22_Low PORTA &= B11111110
volatile byte set[7] ; 
volatile unsigned int tcnt2 = 206; //32 такта делителя * (256-206)=1600 тактов. То есть каждые 0,1 мс.
volatile unsigned int var = 1 ;
volatile byte pwm_time = 0 ;
void setup()   
{ 
  pinMode(22, OUTPUT); 
  pinMode(2, OUTPUT); // Давление топлива
  pinMode(3, OUTPUT); // Давление в коллекторе
  pinMode(4, OUTPUT); // Температура топлива
  pinMode(5, OUTPUT); // Температура двигателя
  
    TIMSK2 &= ~(1<<TOIE2); 
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
    TCCR2B &= ~((1<<WGM22) | (1<<CS22));
    TCCR2B |= ((1<<CS21) | (1<<CS20));  
      ASSR &= ~(1<<AS2);
    TIMSK2 |= (1<<TOIE2);
    
    Serial.begin(9600); 
} 
void loop() 
{
if(Serial.available() > 7)   
   {   
    if(Serial.read() == 255)
      {  
        for(int i = 0; i < 7; i++)   
         {                  
           set[i] = Serial.read(); // set[0] - Длительность импульса впрыска, Длительность паузы = set[1] + set[2] * 250
         }
      }
   }
  analogWrite(2, set[3]); // Давление топлива
  analogWrite(3, set[4]);
  analogWrite(4, set[5]); // Температура топлива
  analogWrite(5, set[6]); // Температура двигателя
}
//************* прерывание *************
ISR(TIMER2_OVF_vect)   
{  
  TCNT2 = tcnt2;   
    switch (var) 
    {
      case 1:
         pwm_time++;
         if(pwm_time < set[0]) D22_High;
         else 
         {
           pwm_time=0;
           var = 2 ;
         }
      break;
      case 2:
         pwm_time++;
         if(pwm_time < set[1]) D22_Low;
         else 
         {
           if (set[2] > 0) var = 3; else var = 1;
           pwm_time=0;
         }
      break;
      case 3:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 1) var = 4; else var = 1;
           pwm_time=0;
         }
      break;
      case 4:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 2) var = 5; else var = 1;
           pwm_time=0;
         }
      break;
      case 5:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 3) var = 6; else var = 1;
           pwm_time=0;
         }
      break;
      case 6:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 4) var = 7; else var = 1;
           pwm_time=0;
         }
      break;
      case 7:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 5) var = 8; else var = 1;
           pwm_time=0;
         }
      break;
      case 8:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 6) var = 9; else var = 1;
           pwm_time=0;
         }
      break;
      case 9:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 7) var = 10; else var = 1;
           pwm_time=0;
         }
      break;
      case 10:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 8) var = 11; else var = 1;
           pwm_time=0;
         }
      break;
      case 11:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 9) var = 12; else var = 1;
           pwm_time=0;
         }
      break;
      case 12:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           if (set[2] > 10) var = 13; else var = 1;
           pwm_time=0;
         }
      break;
      case 13:                    
           pwm_time++;
         if(pwm_time < 250) D22_Low;
         else 
         {
           pwm_time=0;
           var = 1;
         }
      break;
    }     
} 
 Увеличил делитель и с точностью до 0.1 мс запустил. Провозился с командой For в таймере, но так и не понял где ошибаюсь, сделал тупо на Case  и собрал в корпус.
Подскажите как лучше работать с двух-байтовыми значениями?
p.s. И еще при измерении реального импульса есть ошибка в 10 мкс, т.е. вместо 10,0 мс получается 9,99 мс, при 10,1 получается 10,09 мс и т.д.
Есть ли вариант добавить 0,01 мс ?
	 
	
	
	
		Re: Генератор работы форсунок инжекторного двигателя
	
	
		А почему бы тебе не сократить время обмена с компьютером , всего то изменить скорость обмена на 115200
	 
	
	
	
		Re: Генератор работы форсунок инжекторного двигателя
	
	
		Ставил и так и так Разницы не заметил в работе, но более высокая скорость чревата перебоями от помех, а их у меня на СТО - просто кошмар. :)