Страница 4 из 5
Re: Сопряжение дозиметра с МК.
Добавлено: Ср июл 11, 2012 16:39:17
просто КОТ
Кхем, я тут решил продолжить эксперименты, теперь всё сделал немного лучше и проще. Я убрал прерывания и работает оно теперь так: включилось, подало плюс на РВ.3, запустив генератор, посчитало импульсы с него (поступают на РВ.2) и зажгло один из светиков на РВ.0/РВ.1/РВ.4. Затем уснуло и спит до следующего включения резетом. И
кот код прилагаю соответственно. Вопрос -- правилен ли код?!
Код: Выделить всё
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
void maim(void)
{
DDRB=0b011011;
PORTB=0b10010;
MCUCR=0b00100010;
GTCCR=0b10000000;
asm("sei");
while (1)
{
PORTB=001000
TCCR0B=0b00000111;
_delay_ms(1000);
TCCR0B=0b00000000;
if (TCNT0>200)
{
PORTB=000001;
_delay_ms(2000)
PORTB=000000;
}
else if (TCNT0>300)
{
PORTB=000010;
_delay_ms(2000)
PORTB=000000;
}
else if (TCNT0>500)
{
PORTB=010000;
_delay_ms(5000)
PORTB=000000;
}
asm("sleep")
}
}
Re: Сопряжение дозиметра с МК.
Добавлено: Чт июл 12, 2012 10:31:57
просто КОТ
ЛЮДИ! Ай нид ё хелп!

Re: Сопряжение дозиметра с МК.
Добавлено: Чт июл 12, 2012 18:57:03
Ser60
Так в чем проблема собрать на макетке и попробовать? Тогда и ждать никого не надо будет.
Навскидку:
1. Режим сна не разрешен (бит7 MCUCR).
2. Зачем разрешать прерывния, если они не используются (нет обработчиков)?
3. У регистра GTCCR нет бита 7.
ПИШИТЕ КОММЕНТАРИИ В КОДЕ
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 13:06:30
просто КОТ
Код: Выделить всё
#define F_CPU 8000000 // Инициализация
#include <avr/io.h>
#include <util/delay.h>
void maim(void)
{
DDRB=0b011011;
PORTB=0b10010;
MCUCR=0b01000000;
GTCCR=0b10000000;
asm("sei");
{
PORTB=001000 // Запускаю генератор
TCCR0B=0b00000111; // Запускаю счётчик
_delay_ms(1000);
TCCR0B=0b00000000; // Счётчик выключается
if (TCNT0>500) // Если насчитал больше 500, зажечь синий светик
{
PORTB=000001;
_delay_ms(5000)
PORTB=000000;
}
else if (TCNT0>300) // Если более 300, то ещё и зелёный
{
PORTB=000010;
_delay_ms(2000)
PORTB=000000;
}
else if (TCNT0>200) // А если более 200, то ещё и красный
{
PORTB=010000;
_delay_ms(2000)
PORTB=000000;
}
asm("sleep") // Потом сон
}
}
ТАК?!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:00:59
a_skr
while(1) - просто лишнее
и уберите все else, а то не видать Вам зеленого и красного

Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:09:01
просто КОТ
Так?! А что с ГТЦЦРэ?!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:21:05
a_skr
а вот это:
PORTB=000001;
что такое?
в восьмеричной системе пишем?

PS. GTCCR - все в datasheet есть. просто открывать лень

Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:26:02
просто КОТ
Ну а как, если у Тинки13 только 6 пинов в порту Б?!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:34:30
Ser60
У 2313a в ГТЦЦР задействован всего 1 бит - нулевой, см. стр. 119 ДШ и служит он для обнуления счетчика таймера и прескайлера.
С else сейчас неправильно. Подумайте сами : если таймер насчитает 510 то в последней версии кода все 3 IF условия будут выполнены. Соответственно, выполняся все 3 IF блока, один за другим. Вам это надо?
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:37:22
просто КОТ
Три одновременно или три поочерёдно?!
У мя не 2313 а просто 13. . .
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:51:51
Ser60
ОК, бит 7 ГТЦЦР позволяет держать прескайлер в ресете пока этот бит установлен. Без него если сделать ресет, то прескайлер обнулится и потом сразу начнет считать.
PORTB = 000001 - все нормально и правильно.
Одновременно процессор ничего не вычисляет. С ELSE, Вам надо переписать первую версию кода, начав с проверки большего значения, т.е. 500:
if (TCNT0 > 500)
{...}
else if (TCNT0 > 300)
{...}
else if (TCNT0 > 200)
{...}
А что делать если TCNT0 < 200? В данном коде ничего не будет делаться.
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 16:57:15
просто КОТ
Если меньше, значит отрицательная радиация! Значит электроны из нас вылетают! Тогда дозик уже не надо. . .
И да, с 7мым битом в ГТЦЦР, можно запускать счётчик вообще, или обнулять надо?!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:03:38
Ser60
Зачем Вам вообще нужен прескайлер.? Я-бы подавал импульсы со счетчика прямо на таймер. Кстати. Timer0 8-битный и может считать только до 255. Для больших значений используйте Timer1. A обнулять счетчик таймера можно просто записав 0 в TCNT0 или TCNT1.
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:07:27
просто КОТ
А прескайлер это как?! Делитель?!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:08:59
Ser60
Да, делитель.
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:11:04
просто КОТ
Хм, тогда можно делить на 10 и использовать 8-битный счётчик, т.к. в АТТини13 вроде всего 1 счётчик. . .
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:19:39
Ser60
Точно, там только 1 таймер. А прескайлер может делить на 8/64/256/1024.
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:21:27
просто КОТ
Так, тогда делим на 8! 255 * 8 = 2040. Мне хватит!
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:25:51
Ser60
Для дозиметра это грубовато. Прескайлер пропустит на счетчик 1 импульс из 8. Я-бы подумал о МК с 16-битным Timer1 и включил его напямую без прескэйлера.
Re: Сопряжение дозиметра с МК.
Добавлено: Пт июл 13, 2012 17:30:18
просто КОТ
У мня планируется генератор с управлением от CdS резистора на приблизительно 2кГц. Цифры 200, 300 и 500 то пока о балды, я не калибровал. По идее будут цифры типа 2000, 1800 и, например, 1400. После деления на восемь будет 250, 225 и 175 соответственно. Так что, думаю, будет работать нормально.