attiny13 таймер

Обсуждаем контроллеры компании Atmel.
Ответить
alexander_student
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс июл 28, 2013 11:04:23
Откуда: Курган, Боровское(Казахстан)
Контактная информация:

attiny13 таймер

Сообщение alexander_student »

не давно начал изучать мк. решил собрать бегущие огни на тини13 с использованием таймера.

только светодиоды не бегут. а хаотично мигают. что не так?
СпойлерИзображениеИзображение
Реклама
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Re: attiny13 таймер

Сообщение eess9 »

Попробуй заменить таймер и функцию wait() на

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

#define F_CPU 9600000

#include <util/delay.h>

int main(void)
{
        ...
        while(1)
       {
             ....
             _delay_ms(200);
       }
}
Поймешь виноват таймер или переменная temp (действия с ней)
Реклама
alexander_student
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс июл 28, 2013 11:04:23
Откуда: Курган, Боровское(Казахстан)
Контактная информация:

Re: attiny13 таймер

Сообщение alexander_student »

eess9 писал(а):виноват таймер
с таймером косяк ща буду разбираться))) ток сразу не подсказывайте сам хочу додумать :)
alexander_student
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс июл 28, 2013 11:04:23
Откуда: Курган, Боровское(Казахстан)
Контактная информация:

Re: attiny13 таймер

Сообщение 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();
		}

	 }
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: attiny13 таймер

Сообщение vitalik_1984 »

Ну это как то конкретно в лоб решение. зачем тогда таймер? можно просто было delay_ms все равно ничего во время ожидания нельзя делать.
Может прерываниями воспользоваться? ;)
Реклама
alexander_student
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс июл 28, 2013 11:04:23
Откуда: Курган, Боровское(Казахстан)
Контактная информация:

Re: attiny13 таймер

Сообщение alexander_student »

Да я так сказать теорию закрепляю. По уроку сделал, работает. Теперь сам попробовал, без подсказок. И с прерываниями попробую еще. Ща ШИМ буду мучать)
Реклама
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: attiny13 таймер

Сообщение vAv »

Чувствую щас родится очередной таймер-терморегулятор. Чтобы не как у всех - он будет для подогрева пива в зимнее время. :))
airborne
Открыл глаза
Сообщения: 40
Зарегистрирован: Сб ноя 12, 2011 17:59:32

Re: attiny13 таймер

Сообщение airborne »

Тоже проблема с таймером

TIMSK0 |= 1<<TOIE0;
TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);
sei();

Счет идет, но не срабатывает прерывание
ISR(TIMER0_OVF_vect)
{
PORTB ^= 1<<4;
}
airborne
Открыл глаза
Сообщения: 40
Зарегистрирован: Сб ноя 12, 2011 17:59:32

Re: attiny13 таймер

Сообщение airborne »

разобрался
ISR(TIM0_OVF_vect)
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Re: attiny13 таймер

Сообщение eess9 »

Эта запись не имеет смысла

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

TCCR0B |= (0 << CS02)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: attiny13 таймер

Сообщение Kavka »

eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет. :)) Это уже не раз всплывало.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: attiny13 таймер

Сообщение 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;
}

Вложения
switch-proteus2.rar
(13.46 КБ) 303 скачивания
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: attiny13 таймер

Сообщение vitalik_1984 »

Kavka писал(а):eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет. :)) Это уже не раз всплывало.
Удобно и имеет смысл, если писать
TCCR0B = (0 << CS02) | (1 << CS01) | (1 << CS00);
но так придется прописать все необходимые для установки в 1 биты.
Зато не будет легкого изумления, когда что то не так работает.
Если писать |= то при многократной записи (отладке) можно случайно забыть, что он уже установлен и спотыкаться, изумленно ходя кругами, об одни и те же грабли. :)))
Ответить

Вернуться в «AVR»