Страница 1 из 3
Вибротаймер на Attiny13
Добавлено: Пт окт 19, 2012 00:46:44
mypkot
Нашел схему вибротаймера на этом сайте radiokot.ru/circuit/digital/home/71/.
Много лишнего показалось. И т.к. не разбираюсь в мк, но хотелось бы сделать напоминалку на 1 час (бесконечный цикл)
Решил упростить до безобразия. Схема ниже.
Возможно переделать чтобы был сигнал каждый час (на вибротаблетку), предварительно поставив маломощный транзистор.
прошивка для микроконтроллера написана в среде BASCOM-AVR.
Исходник прошивки:
$regfile = "attiny13.dat"
Config Portb = Output
Do
Portb = 255
Waitms 100
Portb = 0
Waitms 100
Loop
End
Возможно это сделать?
Re: Attiny13
Добавлено: Пт окт 19, 2012 06:54:59
pyzhman
На словах вибратор, в схеме светодиод. Чего делать-то? Как отключать когда сработало?
Re: Вибротаймер на Attiny13
Добавлено: Пт окт 19, 2012 16:33:10
mypkot
http://radiokot.ru/circuit/digital/home/71/
можно заменить сдесь мк Attiny12 на Attiny13A ?
Re: Вибротаймер на Attiny13
Добавлено: Пт окт 19, 2012 18:15:03
ChipKiller
Много лишнего показалось. И т.к. не разбираюсь в мк .... Решил упростить до безобразия.
.... можно, но если
"не разбираюсь в мк" зачем выкидывать кнопку? .... разве что для
"...безобразия" 
Re: Вибротаймер на Attiny13
Добавлено: Пт окт 19, 2012 18:48:13
mypkot
Доброго времени суток
Написал примитивную программу в AVR Studio на Си
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF;
while (1==1)
{
PORTB = 0b11111111;
_delay_ms(2000);
PORTB = 0b00000000;
_delay_ms(900000);
}
}
, залил в прошивку на Proteus, вот что получилось рис ниже.
Вопрос будет работать в реале, если заменю светодиод виброкнопкой и c учетом что сигнал будет каждый час (3600000 мс) ?
Re: Вибротаймер на Attiny13
Добавлено: Пт окт 19, 2012 22:42:41
спящий
К ресет ненадо прикладывать питание - это же сброс контроллера.
А вот это что? while (1==1), или вот так while (1) я в СИ неочень.А вот _delay_ms(2000) туда любое число вставлять можно?
Re: Вибротаймер на Attiny13
Добавлено: Сб окт 20, 2012 13:19:30
mypkot
While (1==1) бесконечный цикл
насчет _delay_ms и сколько можно указывать я даже незнаю
Переписал код
Код: Выделить всё
#define F_CPU 12800L
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF;
while (1==1)
{
PORTB = 0b11111111;
_delay_ms(2000);
PORTB = 0b00000000;
_delay_ms(1800000);
}
}
т.е. что бы каждые пол часа был сигнал. В Протеусе выполняется каждые 24 мин. (потеря 2 мин на 10 мин.)
если поставлю на каждый час , то сигнал будет происходить каждые 48 мин.
У меня все тот же вопрос, в реальной жизни будет работать ???
Re: Вибротаймер на Attiny13
Добавлено: Пн окт 22, 2012 21:52:39
vitalik_1984
спящий писал(а):К ресет ненадо прикладывать питание - это же сброс контроллера.
С такими комментариями запинают.Действительно ресет это сброс контроллера, но сброс низким уровнем.Значит при отключеном ресет вполне вероятно, что Мк посчитает это низким уровнем.Так что подключать к плюсу нужно, но через резистор 1кОм -10кОм чтобы была возможность внутрисхемного программирования.Пусть на этом Мк это и не нужно, но для общего развития пригодится.
спящий писал(а):
А вот это что? while (1==1), или вот так while (1) я в СИ неочень.А вот _delay_ms(2000) туда любое число вставлять можно?
while(условие для повторения цикла) если в результат в условии не равен нулю, цикл повторяется.Соответственно 1 не может быть нулем, значит цикл будет продолжаться бесконечно.
В делей можно использовать любые целые числа, если они большие, то точность снижается, и если за допустимый предел выходит, по идее тоже должно предупредить.
Переменные не получится запихать.
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 05:36:25
mypkot
Я немножко продвинулся и стало интересно ). Светодиодом моргать научился, а вот управлять клавишами нет =)
Может кто поможет организовать такую програмку:
две кнопки, два диода
если нажимаешь одну кнопку диод мограет 0,5 сек., каждые 10 секунд;
если нажимаешь вторую, второй диод моргает (0,5 сек) через 4, потом 8 и 16 секунд = цикл повторяется.
Вроде можно организовать с помощю циклов, только как ума не прилажу.
мяу, если не ответите я не обижусь и буду сам пытаться, хотя многое перепробывал %))
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 11:47:21
vitalik_1984
Все просто делаем прерывание по спаду фронта меняем там флаги разрешения одного цикла и запрета второго.
Далее пишем в таком духе
Код: Выделить всё
while (i&flag1){
////тут выполнение первого цикла
i++;
}
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 20:33:13
mypkot
появилась окончательная задача.
Без кнопок, 2 светодиода.
Один моргает каждые 10 сек., второй каждые 5 мин.. Как это организовать в программном коде, пробывал через for кучу ошибок мне пишет, с флагами тоже неочень понятно.
еще непонятно как задать второй порт, один PORTB , а др. как указать?
Всем хорошего дня !!!:)))
в Code Avr написал вот такую программу
while (1)
{
PORTB.0 = 1;
delay_ms(300);
PORTB.0 = 0;
delay_ms(7500);
PORTB.1 = 1;
delay_ms(1000);
PORTB.1 = 0;
delay_ms(10000);
}
}
запустил в протеусе.
1й светодиод мигнул на 1й,18,36,55 секунде
2й на 8,26
организация в силе один должен блымать каждые 10 сек., второй каждые 5 мин.
может быть я что то не так делаю
ЭВРИКА!!!
PORTB.0 = 1;
delay_ms(300);
PORTB.0 = 0;
delay_ms(10000);
PORTB.0 = 1;
delay_ms(300);
PORTB.0 = 0;
delay_ms(10000);
PORTB.0 = 1;
delay_ms(300);
.... и так 30 раз (как раз ~5 мин.), потом...
PORTB.1 = 1;
delay_ms(1000);
PORTB.1 = 0;
delay_ms(10000);
}
}
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 23:06:01
vitalik_1984
Чтот это не совсем похоже на начальную тему.
И задание не окончательное.
Непонятна длительность моргания каждого диода.
Вообще текст прост
Код: Выделить всё
#define LED1_COUNT_MAX 10
#define LED2_COUNT_MAX 300
unsigned char led1_count;
unsigned int led1_count;
//Моргание первым диодом
void Led_1_blink(void){
PORTB.0 = 1;
delay_ms(300);
PORTB.0 = 0;
led1_count=0;
}
//Моргание вторым диодом
void Led_2_blink(void){
PORTB.1 = 1;
delay_ms(300);
PORTB.1 = 0;
led2_count=0;
}
while (1)
{delay_ms(1000);
led1_count++;
led2_count++;
if (led1_count>=LED1_COUNT_MAX)Led_1_blink;
if (led2_count>=LED2_COUNT_MAX)Led_1_blink;
}
Если нужна бОльшая точность, нужно использовать таймер.
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 23:26:33
просто КОТ
Можно отметиться?!
Re: Вибротаймер на Attiny13
Добавлено: Вс ноя 04, 2012 23:35:18
mypkot
Спасибо всем за ответы, но я только что спалил мк.
Прошивал Фьюзы на Аttiny13 в режиме 128кГц, ругнулся, умер... земля ему пухом.
Всем спасибо, разживусь на новый продолжу. Хорошего вечера

Re: Вибротаймер на Attiny13
Добавлено: Пн ноя 05, 2012 15:43:38
просто КОТ
Я когда первый МК прошил (а это именно Тини13) всё заработало, с первого раза. Потом нечаянно питание с 3В до 12В повысил. МК даже не успел ничего сделать. Яркая вспышка всех светодиодов и всё погасло. Так я сжог первый МК...
Re: Вибротаймер на Attiny13
Добавлено: Сб ноя 10, 2012 21:04:19
mypkot
Вечер добрый, купил я все таки новый мк13А, продолжим =)))
Есть проблема, код программы
Код: Выделить всё
while (1)
{ сама программа длинная
if (PINB.3==1) // кнопка
{
PORTB.1 = 1;
delay_ms(100000);
PORTB.1 = 0;
delay_ms(100);
}}}
Вопрос, если программа маленькая, то при нажатии всё выполняется, но если большая, - нет выполнения.
Как организовать чтобы программа прерывалась нажатием на кнопку и выполнялась другая программа?
Re: Вибротаймер на Attiny13
Добавлено: Сб ноя 10, 2012 21:38:19
просто КОТ
Применить прерывания.
Re: Вибротаймер на Attiny13
Добавлено: Сб ноя 10, 2012 22:56:40
mypkot
while (1)
{ программа}
interrupt [1] void adc_isr(void) // непонятно что сдесь писать interrupt [?] и сдесь void ? (void)
{
if (PINB.3==1) // кнопка
PORTB.1 = 1;
delay_ms(100000);
PORTB.1 = 0;
delay_ms(100);
}
}}
Re: Вибротаймер на Attiny13
Добавлено: Сб ноя 10, 2012 23:39:22
m.ix
Замечательная вещица.
А возможно ли увеличить время до 3 минут.
И время повтора через каждые 10 - 20 - 40 - 60 минут пока не отключишь или не переведёшь в дежурку.
А то на работе иногда кемаю а вот что то услышать не могу.
А то приматал бы к уху эту бибикулку (активный бузер) вот его прекрасно слышу.
для тини13
Re: Вибротаймер на Attiny13
Добавлено: Сб ноя 10, 2012 23:56:06
mypkot
в AVR Studio на Си делал так:
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0xFF;
while (1==1)
{
PORTB = 0b11111111;
_delay_ms(2000);
PORTB = 0b00000000;
_delay_ms(1800000);
}
Получалось каждые 24 минуты =). Жаль немогу много понять по таймерам, так бы подсказал .