Atmega328 Int RC 8Mhz не работает так же, как Arduino Uno
- Войдите на сайт для отправки комментариев
Всем привет! Делал проект один с подрулевым джойстиком Рено, его прнципиальная схема такая, что это просто матричная клавиатура 3*3. Кто помнит недавно писал в форуме об дополнительной обработки кнопки на длительном нажатии, но так и не удалось завести обработку длительного нажатия! Плюнул, все работало, вместе с энокдеорм на однократное нажатие, в принципе достаточно! Энкодер тут не обычный, один столбец на него отдан, и поочередно замыкают на него по одной строке, т.е. один щелчок энкодера, и сделующая строка замкнулась на столбец!
А вот дальше прошло у меня все наперекосяк... С Ардуино Уно в железе на макетке все работало замечательно... Залил бутлоадер в мегу328 чтобы она работала от внутреннего кварца 8MHz, потом скетч, вытравил плату, и вот тебе пакость... не читает так клавиатуру как, надо, по сути работает одина строка в клавиатуре... остальные молчат и энкодер тоже((( думал накосячил в коде, нет проверил, все отлично как было... залил скетч в Уно, работает черт, в на меге нет! Грешу на то что у меги нет внешнего кварца на 16MHz, поэтому такие приколы получаются((
Вопрос может ли быть такое, у меня других вариантов нет?
Делал все в ArduinoIDE 1.6.7
Скетч внизу на всякий случай:
//////////////////////////////////////////////////////////////// // джойстик #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);} }
neid86@gmail.co, судя по скетчу привязок по частоте тут нет. В худшем случае delay работал бы в 2 раза быстрее или медленее чем нужно. Значит проблема в чём-то ещё. Тем более на это указывает что часть клавиатуры всё же работает. Есть сотня способов накосячить при разводке, пайке, подключении. Каким способом вы воспользовались догадаться сложно :)
Да нет ошибки в разводке и пайке, тем более что с мегой328 повторил все на макетке, результат тот же... мистика! я впервые начинаю работать с мегой прошитой бутлоадером, а тут еще с таким столкнулся... простые скетчи работают, даже проверил порты, накидав примитив самый быстрый, ну малоли может что не так, нет все в норме! я уже много чего перелопатил прежде чем написать((
Еще просмотрел схему принципиальную Уно, та что с мегой16... в моей плате нет резистора на 10кОм что висит между питание и ресетом... ну кварц не ставил заведомо, т.к. от внетреннего кварца, итаю все 7805 стабилизатором!
neid86@gmail.c, ну вот уже косяк, и возможно не единственный :)
который? резистор? это косяком сложно назвать... и врятли он может повлиять...
neid86@gmail, ну как сказать.. с одной стороны конечно там есть встроенный пулл-ап, иначе бы совсем не работало. Но как я понимаю если к пину ресет что-то подключается, то атмел настоятельно рекомендует вешать и внешний пулл ап, даже картинки рисует (figure 2-1) по этому поводу.
не вариант, вот все подпаял... каврц на 16, два кондера на землю, резюк на ресет... перепрошил все под внешний... со стандартными загрузчиками что были в IDE... фиг, в ардуино работает тут нет(( блин люди тож самое делаю на макетке и у них все работает((
плата моя, мож я не вижу ошибки? ну кварц с кондерами и резюк на ресет
я тут не рисовал, припаял я их вот только сейчас!
neid86@gmail, так разве это не указывает на то, что проблема с подключением? Раз идентичный скетч с идентичным МК на той же частоте работает..
так а где проблема с подключение...? я вот не вижу её... мож конечно мозг уже залип)))
neid86@gmail, по вашему рисунку мало что можно узреть, может ошибка в коммутации проводов.. Из того что заметил -аналоговую землю лучше б не бросать в воздухе, питание висит -фик с ним, но висящая земля может вызвать перекос уровней в мультиплексоре..
она не висит на нее подпаин ик-приемник
комутации проводов джойстика? исключено, он же работает на ардуино...
я говорю мистика, была бы другая мега я бы сейчас поменял и тогда с увереностью сказал за нее(
а 7805 может давать странные глюки?
neid86@gmail, куда подпаян ик приёмник, на 22 ногу? зачем? :) Её просто с 8й ногой соединить. 7805 если без конденсаторов - то может загенерить на ВЧ.
ну вы плату видит же... там же нет пару контактов меги, почуме 22? выход ик приемника идет на 17 ногу(она же 11 порт по ардуиновски), плюс и минус для питания ик приемника
7805 на входе и выход естоят электролиты с керамикой... а выс мотрели плату?
neid86@gmail, не путайте меня. Я вам написал про аналоговую землю. Это 22 нога микрухи. Какое отношение имеет ик приёмник к этому? по второму вопросу -рисунок смотрел. Судя по вашей тенденции всё упрощать подумал что и конденсаторы вы сократили. Кстати разведено там судя по всему под тантал, но керамика там важнее.
Переделаю разводку, уже меги менял в уно обе работают на плате нет(
Что не правильно развел? Чтоб потом не переделывать? Убрать все под мк? Кроме земли подальше от наводок?
Че то мне эта ардуино, сколько не делал на мегах первый раз такая фигня, писал бы в cvavr не было бы такого, и наводки побоку...
Зачем переделывать? Киньте перемычку между 8 и 22ой ногой МК, а между 7 и 8 подпаяйте керамику 0,1мкф. Напряжение после кренки проверить, и по переменке тоже посмотреть, что б не больше 50мв пульсаций.
пульсации мне нечем померить( керамика на 0.1мкФ говорил что стоит! перемычку делал, не особо помогла!( с ней заработал еще энкодер, но станно, получается что его крутиш туда сюда)) напряжение после кренки 5.05В