Страница 1 из 2

Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 13:15:10
madil
Благодарен тем кто обратил внимание.
Мой первый проект(можно назвать и по другому, но для меня это выглядет так :)) )
Нужна помощ ибо самому не понятно ,точнее не могу понять как правильно использовать прерыание, по чему именно* использовать прерывание.
Задача.
принимаем два сигнала,
при сигнале 0 на PB0, даем выход PB2/0,8 сек.(sleep)
при сигнале 0 на PB1, выход PB2/0.8 сек ,PB3/15сек (sleep) , при этом если PB0==0,PB2/0,8 сек.

С кодом получаетса все просто, при задержке 15 сек PB0 не обслуживаетса.
пробовал и на С и на Асм :(

не хватает знаний, имея другие примеры нужного результата не достиг.
ВОТ КОД ПРОГРАММЫ;

#include <avr/io.h>
#include <util/delay.h>
#define sig1ON PORTB |= (1<<PB2)
#define sig1OFF PORTB ^= (1<<PB2)
#define sig2ON PORTB |= (1<<PB3)
#define sig2OFF PORTB ^= (1<<PB3)
#define t08 _delay_ms(800)
#define t10 _delay_ms(10000)

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
while(1)
{
if (bit_is_clear(PINB,PB0))
{
sig1ON;
t08;
sig1OFF;

}
if(bit_is_clear(PINB,PB1))
{
sig1ON;
sig2ON;
t08;
sig1OFF;
//t10;// ПРИ ЗАДЕРЖКЕ 10СЕК PB0 НЕ ОБСЛУЖИАЕТСА
//sig2OFF;//
}
}
}

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 14:57:34
Dr. Alex
Начнём с простого
#define sig1OFF PORTB ^= (1<<PB2)
Это не правильная запись!!! Правильная будет так:

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

#define sig1OFF PORTB &= ~(1<<PB2)
[/b]

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:03:03
madil
Dr. Alex писал(а):Начнём с простого
#define sig1OFF PORTB ^= (1<<PB2)
Это не правильная запись!!! Правильная будет так:

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

#define sig1OFF PORTB &= ~(1<<PB2)
[/b][/quote
Бесспорно но интерестно, так тоже работает но в чем разница?
я из соображений ^=() короче чем &=~().

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:11:28
Dr. Alex
При вашей записи, вы сбросите в 0 нужный вам бит, а остальные инвертируете. При моей записи вы сбросите в 0 нужный бит, при этом все остальные останутся нетронутыми!!! Учите матчасть - http://radioparty.ru/index.php/prog-avr ... 39-lesson7

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:19:18
madil
Dr. Alex писал(а):При вашей записи, вы сбросите в 0 нужный вам бит, а остальные инвертируете. При моей записи вы сбросите в 0 нужный бит, при этом все остальные останутся нетронутыми!!! Учите матчасть - http://radioparty.ru/index.php/prog-avr ... 39-lesson7
Понято!
исправляю код.
что подкажете по основному вопросу?

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:31:11
Dr. Alex
Скажите, вы зачем полностью цитируете сообщение?

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:33:33
madil
чтоб был виден диалог :(
не подумал что может быть вне правилах.

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:40:45
Dr. Alex
madil писал(а):С кодом получаетса все просто, при задержке 15 сек PB0 не обслуживаетса
Конечно не будет обслуживаться)))) У тебя камень простаивает 15 секунд, и в эти 15 секунд он абсолютно ничего не делает, а тупо отсчитывает задержку!!!! Лучше опрашивать входы на прерывании) Ну или задержку немного не так делать...

З.Ы.
madil писал(а):чтоб был виден диалог
А диалог и так видно))))))

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:49:09
madil
В этом и есть суть :) не знаю как правильно програмно(кодом) сделать задержку.
или по переполнению таймера или по другому :( нет у меня основы.
не понимаю как правильно связать команды с переменными :(

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 15:56:53
Dr. Alex
Вы не достигнете никаких результатов, пока не сформулируете сами для себя конкретную цель, а вот это ваше:
как правильно програмно(кодом) сделать задержку или по переполнению таймера или по другому нет у меня основы
:)) :)) :)) :))

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 16:07:56
madil
Какже правильно сформулировать чтоб было понятно? :(
сделать задержку по времени , и обращятса к ней когда нужно при этом чтоб выполнялся основной цикл.
скажем опрос портов на низкий уровень сигнала каждые 2мс,
1 на выходе порта через задержку 1сек или 10 сек, при этом чтоб проц не бездействовал.
думаю в выше написанном коде можно понять где нужна правильная задержка.

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 16:09:34
Dr. Alex
Ну вот, сделать задержку на Таймере в режиме совпадения, например! При поступлении сигнала на вход, обнуляете таймер, сбрасываете выход и таймер начинает считать.... Как достигнет нужного вам времени по прерыванию выставит 1 (ну или 0) на нужном вам выходе... Вот как-то так :)

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 16:23:54
madil
Правильнали моя модель?

#define F_CPU = 9600000/8=1200000
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(SIG_OVERFLOW0)
{
PORTB //ОПИСАНИЯ ДЕЙСТВИЙ,ЧТО КУДА И КОГДА И НА ДОЛГОЛИ :)
TCNT0
}

int main(void)
{
PORTB = // ОПИСАНИЕ ПОРТОВ
DDRB =

// Таймер
TCCR0A = 0;
TCCR0B = 0b00000101; //делитель
TCNT0 = (256 - 234);
TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению

sei();
while (1) {}
}

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 16:27:25
Dr. Alex
А где опрос портов??? В функции прерывания только выход указать!

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 16:45:28
madil
#define F_CPU = 9600000/8=1200000
#include <avr/io.h>
#include <avr/interrupt.h>
#define sig1ON PORTB |= (1<<PB2)
#define sig2ON PORTB |= (1<<PB3)

ISR(SIG_OVERFLOW0)
{

PORTB &= ~ (1<<PB2);// КАК Я ПРАВИЛЬНО ПОНЕЛ МНЕ НАДО ЗДЕСЬ ИХ ОБОЗВАТЬ КАК TCCR0A/TCCR0B ?
PORTB &= ~ (1<<PB3);

}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;

// Таймер
TCCR0A = 0;
TCCR0B = 0b00000101; //делитель

TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению

sei();
while(1)
{
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
TCNT0 = (256 - 200);
}
if(bit_is_clear(PINB,PB1))

{
PORTB |= (1<<PB2);
PORTB |= (1<<PB3);

}
}
}
Получаетса но что то не то, где моя ошыбка? ткните меня носом.

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 20:06:51
Dr. Alex
Вот смотри: при приходе 1 на вход - выставляешь нужное тебе значение на выходе + запускаешь таймер, который отсчитывает нужное тебе время, по окончании счёта - ПРЕРЫВАНИЮ, останавливаешь таймер и сбрасываешь значение выхода! Вот и всё)

Ну не буду-же я за тебя весь код писать)

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 20:16:29
madil
Буквально кодом я занялся с утра :) до сегоднешнего дня и знать не мог что это, решение было спонтанно, придумал мысль, под руку в магазине оказалась
тиньки и программатор скт 500
Голова кипит от незнания :(
я не прошу писать за меня код...
прошу просветить....думаю за день думок я уже торможу :(

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 20:19:21
Dr. Alex
Вот почитай ТУТ. Очень хорошая обучалка)))

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 20:20:00
madil
Ужэ читаю

Re: Attiny 13 моя первая сборка

Добавлено: Чт дек 19, 2013 21:04:23
Dr. Alex
Проясняется? Какие вопросы?