Atmega328 Int RC 8Mhz не работает так же, как Arduino Uno

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

Всем привет! Делал проект один с подрулевым джойстиком Рено, его прнципиальная схема такая, что это просто матричная клавиатура 3*3. Кто помнит недавно писал в форуме об дополнительной обработки кнопки на длительном нажатии, но так и не удалось завести обработку длительного нажатия! Плюнул, все работало, вместе с энокдеорм на однократное нажатие, в принципе достаточно! Энкодер тут не обычный, один столбец на него отдан, и поочередно замыкают на него по одной строке, т.е. один щелчок энкодера, и сделующая строка замкнулась на столбец!

А вот дальше прошло у меня все наперекосяк... С Ардуино Уно в железе на макетке все работало замечательно... Залил бутлоадер в мегу328 чтобы она работала от внутреннего кварца 8MHz, потом скетч, вытравил плату, и вот тебе пакость... не читает так клавиатуру как, надо, по сути работает одина строка в клавиатуре... остальные молчат и энкодер тоже((( думал накосячил в коде, нет проверил, все отлично как было... залил скетч в Уно, работает черт, в на меге нет! Грешу на то что у меги нет внешнего кварца на 16MHz, поэтому такие приколы получаются((

Вопрос может ли быть такое, у меня других вариантов нет?

Делал все в ArduinoIDE 1.6.7 

Бутлоадер вот такой:
a328p_8MHz.name=atmega328p (8 MHz in)
a328p_8MHz.upload.tool=avrdude
a328p_8MHz.upload.protocol=arduino 
a328p_8MHz.upload.maximum_size=32256
a328p_8MHz.maximum_data_size=2048
a328p_8MHz.upload.speed=115200
 
a328p_8MHz.bootloader.tool=avrdude 
a328p_8MHz.bootloader.low_fuses=0xe2 
a328p_8MHz.bootloader.high_fuses=0xde 
a328p_8MHz.bootloader.extended_fuses=0x05
a328p_8MHz.bootloader.unlock_bits=0x3F
a328p_8MHz.bootloader.lock_bits=0x0F
a328p_8MHz.bootloader.path=optiboot 
a328p_8MHz.bootloader.file=optiboot/a328p_8MHz_e2_de_5.hex
 
a328p_8MHz.build.mcu=atmega328p 
a328p_8MHz.build.f_cpu=8000000L
a328p_8MHz.build.board=AVR_UNO 
a328p_8MHz.build.core=arduino 

Скетч внизу на всякий случай:

////////////////////////////////////////////////////////////////
// джойстик
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] = 
{
  {1,4},
  {2,5},
  {6,3}
};

// состояния направлений енкодера
const byte encoderdirection[3][3] = // 0 - на месте, 1 - вниз, 2 - вверх
{
  {0, 1, 2},  // 0
  {2, 0, 1},  // 1
  {1, 2, 0}   // 2     
};

// номера пинов
const byte rowPins[rows] = {A5, A4, A3}; // строки (желтый10, зеленый9, голубой8)
const byte colPins[cols] = {A2, A0}; // столбцы (черный7, красный5)

#define encoderPin A1 // пин енкодера (коричневый6)
byte encodervalue;

// маски для клавиш
#define MaskMediaButton      1 
#define MaskRadioButton      2
#define MaskVolumeUpButton   4
#define MaskVolumeDownButton 8
#define MaskOkButton         16
#define MaskMuteButton       32 
#define MaskScrollDown       64 
#define MaskScrollUp         128 

unsigned long starttime;
bool workkbd; 
/////////////////////////////////////////////////////////////////


//*************************************************************
// Светодиоды для визуального контроля
// номера пинов
//*************************************************************
const int ledPin_1 = 2;      
const int ledPin_2 = 4;
const int ledPin_3 = 5;
const int ledPin_4 = 6;
const int ledPin_5 = 7;
const int ledPin_6 = 8;
const int ledPin_7 = 9;
const int ledPin_8 = 10;

void setup() 
{ 
  Serial.begin(9600); 
  int i;
  // строки - на выход
  for (i = 0; i < rows; ++i)
  {
    pinMode(rowPins[i], OUTPUT);
  }
  
  // столбцы - на вход
  for (i = 0; i < cols; ++i)
  {
    pinMode(colPins[i], INPUT);
    digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор  
  }

  // столбец для енкодера
  pinMode(encoderPin, INPUT);
  digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор  
   
  encodervalue = 0;
  
  starttime = millis();
  workkbd = false;
}

// сканирование джойстика
unsigned int scan(void)
{
  int i, j;
  unsigned int code = 0;
  bool pressed = false;
          
  for (i = 0; i < rows; ++i)
  {
    digitalWrite(rowPins[i], LOW);
    
    // кнопки
    for (j = 0; j < cols; ++j)
    {
      if(digitalRead(colPins[j]) == false)
      {
        code |= 1 << (keys[i][j] - 1);
      }         
    }
       
    // енкодер
    if (digitalRead(encoderPin) == false)
    {
      int oldencodervalue = encodervalue;
      encodervalue = i;
                        
      switch (encoderdirection[oldencodervalue][encodervalue])
      {
        case 1:  // вниз
          code |= 64;
          break;
        case 2:  // вверх
          code |= 128;
          break;
      }
    }
        
    digitalWrite(rowPins[i], HIGH);    
  }
  return code;
}


// цикл программы
void loop() 
{
  unsigned int code;
  
  code = scan();

  if (code & MaskMediaButton){
    Serial.print("Source>");
    Serial.println();
    digitalWrite(ledPin_1, HIGH);
    delay(200);
    digitalWrite(ledPin_1, LOW);}
     
  if (code & MaskRadioButton){
    Serial.print("Source<");
    Serial.println();
    digitalWrite(ledPin_2, HIGH);
    delay(200);
    digitalWrite(ledPin_2, LOW);}
    
  if (code & MaskVolumeUpButton){
    Serial.print("VolumeUp");
    Serial.println();
    digitalWrite(ledPin_3, HIGH);
    delay(200);
    digitalWrite(ledPin_3, LOW);}

  if (code & MaskVolumeDownButton){
    Serial.print("volumeDown");
    Serial.println();
    digitalWrite(ledPin_4, HIGH);
    delay(200);
    digitalWrite(ledPin_4, LOW);}

  if (code & MaskOkButton){
    Serial.print("TR");
    Serial.println();
    digitalWrite(ledPin_5, HIGH);
    delay(200);
    digitalWrite(ledPin_5, LOW);} 

  if (code & MaskMuteButton){ 
    Serial.print("Mute");
    Serial.println();
    digitalWrite(ledPin_6, HIGH);
    delay(200);
    digitalWrite(ledPin_6, LOW);}

  if (code & MaskScrollDown){
    Serial.print("RotateDown");
    Serial.println();
    digitalWrite(ledPin_7, HIGH);
    delay(200);
    digitalWrite(ledPin_7, LOW);}

  if (code & MaskScrollUp){
    Serial.print("RotateUp");
    Serial.println();
    digitalWrite(ledPin_8, HIGH);
    delay(200);
    digitalWrite(ledPin_8, LOW);}
   
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail.co,  судя по скетчу привязок по частоте тут нет. В худшем случае delay работал бы в 2 раза быстрее или медленее чем нужно. Значит проблема в чём-то ещё. Тем более на это указывает что часть клавиатуры всё же работает.  Есть сотня способов накосячить при разводке, пайке, подключении. Каким способом вы воспользовались догадаться сложно :)

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

 Да нет ошибки в разводке и пайке, тем более что с мегой328 повторил все на макетке, результат тот же... мистика! я впервые начинаю работать с мегой прошитой бутлоадером, а тут еще с таким столкнулся... простые скетчи работают, даже проверил порты, накидав примитив самый быстрый, ну малоли может что не так, нет все в норме! я уже много чего перелопатил прежде чем написать((

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

Еще просмотрел схему принципиальную Уно, та что с мегой16... в моей плате нет резистора на 10кОм что висит между питание и ресетом... ну кварц не ставил заведомо, т.к. от внетреннего кварца, итаю все 7805 стабилизатором!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail.c, ну вот уже косяк, и возможно не единственный :)

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

который? резистор? это косяком сложно назвать... и врятли он может повлиять... 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail, ну как сказать..  с одной стороны конечно там есть встроенный пулл-ап, иначе бы совсем не работало. Но как я понимаю если к пину ресет что-то подключается, то атмел настоятельно рекомендует вешать и внешний пулл ап, даже картинки рисует  (figure 2-1) по этому поводу.

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

не вариант, вот все подпаял... каврц на 16, два кондера на землю, резюк на ресет... перепрошил все под внешний... со стандартными загрузчиками что были в IDE... фиг, в ардуино работает тут нет(( блин люди тож самое делаю на макетке и у них все работает((

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

плата моя, мож я не вижу ошибки? ну кварц с кондерами и резюк на ресет я тут не рисовал, припаял я их вот только сейчас!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail, так разве это не указывает на то, что проблема с подключением? Раз идентичный скетч с идентичным МК на той же частоте работает..

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

так а где проблема с подключение...? я вот не вижу её... мож конечно мозг уже залип)))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail, по вашему рисунку мало что можно узреть, может ошибка в коммутации проводов.. Из того что заметил -аналоговую землю лучше б не бросать в воздухе, питание висит -фик с ним, но висящая земля может вызвать перекос уровней в мультиплексоре..

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

она не висит на нее подпаин ик-приемник

комутации проводов джойстика? исключено, он же работает на ардуино...
я говорю мистика, была бы другая мега я бы сейчас поменял и тогда с увереностью сказал за нее(

а 7805 может давать странные глюки? 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail, куда подпаян ик приёмник, на 22 ногу? зачем? :)  Её просто с 8й ногой соединить. 7805 если без конденсаторов - то может загенерить на ВЧ.

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

ну вы плату  видит же... там же нет пару контактов меги, почуме 22? выход ик приемника идет на 17 ногу(она же 11 порт по ардуиновски), плюс и минус для питания ик приемника

7805 на входе и выход естоят электролиты с керамикой... а выс мотрели плату?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

neid86@gmail, не путайте меня. Я вам написал про аналоговую землю. Это 22 нога микрухи. Какое отношение  имеет ик приёмник к этому? по второму вопросу -рисунок смотрел. Судя по вашей тенденции всё упрощать подумал что и конденсаторы вы  сократили. Кстати разведено там судя по всему под тантал, но керамика там важнее.

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

Переделаю разводку, уже меги менял в уно обе работают на плате нет(
Что не правильно развел? Чтоб потом не переделывать? Убрать все под мк? Кроме земли подальше от наводок?

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

Че то мне эта ардуино, сколько не делал на мегах первый раз такая фигня, писал бы в cvavr не было бы такого, и наводки побоку...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Зачем переделывать? Киньте перемычку между 8 и 22ой  ногой МК, а между 7 и 8 подпаяйте керамику 0,1мкф. Напряжение после кренки проверить, и по переменке тоже посмотреть, что б не больше 50мв пульсаций.

neid86@gmail.com
Offline
Зарегистрирован: 28.10.2014

пульсации мне нечем померить( керамика  на 0.1мкФ говорил что стоит! перемычку делал, не особо помогла!( с ней заработал еще энкодер, но станно, получается что его крутиш туда сюда)) напряжение после кренки 5.05В