код ардуино не работает на attiny
- Войдите на сайт для отправки комментариев
кто может подсказать почему данный код прекрасно работает на atmega328, но неправильно работает на attiny85?
int starbutton = 0;
int ignition_pin = 1;
int brake_pin = 3;
int starter_pin = 2;
int alt_pin = 4;
int state = 0;
int reading;
int previous = LOW;
int brakeState = 0;
int buttonState = 0;
int altState;
long time = 0;
long debounce = 200;
long interval = 100;
void setup()
{
pinMode(starbutton, INPUT);
pinMode(ignition_pin, OUTPUT);
pinMode(brake_pin, INPUT);
pinMode(starter_pin, OUTPUT);
pinMode(alt_pin, INPUT);
}
void ignition(){
digitalWrite(ignition_pin, HIGH);
}
void starteroff(){
digitalWrite(starter_pin, LOW);
}
void loop()
{
reading = digitalRead(starbutton);
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH)
state = LOW;
else
state = HIGH;
time = millis();
}
digitalWrite(ignition_pin, state);
{
buttonState = digitalRead(starbutton);
}
previous = reading;
brakeState = digitalRead(brake_pin);
if(brakeState == HIGH && reading == HIGH && state == HIGH && millis() - time > interval){
digitalWrite(starter_pin, HIGH);
}
else{
digitalWrite(starter_pin, LOW);
}
altState = digitalRead(alt_pin);
if(altState == HIGH){
starteroff();
}
}
что в нем не так?
Для начала это почитайте: Вставка программного кода в тему/комментарий.
кто может подсказать почему данный код прекрасно работает на atmega328, но неправильно работает на attiny85?
Тут могут подсказать - им описания "неправильно работает" будет вполне достаточно что бы вам помочь.
первый пост не правится.
это пргорамма старта автомобиля с кнопки, для уменьшения размеров платы хотел засунуть програму в attiny85, на дуине плата работает нормально, а вот на attiny глючит, сразу при включении питания контроллера начинается самопроизвольный старт, потом сразу отрубается и снова... так вроде при программировании контроллера ошибок нету, простой blink тоже работает нормально... да и в коде у меня не использованно недоступных для attiny команд, вроде все поддерживаются, только насчет if() неуверен.
немного пояснения:
startbutton кнопка старта
ignition_pin выход на реле зажигания
starter_pin выход на реле стартера
brake_pin сигнал с нажатой педали тормоза (без тормоза включится только зажигание)
alt_pin сигнал с генератора (для отключения стартера)
Думаю стоит копать в сторону аппаратной части: нестабильное питание, не подтянутые входы и т.д. и т.п.
вот схема, эта плата уже работала успешно с атмегой, сейчас attiny+smd компоненты и не пашет
Дла начала я бы РЕСЕТ (1 пин) на питание притянул....
через резистор? попробую.... какой номинал?
Со схемой что то не то
вход 7805 висит в воздухе, а по идее должен быть запитан на бортовый 12в. К тому же воздуху прицеплена кнопка
Поставьте около 5 кОм, что бы наверняка.
У 7805 еще и вход с выходом перепутаны, но я думаю это просто так схема нарисована, иначе вообще бы ничего не работало.
И, кстати, это скорее всего не только начало, а еще и конец поисков вашей причины.
поясняю: я использую 78L05 в SOT корпусе, на которую подается + через реле, управляемое внешним сигналом. 1 пин это выход +5в, 2 масса, 3 входное напряжение. у меня в протеусе нет стабилизатора с такой распиновкой, поэтому я просто поменял местами выводы что бы в ARES они сидели правильно. попробю с ресетом и отпишусь...
В протэусе все есть, можно к 78L05 добавить корпус и переназначить выводы.
поставил резистор на ресет... все работает, но при включении питания самопроизвольно включается ignition_pin, но это когда я на весу все включаю, у меня еще есть раньше сделанная макетная плата, так на ней все нормально работает.... не могу понять в чем разница?
иногда еще такие глюки замечаются: подносишь руку к контроллеру, и опять начинает игратся, включение-выключение :( что это тиньки такие капризные? такое может быть из за фильтров по питанию? у меня на стабилизаторе кондеры не стоят в данный момент?
......................................
кажется разобрался, нельзя напрямую нагружать выходи тиньки, даже светодиод включенный напрямую без резистора, вызывает глюки! такое же бы с реле подключеным напрямую, сейчас подключил через транзисторный ключ, вроде работает...
читайте даташит на стабилизатор. У них у каждого есть свои требования к конденсаторам, если требования не выполнить - будет сомавозбуждение с гулянием питания.
потом я бы еще сделал програмную задержку после старта - скажем секунду не реагировать на нажатие кнопки, потому как при вашем включении вполне реально, что после подачи питания на входе кнопки окажется логическая 1 и будет там до тех пор, пока внутренняя емкость не разрядится через резистор
Неплохо-бы диод на обмотку реле, а то жалко тот контакт который его включает через 3-й пин коннектора.
Да и высоковольтные выбросы на выход стабилизатора совсем ни к чему...
Читайте про Первый закон коммутации в
http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%...
Почему затворы транзисторов Q1 и Q2 не "прижаты" к земле 10 К резисторами?
Неплохо-бы диод на обмотку реле, а то жалко тот контакт который его включает через 3-й пин коннектора.
Да и высоковольтные выбросы на выход стабилизатора совсем ни к чему...
откуда там выбросы?) присмотрелся к схеме - в таком включении реле никогда не включится:
1. один вывод реле выведен на разъем, но второй подклчен к нормально разомкнутому контакту - что обмотку реле попало напряение нужно чтобы замкнулись его контакты....
2. обмотка включена последовательно с резистором 10к, вы знаете электромагнитное реле с током срабатывания 1.2ма? я нет
реле которое я использую omron g5v-1, оно работает от 5 вольт и очень маленькое. я уже проверял: ток питания 12в резистор 10к, на обмотку идет примерно 4.7в и оно срабатывает.
как оно может сработать если его питание разорвано его же контактами?
на схеме неправильно, при разводке платы я поменял в аресе... R11 должен быть подключен к нижнему контакту, сначала я хотел на транзисторном ключе собрать, так и сделал но когда плата заглючила разобрал и решил сделать через реле
Почему затворы транзисторов Q1 и Q2 не "прижаты" к земле 10 К резисторами?
Тоже согласен с этой причиной на все сто , я ставлю даже намного выше номинал чем 10кОм : 510кОм - 1.3мОм - что на P- канальные , что на N- канальные !
Резистор 10кОм pin1 > +5V
Позвольте полюбопытствовать , а оптроны вам зачем в этой схеме - все это можно замнить двумя резисторами сделав делитель !
Почему затворы транзисторов Q1 и Q2 не "прижаты" к земле 10 К резисторами?
Тоже согласен с этой причиной на все сто , я ставлю даже намного выше номинал чем 10кОм : 510кОм - 1.3мОм - что на P- канальные , что на N- канальные !
Резистор 10кОм pin1 > +5V
Позвольте полюбопытствовать , а оптроны вам зачем в этой схеме - все это можно замнить двумя резисторами сделав делитель !
я не настолько хорошо разбираюсь в электронике пока, потому то я и написал здесь все это, что бы советы полезные получить. все что я пока сделал, схему, плату и програмный код, все сделал сам, с нулевых знаний. может кто нибудь внесет необходимые изменения на схеме?
1.Нужно знать , что приходит на резисторы R1 , R2 ( какие уровни и в какие моменты ) ?
2.Стабилизатор 78L05 и обмотка реле ( кстати резистор R11 там зачем ? ) - запитанны от куда АКБ ?
3.Естественно и над кодом надо еще работать - что будет например если ATtyni зависнет и будет постоянно крутить стартер ( бегом под капот отключать АКБ ? )
PS Обрисуйте полную картину по вопросам выше и далее уже будет разговор.
на R1 приходит +12в когда нажата педаль тормоза, это для того что бы сразу после включения реле зажигания включилось реле стартера, без нажатой педали тормоза включится только зажигание.
на R2 приходит +12в когда двигатель заведется и на приборной панели гаснет индикатор зарядки, это для того чтобы автоматически отрубать реле стартера, даже если кнопка старта нажата.
R11 для того чтобы подать 12в на 5-и вольтовое реле, номинал в данный момент 330омм.
что касается зависания, эта же схема с этими же номиналами только на атмеге 328 почти год успешно проработала на моей машине, без единного глюка. кстати, с глюками я сегодня разобрался, виной всему с самого начала была шестиконтактная кнопка, которую я неправильно прозвонил, сейчас исправил и все работает.
но все же хочется знать что бы вы поменяли на схеме?
но все же хочется знать что бы вы поменяли на схеме?
Все правильно ответили , но добавлю немного конкретики.
Делаете делитель: IN>2кОм + 1кОм>GND , к точки соединения этих резисторов подключаете вот такую TVS SRDA05-4 сборку из 4-х каналов ( попробовать можно и без нее , работать будет) далее на вход ATtiny.
И сделайте то что описывал выше (подтянуть к GND входы полевиков , и к +5в reset)
PS Тиньку 85 не смотрел , но если в нем есть аналоговый вход то и вход > R2 вешаете на +12в ( при этом вот такой делитель IN>3кОм + 1кОм>GND) , а впрограмме указываете порог сробатывания (примерно 750) по этому входу - что будет соответствовать ( что двигатель запущен ) при напряжении 13в и более.
про 78L05 не ответили +12V откуда на него идет ?
reset я подтянул через резистор на 5.1 килоомм, транзисторы сделаю.
в тиньке аналогового входа нет, только цифровые. а 7805 получает 12в через 5 вольтное реле и от АКБ. реле управляется отрицательным сигналом с Аллигатора. система такая: как только я открываю машину пультом, сигналка включет реле ACC, тоесть первое положение ключа зажигания, а также эту плату, потом просто нажатие кнопки это зажигание а если с тормозом то зажигание с стартером. закрытием машины с пульта отключится и реле ACC.
как с програмным кодом? у меня такая проблема: когда с индикатора зарядки поступает 12в и кнопка старта нажата, на стартер идут импульсы, по крайней мере протеус так показывает и макет на светодиодах тоже, тоесть реле стартера не полностью отрубается. в реале это не имеет значения так так эти импулсы настолько слабы что не крутят стартер, но все же хочется знать из за чего это?
Посмотрел ATtiny 85 - в ней 6 АЦП и 1 ЦАП - т.е есть аналоговые входы !
Чесно - я непонимаю как может включиться реле в данной схеме т.к посути ее второй вывод обмотки весит в воздухе - может что не так нарисованно ?
Посмотрел ATtiny 85 - в ней 6 АЦП и 1 ЦАП - т.е есть аналоговые входы !
АЦП всегда один, а вот аналоговых входов может быть несколько.
Вот те выводы где написано ADCx и есть аналоговые входы. Так же не забывайте что так как у вас нет высоковольтного программатора ADC0 задействовать не получится. Итого 3 аналоговых входа.
так включается реле
Посмотрел ATtiny 85 - в ней 6 АЦП и 1 ЦАП - т.е есть аналоговые входы !
АЦП всегда один, а вот аналоговых входов может быть несколько.
Вот те выводы где написано ADCx и есть аналоговые входы. Так же не забывайте что так как у вас нет высоковольтного программатора ADC0 задействовать не получится. Итого 3 аналоговых входа.
Не секрет , здесь http://www.chipdip.ru/product/attiny85-20pu/ по ADC0 - получиться но только один раз !
Есть и ADC4 - встроенный сенсор температуры - программно вызывается ! так что - 5 ADC каналов есть!
DATASHIT - конечно не смотрел у меня нет тинек 85 , пока без надобности , а инфа в ЧипеДипе может быть и не достоверна согласен !
Я вам даже больше скажу, тот кто это написал либо полный идиот, либо написал это специально с припиской "Внутренний" что бы дурить людей. Скланяюсь ко второму.
Дело в том что, да есть в тине ЦАП, но к этому ЦАПу нет никакого доступа, так как он является частью АЦП. А каналов у мультиплексора 5, но к ADC4 тоже нет никакого доступа, так как на нем висит датчик температуры. Откуда взялся шестой канал не ясно, может вход опорного напряжения ЦАПа посчитали за один канал.
Работает у тини АЦП примерно так:
или так:
точно сказать не могу. Склоняюсь к первому варианту так как он более логичный - время конвертации не зависит от значения входного сигнала.
maksim - меня заинтересовал внутренний сенсор температуры , нет ли данных - что он может и действительно ли програмно можно вызвать его показания прописав коде A4 - актуально если нужно разово выполнить действие по температуре пока камень не изменил свою температуру после включения !
програмно можно вызвать его показания прописав коде A4
Если точность +/-10 градусов (при однократном измерении) вас устроит, то нужно все биты MUX[3:0] в регистре ADMUX установить в единицы.
програмно можно вызвать его показания прописав коде A4
Если точность +/-10 градусов (при однократном измерении) вас устроит, то нужно все биты MUX[3:0] в регистре ADMUX установить в единицы.
А какова тогда задача термо-датчика в камне - чисто для внутренних нужд ?
датчик есть почти во всех более менее последних разработках AVR8 к коим относится tiny85, если сравнить ее с tiny13 то от внешней схожести не останется и следа. tiny85 например имеет встроенный генератор на 16мгц. Термометр наверно придумали для внутрисхемных нужд, например контролировать выход режима работы самого МК за пределы доспустимого. Проблема в использовании этого датчик для измерения окружающей температуры не в точности самого датчика, а в том, что МК как любой электрический прибор при работе нагревается
кажется у меня в коде что то не так :( когда я подключаю оптроны, контроллер отказывается работать до сброса... при подаче уровней на R1 и R2, зависает тинька. а на светодиодном макете то как работает тогда??
кажется у меня в коде что то не так :( когда я подключаю оптроны, контроллер отказывается работать до сброса... при подаче уровней на R1 и R2, зависает тинька. а на светодиодном макете то как работает тогда??
Что то не состыковочка - писали что год отработала без проблем !
У меня есть интерес к запуску авто с кнопки , но буду делать на ATtiny13 и чуть позже.
схема да, а вот код я сначала переписал недавно.... нашел старый код, где запуск осуществляется одним нажатием, сегодня проверю...
с этим кодом тинька совсем не подает признаков жизни, атмега работает :( с пинами может быть проблема?
невнимательность.... :(
в других кодах у меня пины именами назывались, потому и пропустил
А Вы знаете что комбинация клавиш Ctrl + t в среде Arduino облегчает Вам жизнь и другим? :)
Я вот уже завёл привычку перед Ctrl + s нажимать Ctrl + t, а это делаю очень часто, особенно когда часть кода работает как надо.
Сила привычки.
Кстати, у Вам переменная time не используется, а тип long довольно прожорлив к памяти.
Кстати, у Вам переменная time не используется, а тип long довольно прожорлив к памяти.
все что неиспользовано линкером и компилятором выбрасывается
переписывал тут библиотеку с ардуино на Atmel studio - много узнал нового про качество написания кода )) по умолчанию в atmel studio высвечивается много всяких интересных предупреждений. И если скажем лишняя переменная не скажется на работе программы, то вот присвоение занчение переменной при котором происходит обрезание значения - вот это уже проблема. В ардуино ничего этого не видно при компиляции, хотя может это где то включается?
исправил вроде, но тинька опять не пашет, атмега - да.
Этот код вообще может поместиться в тиньку13 ,только оптимизировать немного...
Даже без оптимизации Размер скетча в двоичном коде: 698 байт (из 1 024 байт максимум).
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=1#comment-42790
Даже без оптимизации Размер скетча в двоичном коде: 698 байт (из 1 024 байт максимум).
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=1#comment-42790
Да ,точно ,не пробовал компилировать по тиньку13 :)
А,так я бы ещё константы через дефенед переделал -ещё бы меньше было..
можете сказать почему в 85-ой тиньке не работает?
Всеравно похоже на проблемы в электрике , может питание ей не нравится ,я бы электролит попробовал поставить на выходе 7805 .
atmega328 работала голая или в составе платы ардуино ??
можете сказать почему в 85-ой тиньке не работает?
А банальный Debounce работает?