roboforum.ru

Технический форум по робототехнике.


Помогите разобраться с ошибкой

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Помогите разобраться с ошибкой

Сообщение Markys » 19 июл 2016, 15:24

Только начинаю знакомство с ардуиной, и у меня проблема при загрузки скетча. Начну сначала. первый раз подключил ардуину загрузил тестовый скетч (как многие моргалка), по изменял время мерцания светодиода убедился в работоспособности платы. Залил скетч (для схемы в которой будет работать), установил в схему, проверил, работает. Решил кое что изменить в скетче и тат нечего не получилось выдает ошибку(ставлю обратно в схему, плата работает). Думал может программатор сгорел взял новую плату залил прошивку без проблем. Поставил в схему. потом решил перепрошить и ее и опять та жа ошибка. Подскажите Что делать?
Плата 1: Arduino Pro Mini 5v / 16MHz на процессоре ATMEGA328
2: Arduino Pro Mini 5v / 16MHz на процессоре ATMEGA168
вот код
Код: Выделить всёРазвернуть
/*
Arduino IDE 1.5.4
Паяльник на Arduino Pro Mini  v0.4

// Пины еодключения индикаторов
ANODES(CATHODES):
D1 - a
D2 - b
D4 - c
D6 - d
D7 - e
D5 - f
D3 - g
D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))

      a1
   ********
   *      *
f *      * b2
5 *  g3  *
   ********
   *      *
e *      * c4
7 *  d6  *
   ******** # dp0

CATHODES(ANODES):
D16 - cathode 3
D15 - cathode 2
D12 - cathode 1
*/

// ------------------------------------------------------------------------------------------------
int indicator = 0; // 0 = Катод  1 = Анод  Выбрать под Ваш индикатор !!!!

byte  digits[] = {
  B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};

int digit_common_pins[]={16,15,12};  // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)
int refresh_delay = 5;
int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000
long actual_count_delay = 0;
long actual_refresh_delay = 0;
int increment = 0;   //Стартовое значение на сегментах
int max_digits =3;  //  Кол-во знакомест
int current_digit=max_digits-1;
int increment_max = pow(10,max_digits);
// -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------


//--------------------- переменные паяльника -----------------------------
int knopka = 3; //Пин кнопок


int tin = 0; // Пин Датчика температуры IN Analog через LM358N
int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM

int tempust = 230; // установленная температура
int tempmin = 200; // минимальная температура
int tempmax = 480; // максимальная температура
int tempreal = 250; // переменная датчика текущей температуры
int temppwmmin = 40; // минимальное значение PWM нагревателя 
int temppwmmax = 180; // максимальное значение PWM нагревателя
int temppwmreal = 0; // текущее значение PWM нагревателя
int airreal = 100; // стартовое значение PWM вентилятора(если нужно)

int temperror = -50; // разница температур(установленная - реальная)

int temprazn = 0; // переменная разницы температуры(установленная - текущая)

void setup(){
 
if(indicator == 0){   //Если вначале был выбран общий Катод
                    for(int i=0; i<10;i++){
                                           digits[i] = ~ digits[i];
                                           }
                   }
 
  pinMode(pinpwm,OUTPUT);     // Порт нагрузки(паяльника) настраиваем на выход
  analogWrite(pinpwm, temppwmreal);     //Вывод  шим в нагрузку паяльника (выводим 0 - старт с выключеным паяльником- пока не опредилим состояние температуры)
 

  // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------
  DDRD = B11111111;
  for (int y=0;y<max_digits;y++)
          {
           pinMode(digit_common_pins[y],OUTPUT);
           digitalWrite(digit_common_pins[y], LOW);   
          }
  // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------

}

void loop() {
   
  show(increment);   // Вывести значение переменной на экран(LED)
   
   
   if (tempreal < tempust ){   // Если температура паяльника ниже установленной температуры то:
     
            if ((tempust - tempreal) < 16 & (tempust - tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,
                                     // Если разница меньше 10 градусов то
                             {
                              temppwmreal = 99;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                              }
             else  if ((tempust - tempreal) < 7 & (tempust - tempreal) > 3)
                                                                {             
                                                                  temppwmreal = 80;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                                 }
                             
                         else if ((tempust - tempreal) < 4 )
                                                      {             
                                                       temppwmreal = 45;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                       } 
                                                     
                                                     
                            else {
                                  temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255  мы делаем 230) на максимум для быстрого нагрева до нужной температуры
                                 }
                       
                             
      analogWrite(pinpwm, temppwmreal);     //Вывод в шим порт (на транзистор) значение мощности
    }
else { //Иначе (если температура паяльника равняется или выше установленной)
           
            temppwmreal = 0;  // Выключаем мощность нагрева (шим 0-255  мы делаем 0)  - таким образом мы отключаем паяльник
            analogWrite(pinpwm, temppwmreal);   //Вывод в шим порт (на транзистор) значение мощности
          }

 
  if(millis() - actual_count_delay > count_delay) // это для сегментов

  { 
    actual_count_delay = millis();
     // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)
   
    tempreal = analogRead(0);// считываем текущую температуру
   
    tempreal=map(tempreal,-50,700,0,500);   // нужно вычислить
    increment=tempreal;
 
  //---------------------------------------------------------- Кнопки ------------------------------------------------------------------------- 
          if (analogRead(knopka) == 0)  // Если нажата вниз кнопка то понизить температуру на 5
                               {
                               if( tempust <= tempmin || (tempust-5) <= tempmin )
                                                          {
                                                            tempust= tempmin;
                                                            increment = tempust;
                                                          }
                                       else {
                                             tempust=tempust-5;
                                             increment = tempust;
                                             show(increment);   // Вывести значение переменной на экран(LED)
                                           
                                              }
                                 
                                 
                             
                               }
 
          else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 )  // Если нажата вверх кнопка то повысить температуру на 5
                                       {
                                       tempust=tempust+5;
                                       if( tempust >=tempmax)
                                                          {
                                                            tempust= tempmax;
                                                          }
                                       increment = tempust;
                                       show(increment);   // Вывести значение переменной на экран(LED)
                                     
                                       }

   
  }
}

void show(int value) { //------------------------------- подпрограмма для вывода на сегменты   - лучше не изменять ---------------------------------------------
  int digits_array[]={}; 
  int y=0;
  boolean empty_most_significant = true;
 

 
  if(millis() - actual_refresh_delay >= refresh_delay)
  { 

  for (int z=max_digits-1;z>=0;z--)
  {


    digits_array[z] = value / pow(10,z); //rounding down by converting from float to int
   
    if(digits_array[z] != 0 ) empty_most_significant = false;  // DON'T SHOW LEADING ZEROS
   
    value = value - digits_array[z] * pow(10,z);





   if(z==current_digit)
        {
         if(!empty_most_significant || z==0){ // DON'T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT
           
                                            PORTD = digits[digits_array[z]];
                                            }
                                       else
                                            {
                                             if(indicator == 0){   //Если вначале был выбран общий Катод
                                                                PORTD = B00000000; 
                                                                }
                                                     else{
                                                           PORTD = B11111111;
                                                          } 
                                            }

       if(indicator == 0){
                         digitalWrite(digit_common_pins[z], LOW);
                         }
             else{
                  digitalWrite(digit_common_pins[z], HIGH);
                 }
      }
else{
     
     if(indicator == 0){
                         digitalWrite(digit_common_pins[z], HIGH);
                         }
             else{
                  digitalWrite(digit_common_pins[z], LOW);
                 }
   }

}
 

      current_digit--;
      if(current_digit < 0)
      {
        current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS
      }

actual_refresh_delay =  millis();     
}

}

А вот текст ошибки
    Arduino: 1.6.9 (Windows 7), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

    Скетч использует 4 572 байт (14%) памяти устройства. Всего доступно 30 720 байт.
    Глобальные переменные используют 67 байт (3%) динамической памяти, оставляя 1 981 байт для локальных переменных. Максимум: 2 048 байт.
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x1c
    Проблема загрузки в плату. Помощь по загрузке: http://www.arduino.cc/en/Guide/Troubleshooting#upload .

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    "Показать подробный вывод во время компиляции"
Последний раз редактировалось Markys 19 июл 2016, 15:48, всего редактировалось 1 раз.
Markys
 
Сообщения: 16
Зарегистрирован: 19 июл 2016, 14:57

Re: Помогите разобраться с ошибкой

Сообщение Madf » 19 июл 2016, 15:40

Скорее всего, в схеме используются ножки МК, которые используются для программирования его же. Конфликт сигналов.
Без схемы ДО и ПОСЛЕ трудно сказать.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Помогите разобраться с ошибкой

Сообщение Markys » 19 июл 2016, 18:33

ВОТ схема
Изображение
Markys
 
Сообщения: 16
Зарегистрирован: 19 июл 2016, 14:57

Re: Помогите разобраться с ошибкой

Сообщение Madf » 19 июл 2016, 19:43

Что за индикатор "888"? Если это 3 цифры (семисегментник), то их нужно обязательно включать через резисторы, чтобы задать режим тока и не сжечь МК (дуню). Так же индикация у вас динамическая, недостаток данного включения в том, если будет какая ошибка в коде, то можно перегрузить нагрузкой МК.

В общем, делайте сначала правильную схему, а потом уже кодить надо...

Добавлено спустя 4 минуты 28 секунд:
https://www.electronicsblog.net/4-digit ... h-arduino/

Добавлено спустя 1 минуту 24 секунды:
http://arduino.stackexchange.com/questi ... it-display

Добавлено спустя 4 минуты 7 секунд:
По русски решения:

http://arduino.ru/forum/proekty/vyvod-i ... kh-74hc595
http://www.radiokot.ru/start/mcu_fpga/avr/15/ - правда на асме
http://arduino.ru/forum/apparatnye-vopr ... indikatora
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Помогите разобраться с ошибкой

Сообщение Markys » 19 июл 2016, 21:48

Да это сегментные индикаторы. Схема не моя. Я сам еще чайник, спаять что нить не сложное могу. Вот ардуинкой решил научится пользоваться, но пока только готовые скетчи. Насчет развязки спасибо за совет переделаю в следующей схеме.
Сейчас стоит вопрос что с ардуинкой?
Markys
 
Сообщения: 16
Зарегистрирован: 19 июл 2016, 14:57

Re: Помогите разобраться с ошибкой

Сообщение Madf » 20 июл 2016, 13:08

Если есть подозрение, что у вас что-то с дуней, то можете залить простенький скетч с миганием светодиода/ов и постепенно прозвонить так каждую ножку МК (это мы проверяем выход). Причем скетч нужно/можно доработать так, чтобы ещё логика была на "вход". Т.е. чтобы замыкая программированную ногу на вход/кнопки, загорался светодиод. И так проверяем все комбинации ног дуни... Да геморрой, но а как иначе. :D
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Помогите разобраться с ошибкой

Сообщение Dmitry__ » 20 июл 2016, 13:23

Вообще, названия ножек в ардуинах просто рвут шаблоны. Но осмелюсь предположить, что d0,d1, которые идут на индикатор, являются rx/tx программатора. Вот тут собака и порылась.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Помогите разобраться с ошибкой

Сообщение Myp » 20 июл 2016, 14:17

именно так и есть
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Помогите разобраться с ошибкой

Сообщение Madf » 20 июл 2016, 14:35

я об этом писал)
сложность всегда в изложении проблемы человеком, слабо разбирающимся в железе/софте, трудно сразу понять реальную проблему (порой: из-за не технического описания)
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Помогите разобраться с ошибкой

Сообщение loox » 20 июл 2016, 14:56

Нет, это не так.
При програмировании сначала мк переводится в режим reset, и все ноги переходят в третье состояние.
Вероятнее всего, коллега программирет, потом отключается от компа, проверяет. ?..... далее снова подключает и пытается снова программироваь. При отключении среда Ардуно теряет связь и при повторной попытке прграммировать пишет -нет связи
Loox
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45

Re: Помогите разобраться с ошибкой

Сообщение Markys » 20 июл 2016, 15:01

Dmitry__ писал(а):Вообще, названия ножек в ардуинах просто рвут шаблоны. Но осмелюсь предположить, что d0,d1, которые идут на индикатор, являются rx/tx программатора. Вот тут собака и порылась.

да вы правы это они и есть. К сожалению я только учусь. поэтому и пользуюсь пока тем что есть.
Уже слышал не раз что возникает конфликт если использовать эти ножки. Как теперь быть ардуинку на выброс или ее еще можно спасти???
Markys
 
Сообщения: 16
Зарегистрирован: 19 июл 2016, 14:57

Re: Помогите разобраться с ошибкой

Сообщение Dmitry__ » 20 июл 2016, 15:14

Markys писал(а): Как теперь быть ардуинку на выброс или ее еще можно спасти???

Зачем выкидывать? Если дуину отключить от схемы, она шьется?
Сигналам rx/tx программатора мешает индикатор твоей схемы. Если хочется шить дуину прямо в схеме, то надо на эти ножки поставить сьемные перемычки и на время программирования снимать их.
А еще лучше изменить программу для использования других свободных ножек дуины. Тогда программирование в схеме будет без лишних телодвижений коммутации перемычек.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Помогите разобраться с ошибкой

Сообщение Madf » 20 июл 2016, 16:35

Обычно, чтобы программатору не мешало ничего шиться, включают обвязку портов через резисторы, но надо понимать, как потом будит влиять программатор на всю схему в режиме прошивке (например, если это нога управления реле/нагрузкой), в общем чревато последствиями.
В общем, просто не используйте в схемной реализации ноги МК/дуни те, что используются при программировании (особенно, если нет пока опыта).
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Помогите разобраться с ошибкой

Сообщение Markys » 20 июл 2016, 16:42

Dmitry__ писал(а):Если дуину отключить от схемы, она шьется?


Нет. А в схеме я не пробовал шить. Я всегда извлекаю ее.

Dmitry__ писал(а):А еще лучше изменить программу для использования других свободных ножек дуины.


Я бы с удовольствием. Если кто поможет. или хотябы подскажет. Но сначало нужно с ардуиной разобраться, почему она не шьется???

Добавлено спустя 4 минуты 32 секунды:
Madf писал(а):В общем, просто не используйте в схемной реализации ноги МК/дуни те, что используются при программировании (особенно, если нет пока опыта).


Теперь то уже запомнил. Это был первый опыт. (как говорится первый блин комом(только я умудрился два испортить))
Markys
 
Сообщения: 16
Зарегистрирован: 19 июл 2016, 14:57

Re: Помогите разобраться с ошибкой

Сообщение Scorpio » 20 июл 2016, 17:12

Ардуину неправильной программой не испортишь ). Разве что подать на ногу 25 вольт.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron