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


только светодиоды не бегут. а хаотично мигают. что не так?
- Реклама
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: attiny13 таймер
Попробуй заменить таймер и функцию wait() на
Поймешь виноват таймер или переменная temp (действия с ней)
Код: Выделить всё
#define F_CPU 9600000
#include <util/delay.h>
int main(void)
{
...
while(1)
{
....
_delay_ms(200);
}
}-
alexander_student
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Вс июл 28, 2013 11:04:23
- Откуда: Курган, Боровское(Казахстан)
- Контактная информация:
Re: attiny13 таймер
с таймером косяк ща буду разбираться))) ток сразу не подсказывайте сам хочу додуматьeess9 писал(а):виноват таймер
-
alexander_student
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Вс июл 28, 2013 11:04:23
- Откуда: Курган, Боровское(Казахстан)
- Контактная информация:
Re: attiny13 таймер
нашел ошибку, все работает) вот код мож кому пригодиться
Код: Выделить всё
#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 таймер
Ну это как то конкретно в лоб решение. зачем тогда таймер? можно просто было delay_ms все равно ничего во время ожидания нельзя делать.
Может прерываниями воспользоваться?
Может прерываниями воспользоваться?
- Реклама
-
alexander_student
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Вс июл 28, 2013 11:04:23
- Откуда: Курган, Боровское(Казахстан)
- Контактная информация:
Re: attiny13 таймер
Да я так сказать теорию закрепляю. По уроку сделал, работает. Теперь сам попробовал, без подсказок. И с прерываниями попробую еще. Ща ШИМ буду мучать)
-
vAv
- Прорезались зубы
- Сообщения: 221
- Зарегистрирован: Пн июн 13, 2011 20:04:59
- Откуда: Новочебоксарск
- Контактная информация:
Re: attiny13 таймер
Чувствую щас родится очередной таймер-терморегулятор. Чтобы не как у всех - он будет для подогрева пива в зимнее время. 
Re: attiny13 таймер
Тоже проблема с таймером
TIMSK0 |= 1<<TOIE0;
TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);
sei();
Счет идет, но не срабатывает прерывание
ISR(TIMER0_OVF_vect)
{
PORTB ^= 1<<4;
}
TIMSK0 |= 1<<TOIE0;
TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00);
sei();
Счет идет, но не срабатывает прерывание
ISR(TIMER0_OVF_vect)
{
PORTB ^= 1<<4;
}
Re: attiny13 таймер
разобрался
ISR(TIM0_OVF_vect)
ISR(TIM0_OVF_vect)
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: attiny13 таймер
Эта запись не имеет смысла
Код: Выделить всё
TCCR0B |= (0 << CS02)Re: attiny13 таймер
eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет.
Это уже не раз всплывало.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: attiny13 таймер
Код: Выделить всё
#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 скачивания
Иван Сусанин - первый полупроводник 
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: attiny13 таймер
Удобно и имеет смысл, если писатьKavka писал(а):eess9, так удобно при написании/отладке программы. Чтобы не стирать/переписывать - записываешь конструкцию со всеми участвующими битами, и просто ставишь нолики/единички в нужных местах. Ну а компилятор уже разбирается - имеет это смысл или нет.Это уже не раз всплывало.
TCCR0B = (0 << CS02) | (1 << CS01) | (1 << CS00);
но так придется прописать все необходимые для установки в 1 биты.
Зато не будет легкого изумления, когда что то не так работает.
Если писать |= то при многократной записи (отладке) можно случайно забыть, что он уже установлен и спотыкаться, изумленно ходя кругами, об одни и те же грабли.


