Страница 1 из 2
помогоите отладить таймер
Добавлено: Вт май 03, 2011 23:05:14
vovik15
здравствуйте! есть контроллер ATTINY861V
ну так вот, написал к нему программу,которая считает от 99 до 0,когда 0,снова 99 и так по кругу.
отлаживаю в протеусе,но что то сильно глючит индикация .
выкладываю код и во вложении полный проект протеуса, и CVAVR
спасибо за помощ!
Код: Выделить всё
#include <tiny861.h>
#include <delay.h>
// массив констант под индикаторы с общим анодом
const char arr_seg[]= {3,159,37,13,153,73,65,31,1,9};
char k1,k2; //под разряды
char count;
void rasclad (unsigned char tmp)
{
k1 = k2 =0;
while (tmp>=10) { k1++; tmp = tmp-10; }
k2 = tmp;
}
void main(void)
{
PORTA =0; //чистим порт а
DDRA =255;//все линии на выход
PORTB =0; //чистим порт в
DDRB =255;//все линии на выход
count = 99;//устан. начальное значение
while (1)
{
if(0 == count) count = 99; else count--;
rasclad (count); //разложить по сегментам
PORTB.2= 0; PORTA = arr_seg [k1];delay_ms(20); PORTB.2= 1;
PORTB.3= 0; PORTA = arr_seg [k2];delay_ms(20); PORTB.3= 1;
};
}
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 06:29:28
pyzhman
Смотрите, что у вас происходит в основном цикле: 20 мсек отображаем один индикатор, следующие 20 мсек другой. После этого берем следующее значение по rasclad (count) и опять выводим. Т.е. каждые 40 мсек значение меняется. Увидеть что либо ну просто невозможно, т.к. каждые 40 мсек значение count уменьшается на 1. Программа-то, конечно, считает и показывает, но нормальному человеку эта индикация ничего не дает.
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 10:17:31
ChipKiller
тема
помогоите отладить таймер - а где же здесь таймер ??? может
???
PS. вставьте индикацию в прерывание таймера, иначе вся программа будет сплошной
delay_ms
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 17:36:33
vovik15
дело в том ,что я скачал датащит на этот самый tiny861 но там кроме распиновки вообще ничего нет.
вы не подскажете где можно прочитать ? или как правильно индикацию с помощью таймера организовать?
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 17:53:42
pyzhman
http://alldatasheet.com в строке поиска наберите ATtiny861.
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 17:56:36
clawham
представляю какими были бы даташиты если б в них хранились все вещи которые можно на этом МК сделать
http://tinyurl.com/6flh82l
помоему там более чем достаточно даже в первой же ссылке
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 18:12:57
vovik15
я знаю как работает динамическая индикация!!!
я немогу найти описание регистров и всего остального. датащит я качал на alldatashet в нем ничего непонятно
сами посмотрите
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 18:49:13
DARKMAVR
на седьмой странице описание регистров, на девятой и десятой их использование
Re: помогоите отладить таймер
Добавлено: Ср май 04, 2011 20:44:05
ChipKiller
vovik15 писал(а):датащит я качал на alldatashet в нем ничего непонятно сами посмотрите
... а что Atmel "загнулся" ?
http://www.atmel.com/dyn/resources/prod ... oc2588.pdf
Re: помогоите отладить таймер
Добавлено: Чт май 05, 2011 08:27:10
murzila
vovik15 писал(а):датащит я качал на alldatashet в нем ничего непонятно сами посмотрите
Искать документацию, господин студент, нужно прежде всего у производителя чипа. Выбирайте:
http://www.atmel.com/dyn/products/docum ... ily_id=791
Re: помогоите отладить таймер
Добавлено: Чт май 05, 2011 18:00:52
vovik15
по документации попытался настройить прерывания по переполнению,но таймер не срабатывает. помогите пожалуйсто
Код: Выделить всё
#include <tiny861.h>
#include <delay.h>
// массив констант под индикаторы с общим анодом
const char arr_seg[]= {3,159,37,13,153,73,65,31,1,9};
char k1,k2; //под разряды
char count;
void podgot (void);
// Прерывание переполнения таймера 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.0= 0;
PORTB.0= 1;
}
void rasclad (unsigned char tmp)
{
k1 = k2 =0;
while (tmp>=10) { k1++; tmp = tmp-10; }
k2 = tmp;
}
void main(void)
{
podgot();
while (1)
{
if(0 == count) count = 99; else count--;
rasclad (count); //разложить по сегментам
PORTB.2= 0; PORTA = arr_seg [k1];delay_ms(20); PORTB.2= 1;
PORTB.3= 0; PORTA = arr_seg [k2];delay_ms(20); PORTB.3= 1;
};
}
void podgot (void)
{
PORTA =0; //чистим порт а
DDRA =255;//все линии на выход
PORTB =0; //чистим порт в
DDRB =255;//все линии на выход
count = 99;//устан. начальное значение
//подготовка таймера 0
TIMSK=(1<<TIFR);//разрешение прерывания при переполнении Timer0
TCCR0A = 0x00; //тут WGM00 установит режим работы Normal а TCW0 восьмибитный режим
TCCR0B=0;
TCNT0H=0x00; //обнуление счетных регистров
TCNT0L=0x00; //обнуление счетных регистров
OCR0A=0x00; //регистр срвпадения (*по нему можно прервание)
OCR0B=0x00; //регистр срвпадения
#asm("sei"); //разрешаем прерывания глобально
}
Re: помогоите отладить таймер
Добавлено: Чт май 05, 2011 19:04:40
clawham
TCCR0A = 0x00 - означает нет тактированию таймеру
Re: помогоите отладить таймер
Добавлено: Чт май 05, 2011 20:54:37
vovik15
а как сделать тактирование от внутреннего генератора?
Re: помогоите отладить таймер
Добавлено: Чт май 05, 2011 21:10:37
clawham
TCCR0B=0x01; это прямое тактование частотой системы
TCCR0B=0x02; это делить на 8 системную частоту
...
в даташите
http://www.atmel.com/dyn/resources/prod ... oc2588.pdf на странице 85 всё прекрасно расписано
Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 08:11:01
vovik15
перешел на tiny2313 ,так как по нему информации больше
настроил таймер вот так
//настройка таймера 0
TCNT0=1; //счетный регистр
OCR0A=0x00; //регистры сравнения
OCR0B=0x00;//регистры сравнения
TCCR0A = 0x00;
TCCR0B=0x01;// это прямое тактование частотой системы
//TCCR0B=0x02; это делить на 8 системную частоту
#asm("sei"); //разрешаем прерывания глобально
нет прерываний от него
кстати почемуто codevisoon ругаеться на запись такого вида
TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 08:39:43
clawham
помоему информации по данным МК просто завались и ровно столько сколько нужно а главное - ровно одинаково - ДАТАШИТ! там есть ВСЁ....а в КОдВижне ещё и Визард...там вообще всё проще некуда
но...дело за Вами...
ругаться может по двум причинам - 1) работа с 16 битными переменными принуждает использовать ИНТЫ (явно обозначенные) для задачи 1 со сдвигом ...по умолчанию работает оно с половинками этого регистра А и Б...
второе...он может просто не знать этих макросов...чтоб из даташита макросы работали гдето на авр123 был хидер и там было расписано всё по даташитным макросам...я ими никогда не пользовался..всегда юзаю или визард или сразу битмаску в виде 0b11011011 пишу... мне так проще понятней и наглядней...
Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 08:51:36
vovik15
любите вы начинающих пинать
ну покажите мне где написано как можно использовать прерывание от tmr0 ? где описание его регистров на русском языке? я весь нет перевернул. есть примеры исмпользования ,но они не компилируються.
а мне всего лиш нада настроить прервание по переполнению таймера с внутренним тактированием без предделителя.
Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 08:58:05
pyzhman
Ручками, батенька, ручками и головой! Терпение и труд все перетрут. Никто не пинает, легкие шлепки в нужном направлении - это да.
Остается поражаться нервной системе
clawham'а. Без криков, мата...

Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 09:09:25
vovik15
вот когда я выросту,стану большим и сильным я тоже всех посытать буду... в нужном направлении

Re: помогоите отладить таймер
Добавлено: Пт май 06, 2011 09:14:29
clawham
блин ну ЧТО НЕ ПОНЯТНОГО?????
я когда первый раз взял мегу 8 чтоб выдавить из неё ШИМ 4 канала и 6 программных каналов я вообще ничего не знал в МК и не держал их раньше в руках и разобрался в течение 5 минут...при этом английский знаю только на уровне читать даташыты

не говорю и не слушаю фильмы без перевода....
Вот к примеру Ваша задача!
Надо такт на внутреннюю частоту проца и прерывание по переполнению(оно будет вызываться каждые 256 тактов процессора!!!! тоесть там обработчик должен быть вообще мизерным!!!!
смотрим в даташыте
страница 73
TCCR0A - он нам весь не нужен там задаются режимы PWM и режимы выходных ножек..нам это всё не надо....
второй регистр
TCCR0B страница 76...
что мы там видим в расписании битов?
Bit 7 – FOC0A: Force Output Compare A нам не надо....мы не юзаем выхода
Bit 6 – FOC0B: Force Output Compare B аналогично
Bits 5:4 – Res: Reserved Bits - зарезервированны тоесть тоже нули
Bit 3 – WGM02: Waveform Generation Mode - аналогично нули ибо не делаем мы никаких вейвформ
Bits 2:0 – CS02:0: Clock Select - О!....выбор клока..тоесть частоты...то шо нада .... далее идёт ТАБЛИЧКО....страница 77 Table 41. Clock Select Bit Description
и О ЧУДО...мы видим там какие биты записать и что получим в тактовании
нам надо прямой клок системы - No prescaling - Оппа...а там уже ЕСТЬ это - 0 0 1 clkI/O/(No prescaling)
итого подитожив что получаем?
TCCR0A = 0x00
TCCR0B = 0x01
ВСЁ....таймер ПОШЕЛ на макс частоте(хотя это уже ошибка но ладно...)
теперь прерывания...
ищем регистр настройки прерываний(timer interrupt)
ОПпа...страница 78
Timer/Counter
Interrupt Mask
Register – TIMSK
и расписание БИТОВ!
сереньким закрашены биты не относящиеся к таймеру ноль
Bit 2 – OCIE0B: Timer/Counter0 Output Compare Match B Interrupt Enable - ноль ибо не сравниваем мы ничего
Bit 0 – OCIE0A: Timer/Counter0 Output Compare Match A Interrupt Enable аналогично ноль
Bit 1 – TOIE0: Timer/Counter0 Overflow Interrupt Enable - !!!! О!!! переполнение тимера 0...разве не то чо надо?
записываем битмаску для нашего таймера
0b00000010 ///
если у нас больше нет таймеров и их прерываний то просто эту маску запихиваем в TIMSK....
если есть...то нужно делать ИЛИ чтоб установить новые флажки разрешенных прерываний и не похерить старые...
TIMSK=TIMSK|0b00000010;
ВСЁ!