Страница 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
Эта запись не имеет смысла

Код: Выделить всё

TCCR0B |= (0 << CS02)

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 биты.
Зато не будет легкого изумления, когда что то не так работает.
Если писать |= то при многократной записи (отладке) можно случайно забыть, что он уже установлен и спотыкаться, изумленно ходя кругами, об одни и те же грабли. :)))