2. переменная off обнуляется в тексте программы при каждом нажатии на любую кнопку.
А если кнопку не нажимаем долгое время, а "off" так и крутится постоянно - это нормально будет?
ну вроде я так понял что это не на что не влияет.)) или я не прав?
Добавлено after 8 hours 20 minutes 33 seconds: Друзья, помогите пожалуйста. Стою на асфальте в лыжи обутый то ли лыжи не едут, то ли я стебанутый...
в общем, почти все работало. занимался отладкой уже на железе.... и тут как-то раз и перестало... вообще перестало..... то ли в проге где-то накосячил, то ли схему на макетке неправильно собрал...ТРИ атмеги не работают......у дочи др через 10 дней, боюсь, без вашей помощи не обойдусь....а еще плату травить....
теперь много буковок, кому лень читать ,я не обижусь, просто почти отчаялся....
1. шью китайским USBASP. 2. микруху ставлю в китайскую платочку с мин. обвязкой Спойлер 3. МК пишется, верификация без ошибок. но на всех трех микрухак на PС4 почему-то всегда висит 0". Остальные подтяжки работают. если подключить кноки в соответствии со схемой, то мк на нажатие кнопок не реагирует. 3. не знаю могло ли повлиять, но несколько раз я вхерачивал питание в плату, когда был подключен разъем для программирования т.е. 5в с USB и 5в с БП. 5. пробовал сегодня записать эти же контроллеры программатором AUTOPROG, но изменений нет, купил новый МК, но еще не пробовал записать его. 6. если закоментить часть текста проги (условия где встречается PC4) и строчку "sei(); " то прога частично начинает работать. Ну и самое интересное 7. в PROTEUS все работает как надо
что я могу делать не так? ((
схема Спойлер текст программы(коменты могут не соответствовать из-за копипаста): Спойлер#include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h>
вообще перестало..... то ли в проге где-то накосячил,
Именно для таких случаев придумана "система контроля версий" или хотя бы ежедневные бекапы проекта - чтобы всегда можно было откатиться на шаг назад или до прошлого рабочего состояния.
Не вижу кварца у атмеги. Правильно ли она сконфигурирована (FUSE) на работу от внутреннего RC-генератора? Подано ли питание не только на VCC, но и на AVCC?
Какая у тебя стоит ATMEGA? На схеме фиг разглядишь, по распиновке смахивает на DIP-40 корпус Atmaga32 или 8535. Если Аtmega32, то на PC2-PC5 висит JTAG. Смотри FUSE-бит "JTAGEN" - по умолчанию он активен. "Default Value 0 (programmed, JTAG enabled)"
Как я уже говорил - не люблю повторяться. (с) Но, на кой хрен в прерывании задержка?! Попробовать PB0 и PB2 подтянуть резистором снаружи, всё же может внутренней подтяжки не хватать. Это, кстати, и к PC4 относится - если подключить внешнюю подтяжку, там будет "1"? При условии, что там точно нет JTAG.
Угу, если "не влияет" означает постоянные периодические срабатывания Цитата: PORTA |= 1<<7; //погасить семисегментник PORTB = 0b11111111; //погасить светофор PORTD |= 1<<7;//выключить Свет
Я понял о чем Вы говорите, но не пойму что Вы этим хотите сказать. Физически же ничего не будет происходить. крутится и крутится эта переменная... что-то нажали ---> прошло время ---> "PORTB = 0b11111111" --> все погасло , мы ничего не делаем и через время произошло тоже самое,т.е. как было погашено так и осталось. Если Вы имеете ввиду что это не по фэншую, тогда надо переделывать алгоритм, чтоб как-то счетчик останавливался на время простоя, на это у меня ума не хватает). максиму что можно от меня добиться это добавить условие в прерывание типо: if (<все включено>) {<все выключить>;} else {} Если так правильнее то сделаю, только скажите))
mas123 писал(а):
Именно для таких случаев придумана "система контроля версий" или хотя бы ежедневные бекапы проекта - чтобы всегда можно было откатиться на шаг назад или до прошлого рабочего состояния.
Обязательно учту на будущее!
mas123 писал(а):
Не вижу кварца у атмеги. Правильно ли она сконфигурирована (FUSE) на работу от внутреннего RC-генератора? Подано ли питание не только на VCC, но и на AVCC?
Какая у тебя стоит ATMEGA? На схеме фиг разглядишь, по распиновке смахивает на DIP-40 корпус Atmaga32 или 8535. Если Аtmega32, то на PC2-PC5 висит JTAG. Смотри FUSE-бит "JTAGEN" - по умолчанию он активен. "Default Value 0 (programmed, JTAG enabled)"
Atmega16. работает от внутреннего кварца Вы ЧЕЛОВЕК! Спасибо огромное! действительно проблемы была в FUSE, галочка JTAG... в самом начале я её убирал, и настройки сохранились, а потом начал работать на другом компе и там прога с фьюзами по умолчанию и галочка стоит((((( в общем как Вы и написали.
mas123 писал(а):
Hiperboloyd писал(а): ISR (INT2_vect) { _delay_ms(50); Как я уже говорил - не люблю повторяться. (с)
Убрал!
Всё вроде заработало! еще раз огромное спасибо! если объясните первый вопрос, по поводу выключения и переменной off, как там лучше сделать - будет очень здорово), ну а если надоело ковыряться моей фигне, ничего страшного!
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
можно вместо: off ; написать: off =(~off)? 1:0; если офф не 0xff к нему прибавится 1, иначе 0. так переменная дойдёт до 255 и там и останется. т.е. в условие сброса надо вписать 254 а не 255.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Физически же ничего не будет происходить. крутится и крутится эта переменная...
Если вначале включается что-то из серии "погасить по таймеру", а лишь потом обнуляется "off", то возможна ситуация мгновенного выключения включенного, т.к. таймер "сработал".
тогда надо переделывать алгоритм, чтоб как-то счетчик останавливался на время простоя, на это у меня ума не хватает). максиму что можно от меня добиться это добавить условие в прерывание типо:
Один из вариантов решения - принять какое-то значение "off" как "остановлено". Например, если off == 255, то в прерывании эту переменную не увеличивать. В значение 255 переводить в прерывании, когда отработают все "выключено". А то и само оно до этого значения добежит и остановится.
можно вместо: off ; написать: off =(~off)? 1:0; если офф не 0xff к нему прибавится 1, иначе 0. так переменная дойдёт до 255 и там и останется. т.е. в условие сброса надо вписать 254 а не 255.
спасибо, но это кажется сложновато для меня
mas123 писал(а):
Один из вариантов решения - принять какое-то значение "off" как "остановлено". Например, если off == 255, то в прерывании эту переменную не увеличивать. В значение 255 переводить в прерывании, когда отработают все "выключено". А то и само оно до этого значения добежит и остановится.
чтобы off постоянно не крутилось, можно просто добавить условие: СпойлерISR( TIMER1_OVF_vect ) { if ( off < 29) { off++; if (8 == off) { PORTD &= ~(1<<6); //Выключить розетку (Вентилятор) } if (15 == off) { PORTA |= 1<<7; //погасить семисегментник PORTB = 0b11111111; //погасить светофор } if (28 == off) { PORTD |= 1<<7;//выключить Свет } }
} но я так понимаю это не решит проблему:
mas123 писал(а):
возможна ситуация мгновенного выключения включенного, т.к. таймер "сработал".
блин, я забыл что сайт "плюсы" съедает вместо off++; off+=(~off)? 1:0; скобки и вопрос это сокращённая запись ветвления, читается так: если в скобках истина, то выражение берётся до двоеточия, если ложно — после. ~ - инверсия побитовая (0xff обернётся в 0x00 и даст ложь, всё остальное даст истину. получаем -если офф!=255 выражение будет 1, и её прибавим к офф иначе прибавим 0.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Почему же? Решит. При обнуление таймера после установки "включить" - "off" будет наращиваться, а когда дотикает до нужного значения - выключит. Зато можно быть уверенным, что в момент установки "включить" таймер не сработает "вот-вот" на отключение.
Вам нужно пересмотреть всю программу. Но сначала я хотел бы узнать, что вы сейчас хотите сделать. Смотрю схема у вас новая.
Здравствуйте, в общем все готово, цель достигнута и моя первая программа работает в допустимых пределах(для детской игрушки). Последняя проблема возникла «все перестало работать», я выложил текст всей программы, но ребята подсказали , что дело во фьюзах. Так же Сделали некоторые замечания. Т.к. Я решил что си - это интересно, то попросил объяснить, как что исправить, вот в принципе и все))
блин, я забыл что сайт "плюсы" съедает вместо off++; off+=(~off)? 1:0; скобки и вопрос это сокращённая запись ветвления, читается так: если в скобках истина, то выражение берётся до двоеточия, если ложно — после. ~ - инверсия побитовая (0xff обернётся в 0x00 и даст ложь, всё остальное даст истину. получаем -если офф!=255 выражение будет 1, и её прибавим к офф иначе прибавим 0.
Примерно понял, очень интересный вариант, обязательно попробую. Спасибо, Вам!
Добавлено after 4 minutes 32 seconds:
mas123 писал(а):
Почему же? Решит. При обнуление таймера после установки "включить" - "off" будет наращиваться, а когда дотикает до нужного значения - выключит. Зато можно быть уверенным, что в момент установки "включить" таймер не сработает "вот-вот" на отключение.
Ну значит со спокойной душой травлю плату! Ещё раз большое спасибо за поддержку и Советы
Спасибо ВСЕМ большое. Дочке понравилось! замок пока не ставил - рановато. позже программа будет немного переделана и из светофора появится кодовый замок для синей двери. выключатель зажигает свет в домики и синий LED в окне вентилятора. Розетка включает сам вентилятор. телефон - просто цифры. Вот такая штука получилась: Спойлер
Прикольно получилось)) А ты молодец. Не все тут могут похвастаться законченным устройством)) Кстати.. можно добавить ещё кучу функций.. так сказать на будущее..))
Прикольно получилось)) А ты молодец. Не все тут могут похвастаться законченным устройством)) Кстати.. можно добавить ещё кучу функций.. так сказать на будущее..))
Спасибо) я думал про кучу функций, но признаться домик мне поднадоел) как дочь подрастет подключу электрозамок и думаю на этом покончить) для меня это был превосходный опыт работы с деревом и МК. ребятам за помощь я очень благодарен!
Hiperboloyd - отлично! Я тоже делал дочке бизиборд, но он без электронных приблуд, все в кучу не стал мешать. Хочу сделать второй бизик и как раз электронный.. Скажу спасибо за схему и програмку с подробностями
Hiperboloyd - отлично! Я тоже делал дочке бизиборд, но он без электронных приблуд, все в кучу не стал мешать. Хочу сделать второй бизик и как раз электронный.. Скажу спасибо за схему и програмку с подробностями
Вероятнее всего уже поздно! но для будущих поколений , так сказать, выложу.
Прошу прощения что так прервал всё. на работе ноут озяб. что-то восстановилось. что-то с флешек собрал, что-то дома было. в итоге не смог найти окончательный вариант и забыл/забил. но вот что-то копался и кажется это оно. В протеусе все работает, кроме таймера автоматического выключения, но так и было, в железе всё норм.
Повторяю: Вероятно это последний вариант, но возможно и нет. Это означает что могут быть ошибки. в Протеусе вроде работает. Спойлер#include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h>
ISR( TIMER1_OVF_vect ) { if ( off < 29) { off++; if (8 == off) { PORTD &= ~(1<<6); //Выключить розетку (Вентилятор) } if (15 == off) { PORTA |= 1<<7; //погасить семисегментник PORTB = 0b11111111; //погасить светофор } if (28 == off) { PORTD |= 1<<0;//выключить Свет } }
}
ISR (INT2_vect) {
_delay_ms(50); off=0; cifra = TCNT0; //переменной присвоить значение счетчика if (cifra>0 && cifra<11) // если цифра >0 и <10 { PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру cifrakn=cifra; cifra=0; //обнулить переменную } else { if (11 == cifra) //если переменная равна 10 { cifra=1; //обнулить переменную PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру 0 } } PORTA &= ~(1<<7);// зажечь семисегментник //cifra=0; //обнулить переменную ВРОДЕ БЕЗ ЭТОГО РАБОТАЕТ TCNT0 = 0; }
int main(void) { DDRA = 0b11111111; // порты на выход PORTA = 0b11111111; // подтягиваем к 1 DDRB = 0b11111010; PORTB = 0b11111111; //подтягивем к 1 DDRC = 0b00000000; PORTC = 0b11111111; // подтягиваем к 1 DDRD = 0b11100001; PORTD = 0b10011111;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения