Обсуждаем контроллеры компании Atmel.
Вт дек 17, 2019 22:28:50
- Код:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
unsigned int i,k;
ISR(TIM0_COMPA_vect) {
i=i+1;
if (i==38)
{
TCNT0=0x00;
i=0;
k=k+1;
PORTB^=(1<<PORTB0); // моргаем каждую секунду (инвертируем каждую секунду)
}
}
void main(void)
{
DDRB=0xFF;
PORTB=0b00000001;
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00); //Счетный режим таймера с часторой....
TCCR0A=(1<<WGM01) ; // режим сравнения СТС
OCR0A=0x1e; // Заданное число сравления (30)
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0); //Разрешаем выполнение прерывание по совпадению в OCR0A
sei();
while (1)
{
}
}
добился что бы счетчик считал 1 секунду.
NStorm писал(а):Потому, чтобы он работал в таком режиме, надо ему такой режим установить в TCCR0A:
Код:
TCCR0A = (1 << WGM01);
Режим называется Clear Timer on Compare Match (CTC). Чтобы он считал до OCR0A, а НЕ до 0xFF.
NStorm, все правильно вы написали.
Но у меня почему-то не получалось пока не сформировал готовый код по совету
roman.com и не посмотрел его внимательно.
Вт дек 17, 2019 22:42:07
- Код:
TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0); //Разрешаем выполнение прерывание по совпадению в OCR0A
Сдвигать нули ну никакого же смысла. Поэтому:
- Код:
TCCR0B=0x05; //ДЕЛЕНИЕ НА 1024
И
- Код:
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
В общем-то ничего не отличаются, только 2ая запись визуально понятнее. Если еще б нули оттуда убрать, еще понятнее будет )
В прошлом варианте не хватало только TCCR0A = (1 << WGM01);. Должно было с ним заработать. Где-то в другом месте что-то не так написали.
Добавлено after 4 minutes 9 seconds:Еще:
unsigned int i,k; - я же писал, надо volatile обязательно, если меняем в прерывании
TCNT0=0x00; - лишнее, он и так сбрасывается каждый в этом режиме до входа в прерывание.
Вт дек 17, 2019 23:06:08
А вот попробовал то же фокус проделать с OCR0B.
Так вот, ничего не вышло
OCR0B=0x1e; // Заданное число сравления (30)
TIMSK0=(1<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
Прочитал в интернетах что СТС не работает с OCR0B
Ну да ладно, буду двигаться дальше, - к ШИМУ.
Добавлено after 3 minutes 46 seconds:
Одновременно читаю уроки по Атмеге, так вот там как-то все более логично...
Ср дек 18, 2019 07:41:34
Не работает, да, там сказано что верхнее значение строго OCR0A.
Пн авг 03, 2020 11:08:18
И снова здравствуйте!
Вот есть у меня такая задумка
Добавлено after 25 minutes 18 seconds:есть синтезатор на аttiny13 и lm7001
Lm 7001 управляется с тиньки по 3 пинам
еще 3 пина свободных
Но программа для тинки написана на 1 фиксированную частоту.
Я бы хотел добавить кнопку или даже 2 кнопки, что бы "гонять" частоту туда-сюда. Для них нужно 2 пина
Ну и поняятно что бы видеть какую частоту я ставлю через сдвиговый регистр 74HC595 семисегнментный индикатор и для этого еще нужно 3 пина
И я подумал что ближайший многопиновый аналог аттини13 это attiny2313. В правильном ли направление я мыслю?
Добавлено after 2 minutes 51 second:
Пн авг 03, 2020 11:10:04
не совсем... ядро тини, но у 2313 нет АЦП, зато есть 16-битный таймер с захватом, больше внешних прерываний, есть USI USART блоки...(это так, на вскидку различия)
Пн авг 03, 2020 11:22:26
- Код:
/*****************************************************
Chip type : ATtiny13A
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 8
*****************************************************/
typedef unsigned char byte ;
typedef unsigned int real ;
#include <tiny13.h>
#include <bcd.h>
#include <delay.h>
#define CE PORTB.2
#define CL PORTB.1
#define DA PORTB.0
void lm7001SendByte(byte k)
{
byte i ;
for (i = 0; i < 8; i++) {
if (k&0x1) DA = 1;
else
DA = 0;
delay_us(3);
CL = 1;
delay_us(3);
CL = 0;
k = k >> 1;
delay_us(3);
DA = 0;
}
}
// Формируем команды
void send_lm7001(){
real divisor;
divisor = (27135 + 465) / 10; //делим на шаг заданный программно для микросхемы
// частота + ПЧ
// пример: (частота + пч) * (кварц / шаг делителя) / реальный кварц
// (27135 + 455) * (7200 / 10) / 7200 = 2759
// (27135 + 455) * (7200 / 9) / 8000 = 2759
CL = 0;
CE = 1;
delay_us(3);
lm7001SendByte(divisor & 0x00FF);
lm7001SendByte((divisor & 0xFF00)>>8);
lm7001SendByte(0b11010000);
// Настройка делителя синтезатора (1-Fmin,101 - 9кГц шаг)
// (1-Fmin, 001 - 10кГц шаг)
delay_us(3);
CE = 0;
}
void main(void)
{
PORTB=0x00;
DDRB=0x07;
delay_ms (20);
send_lm7001(); // отправляем частоту
delay_ms (200);
while (1)
{
#asm("sleep");
}
}
Добавлено after 1 minute 1 second:Ivanoff-iv, в каком направлении мне тогда двигаться. Как выбрать контроллер для расширения функционала?
Добавлено after 1 minute 29 seconds:что бы меньше переписывать код...
Пн авг 03, 2020 11:30:38
если у тебя АЦП не задействован - переезжай на 2313...
Пн авг 03, 2020 16:11:31
Или использовать драйвер дисплея типа TM1628.
Управляется по 3 проводам, выводит информацию на многоразрядный дисплей,сканирует клавиатуру.
Пн авг 03, 2020 16:37:34
код глянул — про АЦП ни слова
я тоже сначала хотел пару сдвиговых регистров предложить (1 на выход и 1 на вход), но там 4 провода надо... (выход, вход, клок, выбор чипа) раз здесь хватит 3 - то тоже вариант...
Пн авг 03, 2020 17:18:34
Заработает ли вышеприведенный код без доработок на Attiny 2313 ?
Что бы мне не переделывать, а заняться сразу выводом на дисплей (может быть это будет номер канала, тогда нужно всего 2 семисегметных дисплея)
и кнопками.
Пн авг 03, 2020 17:28:18
С аттини2313 можно вообще без регистров сдвига сделать,поищите тему "Маленькой радио" на CQHAM,там все это сделано
Ошибся,там регистры сдвига есть
Пн авг 03, 2020 19:42:37
Или использовать драйвер дисплея типа TM1628.
Это случайно не со старых спутниковых тюнеров типа Uston, Openboх. Хватит ли у меня ума его подключить.
Пн авг 03, 2020 20:35:30
Заработает ли вышеприведенный код без доработок на Attiny 2313 ?
Должен ,т.к. никакой специфичеческой периферии не используется.
Чт сен 03, 2020 14:35:24
после довольно длительного перерыва решил снова поизучать Attiny13. Уже попробовал запускать шим и регулировать скважность через АЦП посредством переменного резистоора - получилось. Разбираю регистры и биты. Потихоньку складывается общая картинка как это все работает.
Счас перечитал предыдущие страницы.
Интересует опять вопрос радиоуправления. И вот хочу что бы специалисты снова покритиковали поток моего примитивного сознания.
На 4-5-6 страница этой темы много было уже исписано по поводу передачи импульсов и протоколов. Все это я заново перечитал и пересмотрел ссылки.
Мало того, у меня быль пульт от люстры. Я прошил атмегу328 загручиком Ардуинно, присобачилк к ней 1602 дисплей и с помощью RX радиомодуля и скетча принял сигнал. У меня получилось что-то наподобии код: 46465 и период 262мс. И я подумал, что , получается что бы управлять люстрой нужно всего лишь передать сигнал определенной частоты. (?????). Не факт что это умозаключение было правильным. Но натолкнуло меня на новую мысль.
Так что получается, что я отправляю имульсы определенной частоты , а на приемнике с помощню тиньки принимаю эти имульсы, считаю их, и если скажем, их оказывается 250 штук за 0.1 сек, то это и будет сигнал для исполнительногго механизма. Ну так же не бывает в природе, что бы гдето случайно появился похожий сигнал? Понятно, что здесь никакой защиты. Но тем не менее, правильно ли я мыслю?
Чт сен 03, 2020 15:31:14
olegue писал(а):Ну так же не бывает в природе, что бы гдето случайно появился похожий сигнал?
зато бывает, что из пачки в 250 один или двадцать один, или тридцать один, или семь... или сколько-нибудь импульсов не дойдут до приемника... и что тогда?
olegue писал(а):Понятно, что здесь никакой защиты
вот именно
Чт сен 03, 2020 16:19:52
Есть вот такая железяка
...
Может работать и как приемопередатчик (радиоудлиннитель RS232)... И как самостоятельное ДУ...
А за основу пакета взять протокол для DS18B20 (блок из 8 байт с контрольной CRC)...
Чт сен 03, 2020 16:39:46
ARV писал(а):зато бывает, что из пачки в 250 один или двадцать один
т.е я понял, что импульсов должно быть поменьше, а порядка среди них побольше.
Добавлено after 5 minutes 42 seconds:поэтому и применяют различные протоколы.
Но получается, что у радиоуправления люстрой на TP2262/tp2272 нет никакого протокола?
Чт сен 03, 2020 16:49:10
olegue писал(а):у радиоуправления люстрой на TP2262/tp2272 нет никакого протокола?
понятия не имею.
Чт сен 03, 2020 20:18:20
...
Но получается, что у радиоуправления люстрой на TP2262/tp2272 нет никакого протокола?
Очень даже есть:
Только его вычитывать надо - достаточно примитивен и аппаратно закрыт (не во всех редакциях даташитов указывается).
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.