nickolay_titov
@nickolay_titov

Как залить данный ниже код в контроллер с помощью ардуино?

#include <attiny2313.h>
#include <stdlib.h>
#include <math.h>
#include <delay.h>
float red, green, blue;                     //now colors
unsigned int tred, tgreen, tblue;            //tagert colors
float delta_red, delta_green, delta_blue;       //величина прибавки за шаг
unsigned int time;                          //длительность шага


void generate_tagert_color(void)
{
      tred = rand();
      tgreen = rand();
      tblue = rand();
      tred = tred & 0xFF;          //to max 255
      tgreen = tgreen & 0xFF;
      tblue = tblue & 0xFF;
};

void delay(unsigned int delayt)               //задержка delay_ms() на вход принимает только константу( 
{
  while (delayt != 0)
  {
    delay_ms(1);
    delayt--;
  };
};

void main(void)
{

unsigned int temp1, temp2, temp3, temp4;

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=In 
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=T 
PORTB=0x00;
DDRB=0x0E;

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

// Port D 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 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

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

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

srand(1);             //инициализируем рандомайзер этим значением


while (1)
      {
            
       do 
       {
        generate_tagert_color();
        temp1 = (abs(tred - tgreen));
        temp2 = (abs(tred - tblue));
        temp3 = (abs(tgreen - tblue));
       }
       while (( temp1 < 150 ) && (temp2 < 150) && (temp3 < 150));  //если все цвета будут примерно равные то будет белый что не интересно
      
       if (rand() < 13100)                                         //c вероятностью 0,4 (32767) вышибаем один цвет
       {
         do
         {
            temp4 = rand() & 0x000F ;
         }
        while ((temp4 == 0) || (temp4 > 3));
       
        if (temp4 == 1)                                            //не повезло красному
        {                                                          //гасим до 0 - 20% от исходного
          do
           {
             temp4 = rand() & 0x0FFF;
           }
          while ((temp4 == 0) || (temp4 > 3276));
          
          tred = ceil ((float) (temp4 / 32767) * tred);
        };
        
        if (temp4 == 2)
        {
          do
           {
             temp4 = rand() & 0x0FFF;
           }
          while ((temp4 == 0) || (temp4 > 3276));
          
          tgreen = ceil ((float) (temp4 / 32767) * tgreen);
        };
        
        if (temp4 == 3)
        {
          do
           {
             temp4 = rand() & 0x0FFF;
           }
          while ((temp4 == 0) || (temp4 > 3276));
          
          tblue = ceil ((float) (temp4 / 32767) * tblue);
        };
        
       }
       

                                                   //значение прибавки. доходим до нужного цвета за 255 шагов
       delta_red = (float) (tred - red) / 255;
       delta_green = (float) (tgreen - green) / 255;
       delta_blue = (float) (tblue - blue) / 255; 
      
       
       do
        {
          temp4 = rand() & 0x00FF;
        }
       while ((temp4 < 50) || (temp4 > 100));                       //скокрость перехода случайна от 5 до 10с
      
       time = ceil( ((float) temp4 / 255) * 100);                    //задержка должна быть целой
       
            
       do 
       {
        if (tred != ceil(red))
         red = red + delta_red;
        if (tgreen != ceil(green))
         green = green + delta_green;
        if (tblue != ceil(blue))
         blue = blue + delta_blue;
       
        OCR1A = ceil(blue);
        OCR1B = ceil(green);
        OCR2 = ceil(red);
      
        delay(time);
       }
       while ((tred != ceil(red)) || (tgreen != ceil(green)) || (tblue != ceil(blue))); 
       
       delay(time * 255);                                    //стремились к этому цвету, задержим его
        
      
      };     
}

привел код для изделия.нужно залить его в attiny2313.
как это осуществить с помощью ардуино, то есть используя ардуино в качестве программатора?
1.Я не собираюсь заливать ничего на ардуино.Я хочу использовать его в качестве программатора, чтобы залить код в микроконтроллер для моей схемы.
2.скетч для превращения ардуино в программатор я уже залил.
3.!Мне нужно прошить МК, а не ардуино.
4.мне нужно узнать, как залить данный в микроконтроллер atmel attiny2313, используя ардуино как программатор.
  • Вопрос задан
  • 5786 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Calc
ардуино на 2313?

Программатором через ISP

Вот пару статей про AVR
easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-...
easyelectronics.ru/skorostnoj-avr-usb-programmator...
Ответ написан
svd71
@svd71
1. Указанный вами код совсем не подходит для ардурины: коллега Calc правильно написал - он для низкого класса контроллеров attiny2313.
2. Указанный вами код собирается с помощью avr studio или avr-gcc, winavr. Тогда в ардуину нужно загрузить скетч ДЛЯ СОЗДАНИЯ ИЗ АРДУИНО ПРОГРАММАТОРА. и с помощью его программировать микроконтроллер attiny2313, но не ардуино.
3. Или второй вариант: адоптировать этот код уже под ардуино фреймворк и залить его уже прямо в ардуино. что отначают конструкции типа PORTx, DDRx и пр. можхо узнать из даташитов на attiny2313 с сайта atmel.com.
Ответ написан
назначения пинов при использования скетча Arduino ISP:
Pin connections:
Arduino Pin 13 (or SCK of another programmer)
Arduino Pin 12 (or MISO of another programmer)
Arduino Pin 11 (or MOSI of another programmer)
Arduino Pin 10 (or RESET of another programmer)
назначения пинов attiny2313
attiny2313-pinout.jpg

так что первое - соединяем правильно ардуину и тиньку. (SCK,MISO,MOSI,RESET,GND + питание)
если у вас уже есть файл прошивки - с помощью avrdude выставляете фюзы и шьете тиньку.
если нет - второй вопрос - чем вы скомпилируете вас C код для attiny2313. можно это сделать прямо с помощью Arduino IDE. Ставите в нее коры для поддержки микроконтроллеров Attiny (https://code.google.com/p/arduino-tiny/) открываете вашу программу, выбираете контроллер из списка в Arduino IDE, "прошиваете бутлоадер" (на самом деле просто выставляются фузы) и компилите и шъете вашу программу. Детальнее с картинками тут highlowtech.org/?p=1695
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы