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

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

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

void wait1 (void)
{
TCNT0 = (256 - 234);

while (TCNT0 < 780){};
}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
// Таймер
TCCR0B = 0b00000101; //делитель
TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению
sei();
while(1)
{
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
wait1();
PORTB &= ~ (1<<PB2);
}
if(bit_is_clear(PINB,PB1))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB3);
wait1();
PORTB &= ~ (1<<PB3);
}
}
}
Вопрос? на wait1() задержка работает, проверил осцил на выходе,
получаетса если мне нужны две временные задержки мне нада описать каждые?
8 бит таймер, как мне описать две задержки и правильный у меня код?
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Хе-хе-хе)))) Ты дочитал только до Занятия №5 ))))))))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Вообще, если это твоя "проба пера" попробуй с более простого - помигать светодиодом, сделать бегущий огонёк, опросить кнопку))))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

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

void wait1 (void)
{
TCNT0 = (256 - 234);

if (TCNT0 < 100000){TCNT0++;}
PORTB &= ~ (1<<PB3);
PORTB &= ~ (1<<PB2);
}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
// Таймер
TCCR0B = 0b00000101; //делитель
TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению
sei();
while(1)
{
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
wait1();
}
if(bit_is_clear(PINB,PB1))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB3);
wait1();

}
}
}
Почти догоняю :):):) отдышался и погнал дальше.
но мне кажетса многие значения с мега 8 не валидны в тиньке
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

Dr. Alex писал(а):Вообще, если это твоя "проба пера" попробуй с более простого - помигать светодиодом, сделать бегущий огонёк, опросить кнопку))))
выше написанное получилось, опробовал, работает под мега 8 бегущий огонек/ниже сделал на тиньке но это не важно.
просто пытаюсь себе обяснить как это сделать :)
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

:) Ну ясно)
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
по моему это на тиньке работать не будет...

// Таймер
TCCR0A = 0;
TCCR0B = 0b00000101; //делитель
TCNT0 = (256 - 234);
TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению
поправьте мен яесли я ошибаюсь
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

madil писал(а):TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
по моему это на тиньке работать не будет...
Посмотрел даташит - будет всё работать)))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

по моему нет такого в тине TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12) :shock:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Правильно, нету. Таймер там только 0 и WGM02 для CTC д.б. равно 0 (при WGM01=1, WGM00=0 в TCCR0A)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Прошу прощения, сегодня с утра с самой рани глядел даташит и не обратил внимания))))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

поставьте мне логику пожалуйста, ибо не могу связать действия

# подключение библиотек

ISR()
{
описание прерываний
ПРОВЕРКА PB0?
если ДА то описываем здесь?
}

int main(void)
{
описание портов
PB0 ВХОД
PB1 ВЫХОД
инициализация таймера
while()
{
Или делаем опрос сигнала а на прерывание отправляем в всерх ISR?
или из прывания делаем функцию и вставляем здесь?
основные действия

}

Не кричите на меня громко :) просто хочу знать.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

# подключение библиотек

ISR(какого прерывания? таймера или PCINT? или еще какого? нужно обязательно написать, а то непонятно какая цель)
{
описание прерываний
ПРОВЕРКА PB0?
если ДА то описываем здесь?
Если ДА, делаем то что необходимо сделать немедленно, для примера можем тут светодиод включить
}

int main(void)
{
описание портов
PB0 ВХОД
PB1 ВЫХОД
инициализация таймера
while()
{
Или делаем опрос сигнала а на прерывание отправляем в всерх ISR?
или из прывания делаем функцию и вставляем здесь?

прерывание само вызывается когда надо, не нужно его отсюда вызывать,
тут делаем только:
основные действия
которые не критичны к скорости реагирования на них, в этом месте вообще может ничего не быть (пустой цикл)
}
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

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

ISR(SIG_OVERFLOW0)
{
PORTB &= ~ (1<<PB2);
}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
// Таймер
TCCR0A=0;
TCCR0B = 0b00000101; //делитель
TIMSK0 = 0b00000010; // Разрешение прерываний по переполнению
TCNT0 = 256-237;
sei();
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
}
while(1){}
}
примерно так? если так то время задержки 0,25 сек.
В протеусе и в железе работает, проверил. Однако мне не ясны детали;
1 если у нас два прерываний , как их оформить.
2 как добиться прерываний 1 сек до 10 сек.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

madil писал(а):1 если у нас два прерываний , как их оформить.
Сколько прерываний, столько и

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

ISR(имя прерывания)
{  	
действия
}
madil писал(а):2 как добиться прерываний 1 сек до 10 сек.
Вообще 1 или 10 или одновременно 1 и 10?
Если вообще: подбирать делители тактовой и/или таймера и значения регистров OCR.
Если одновременно, то задать таймер с минимальным общим кратным интервалом (в данном случае 1сек), и в нем сделать программный счетчик с нужным интервалом. В прерывании добавляем к счетчику 1, проверяем условие интервала (счетчик=10), если =, обнуляем и выполняем то что нужно выполнить).
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

мне становитса веселее но что то я упускаю.

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

ISR(SIG_OVERFLOW0)
{

//PORTB &= ~ (1<<PB2); Здесь хоть выключил но все равно происходит прерывания

}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
// Таймер
TCCR0A=0;// Ставим 0 ибо он зарезирвировани и нам не нужен
TCCR0B = 0b00000101; //Установка делителя 1024
TIMSK0 = 0b00000010; //TOIE0: Timer/Counter0 Разрешение прерываний от переполненению
TCNT0 = 256-234;// счетчика/Таймера
sei();
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
//TCNT0=0; <====так мне обнулять таймкр?
}
while(1){}
}

Не получаетса выстовить правильное время прерывания :(
Мозги кипят, стал понимать даташит, но без поддержки не могу уловить логику :(
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

В принципе правильно, вот только проверку

if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
//TCNT0=0; <====так мне обнулять таймкр?
}

надо делать в теле бесконечного цикла while(1){}

иначе ты только раз опросишь кнопку и всё))))
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

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

ISR(SIG_OVERFLOW0)
{

PORTB &= ~ (1<<PB2);

}

int main(void)
{
DDRB = 0b001100;
PORTB = 0b100011;
// Таймер
TCCR0A=0;// Ставим 0 ибо он зарезирвировани и нам не нужен
TCCR0B = 0b00000101; //Установка делителя 1024
TIMSK0 = 0b00000010; //TOIE0: Timer/Counter0 Разрешение прерываний от переполненению
TCNT0 = 256-234;// счетчика/Таймера

sei();

while(1){
if (bit_is_clear(PINB,PB0))
{
PORTB |= (1<<PB2);
TCNT0=0;
}
}
}

Нужна поддержка... не получаетса правильно расчитать задержку, либо должен функцией поднять или
делителем.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Чт дек 19, 2013 12:12:01

Сообщение madil »

Спасибо всем, полсе долгого выноса мозгов самому себе, разобрался , и все у меня получилось.
Понел как в легкую формировать ассинхронно циклу до нескольких временный прерываний используя всу мощь маленькой Тиньки :)
Грубо говоря на нем можно Шатл отстроить :) :) :) но это будет мего извращение :) , хотябы робота пылесоса точно можно :)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

УРА!!!!! :) :) :)
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Ответить

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