Страница 1 из 1
attiny13 таймер
Добавлено: Пт авг 02, 2013 09:55:48
alexander_student
не давно начал изучать мк. решил собрать бегущие огни на тини13 с использованием таймера.
только светодиоды не бегут. а хаотично мигают. что не так?
Спойлер


Re: attiny13 таймер
Добавлено: Пт авг 02, 2013 10:18:18
eess9
Попробуй заменить таймер и функцию wait() на
Код: Выделить всё
#define F_CPU 9600000
#include <util/delay.h>
int main(void)
{
...
while(1)
{
....
_delay_ms(200);
}
}
Поймешь виноват таймер или переменная temp (действия с ней)
Re: attiny13 таймер
Добавлено: Пт авг 02, 2013 11:36:55
alexander_student
eess9 писал(а):виноват таймер
с таймером косяк ща буду разбираться))) ток сразу не подсказывайте сам хочу додумать

Re: attiny13 таймер
Добавлено: Пт авг 02, 2013 11:48:23
alexander_student
нашел ошибку, все работает) вот код мож кому пригодиться
Код: Выделить всё
#include <avr/io.h>
void wait1(void)
{
TCNT0=0;
while(TCNT0<250){};
}
int main(void)
{
unsigned char temp;
DDRB=0xFF;
PORTB=0x00;
TCCR0A=0x00;
TCCR0B=(1<<CS02)|(0<<CS01)|(0<<CS00);
while(1)
{
temp=0x80;
while (temp!=0)
{
PORTB=temp;
temp=temp>>1;
wait1();
}
}
}
Re: attiny13 таймер
Добавлено: Вс авг 04, 2013 05:49:21
vitalik_1984
Ну это как то конкретно в лоб решение. зачем тогда таймер? можно просто было delay_ms все равно ничего во время ожидания нельзя делать.
Может прерываниями воспользоваться?

Re: attiny13 таймер
Добавлено: Пн авг 05, 2013 08:55:06
alexander_student
Да я так сказать теорию закрепляю. По уроку сделал, работает. Теперь сам попробовал, без подсказок. И с прерываниями попробую еще. Ща ШИМ буду мучать)
Re: attiny13 таймер
Добавлено: Пн авг 05, 2013 09:11:14
vAv
Чувствую щас родится очередной таймер-терморегулятор. Чтобы не как у всех - он будет для подогрева пива в зимнее время.

Re: attiny13 таймер
Добавлено: Ср авг 07, 2013 14:38:08
airborne
Тоже проблема с таймером
TIMSK0 |= 1<<TOIE0;
TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);
sei();
Счет идет, но не срабатывает прерывание
ISR(TIMER0_OVF_vect)
{
PORTB ^= 1<<4;
}
Re: attiny13 таймер
Добавлено: Ср авг 07, 2013 15:02:05
airborne
разобрался
ISR(TIM0_OVF_vect)
Re: attiny13 таймер
Добавлено: Ср авг 07, 2013 16:02:40
eess9
Эта запись не имеет смысла
Re: attiny13 таймер
Добавлено: Ср авг 07, 2013 18:02:51
Kavka
eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет.

Это уже не раз всплывало.
Re: attiny13 таймер
Добавлено: Ср авг 07, 2013 21:35:54
Myp3ik
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
// отключаем компаратор
ACSR |= (1 << ACD);
// конфигурируем порт
DDRB = 0b011111;
PORTB = 0b000000;
// режим таймера CTC
TCCR0A |= (1 << WGM01);
// делитель частоты таймера 1024
TCCR0B |= (1 << CS02)|(1 << CS00);
// разрешаем прерывание от таймера
TIMSK0 |= (1 << OCIE0B);
// значение регистра сравнения (1000мс)
OCR0A = 125;
// разрешаем прерывания
sei();
while(1) {}
}
// обработчик прерывания по совпадению таймера
ISR (TIM0_COMPB_vect)
{
if ((PORTB >>= 1) < 0b000001) PORTB = 0b010000;
}
Re: attiny13 таймер
Добавлено: Вс авг 11, 2013 22:33:31
vitalik_1984
Kavka писал(а):eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет.

Это уже не раз всплывало.
Удобно и имеет смысл, если писать
TCCR0B = (0 << CS02) | (1 << CS01) | (1 << CS00);
но так придется прописать все необходимые для установки в 1 биты.
Зато не будет легкого изумления, когда что то не так работает.
Если писать |= то при многократной записи (отладке) можно случайно забыть, что он уже установлен и спотыкаться, изумленно ходя кругами, об одни и те же грабли.
