Перейти к содержанию

Шим На Тини13А


cargo29

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Спасибо за ссылки, взял за основу одну на переделку.

#define F_CPU 9600000
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
uint8_t counter=0;
uint8_t lev_ch1, lev_ch2, lev_ch3;
uint8_t buf_lev_ch1, buf_lev_ch2;
void delay_ms(uint8_t ms)
{
while (ms)
{
 _delay_ms(1);
 ms--;
}
}
int main(void)
{
DDRB=0b00000011;
TIMSK0 = 0b00000010;
TCCR0B = 0b00000001;
sei();              
lev_ch1=64;
lev_ch2=64;

while (1)      
{
}
}
ISR (TIM0_OVF_vect) 
{
if (++counter==0)
{
 buf_lev_ch1=lev_ch1;
 buf_lev_ch2=lev_ch2;
 PORTB |=(1<<PB0)|(1<<PB1)|(1<<PB2);
}
if (counter==buf_lev_ch1) PORTB&=~(1<<PB1);
if (counter==buf_lev_ch2) PORTB&=~(1<<PB0);
}

Как сделать сдвиг на 2 канале на длительность 1 канала. то есть как только первый закончился второй сразу начался, как только второй закончился, первый начался. Это задает на какой частоте будет работать контролер? #define F_CPU 9600000. Что это за обозначение переменной? uint8_t, TIMSK0 = 0b00000010; Что это делает? почему у него задан 2 порт?

TCCR0B = 0b00000001; Такой же вопрос для чего служит и почему задан 1 порт?

ISR (TIM0_OVF_vect) это я так понял внутри таймера пишется код?

sei(); разрешить прерывание таймера, то есть он достиг определенного значения и начинает сначала так?

if (++counter==0)
{
 buf_lev_ch1=lev_ch1;
 buf_lev_ch2=lev_ch2;
 PORTB |=(1<<PB0)|(1<<PB1);
}

я правильно понимаю запись? Если переменная равна 0 (начала счетчика) то переменным присваиваем значение длительности импульса. и подаем на порты 1?

if (counter==buf_lev_ch1) PORTB&=~(1<<PB1); это проверка закончилось ли длительность импульса? если да то ставим на порт 0, так?

Изменено пользователем cargo29
Ссылка на комментарий
Поделиться на другие сайты

#define F_CPU 9600000 - похоже на директиву компилятору установить фьюзы для тактирования МК частотой 9.6МГц

-----------------------

а вот это что за запись?

uint8_t counter=0;

unit8_t - что означает?

Подозреваю, таким образом решается проблема про которую ты говорил (что не видно глобальных переменных)

------------------------

TIMSK0 = 0b00000010; Что это делает?

TIMSK0 - регистр маски прерываний для TMR0.

Если бит в маске = 0, прерывание запрещено. Здесь оно разрешается. В данном случае, как я понял, разрешается прерывание по переполнению таймера.

----------------

TCCR0B = 0b00000001; Такой же вопрос для чего служит и почему задан 1 порт?

Это не порт. Это регистр управления таймером TMR0. В данном случае выбран, как я понял, нормальный режим работы таймера (TMR0 как простой счётчик)

--------------------

sei(); разрешить прерывание таймера, то есть он достиг определенного значения и начинает сначала так?

нет. Это ассемблерная инструкция SEI, которая разрешает прерывания глобально (устанавливает бит I=1 в регистре статуса). Если I=0, все прерывания запрещены.

-------------------

ISR (TIM0_OVF_vect) это я так понял внутри таймера пишется код?

Внутри таймера никакой код писаться не может, т.к. таймер - это аппаратное устройство.

У него есть несколько регистров: регистр счётчика TCNT0, два регистра управления - TCCR0A, TCCR0B, два регистра сравнения (для организации ШИМ) - OCR0A, OCR0B; регистр маски - TIMSK0.

А то что ты спрашиваешь - это подпрограмма обработки прерывания по переполнению счётчика TMR0. Когда счётчик таймера переполняется, происходит переход к исполнению этой подпрограммы.

Если бы ты писал на ассемблере, тебе бы пришлось по адресу 0x0003 сделать переход к этой подпрограмме вручную.

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

8244 спасибо откуда такие знания? , как сделать сдвиг на втором порту? по тому вопросу я решил, там видимо ISIS не хотел воспринимать осциллограф показывал увеличение. Код выложил в той теме

Ссылка на комментарий
Поделиться на другие сайты

if (counter==buf_lev_ch1) PORTB&=~(1<<PB1); это проверка закончилось ли длительность импульса? если да то ставим на порт 0, так?

да, так

откуда такие знания?

я ж тебе в соседней теме ссылку давал.Всё оттуда. Больше ниоткуда.

по тому вопросу я решил.. Код выложил в той теме

я так и не понял в чём была проблема. Про пошаговое исполение и отслеживание значения x при переходе через строку x += 100 ты мне не ответил.

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

Вообщем само моделирование на светодиоде не показывало изменение а осциллограф показывал, то есть новое значение присвоено было переменной, высь код выполнялся правильно. По поводу сдвига сигнала не подскажешь? Ты все берешь из даташитов? Я сколько их открывал не могу разобраться, там все по англ.

Изменено пользователем cargo29
Ссылка на комментарий
Поделиться на другие сайты

8-й класс поди?

Должны быть даташиты на русском.. наверное. Я только по ним, т.к. всё остальное - это перессказ даташита.

Про сдвиг так и не понял чего хочешь. В любом случае, алгоритм сам составляй. Иначе смысл тогда.. Судя по уровню, программирование только недавно осваивать начал? Лучше на асм пиши под контроллеры. А так ты вообще будешь на уровне "что-то где-то на авось", потому что язык ещё сложный сам по себе. Ассемблер простой.

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

Ассамблер для меня деревня, не 8 класс в то время когда учился не изучал англ. начал вот только, пишу на делфи немного на С++ и веб язых, как бы переходить с тех языков мне легче чем на ассамблер. даташитов ни разу не видел русских

Ссылка на комментарий
Поделиться на другие сайты

ну почему.

вот, не совсем даташит, но народ хвалит

avr.ru/docs/books/avr

forum.avr.ru/datasheet-na-russkom-t33786.html

там же есть русский даташит на Mega128 (единственный существующий русский на AVR, как я понял)

не суперский перевод, навигации нет. А у Евтисеева "МК семейства Сlassic" (там же, pdf) удобно сделан. Для понимания общих вещей как раз подойдёт, у Classic только набор периферии другой

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

#define F_CPU 9600000
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
uint8_t counter=0;
uint8_t counter2=128;
uint8_t lev_ch1, lev_ch2;
uint8_t buf_lev_ch1, buf_lev_ch2;
void delay_ms(uint8_t ms)
{
while (ms)
{
 _delay_ms(1);
 ms--;
}
}
int main(void)
{
DDRB=0b00000011;
TIMSK0 = 0b00000010;
TCCR0B = 0b00000001;
sei();			  
lev_ch1=128;
lev_ch2=128;

while (1)	  
{
}
}
ISR (TIM0_OVF_vect) 
{
if (++counter==0)
{
 buf_lev_ch1=lev_ch1;
 PORTB |=(1<<PB0)|(1<<PB1);
}
if (++counter2==0)
{
 buf_lev_ch2=lev_ch2;
 PORTB |=(1<<PB0)|(1<<PB1);
}
if (counter==buf_lev_ch1) PORTB&=~(1<<PB0);
if (counter2==buf_lev_ch2) PORTB&=~(1<<PB1);
}

Вот может кому надо, кривовато но для начало пойдет думаю. только вот как вычислить частоту я не знаю и где частотометр в ISIS не знаю

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

ну, точно деревня... эту всю работу может выполнить сам таймер! Читай даташит на таймер, на его режимы работы.

У него есть ДВА регистра сравнения и есть два аппаратных вывода связанных с ними, если первый вывод настроить в прямом положении а второй в инверсном, то на первом выводе будет идти 1 и сменится на 0 в момент совпадения счетчика и первого регистра сравнения, а на втором выводе - наоборот идет 0 потом становится 1 когда значение таймера станет равно второму регистру сравнения. если регистры будут иметь значение с разницей в N - то импульсы будут либо перекрываться на N тактов либо иметь зазор между собой в N тактов.

Частоту ШИМ можно рассчитать очень просто - тактовую частоту таймера делишь на число до которого он считает(256).

В твоем случае, надо частоту прерываний поделить на 256 т.к. именно с таким периодом у тебя будет переполнятся counter и все начинаться с начала. Судя по настройке таймера это будет еще в 256 раз меньше. Итого частота ШИМ будет равна 9.6Мгц/65536

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

У него есть ДВА регистра сравнения и есть два аппаратных вывода связанных с ними, если первый вывод настроить в прямом положении а второй в инверсном

Как они обозначаются на контролере OC0A и OC0B? (Выводы) в даташите нет и кусочка кода по этому поводу, подскажи как инициализировать или запустить эти счетчики или таймеры, это устанавливаем выход так ? DDRB = 0b00000011; это на 1 и 2 порт выход настроили,

PORTB = 0b00000001; первый выход, 2 инверсия, а как сделать их в таймере? и вот еще вопрос в чем разница между таким кодом?

PORTB = (1<<PB1);

PORTB=_BV(PB1) что дает функция _BV читал так и не понял ее смысл.

Ссылка на комментарий
Поделиться на другие сайты

Это необходимое условие но не достаточное.

Надо еще настроить таймер в нужный режим, для этого нужно вычитать раздел в даташите посвященный этому таймеру.

Например так:

TCCR0A = 0b10110001 ; режим таймера 01 - PWM(Phase Correct). Clear OC0A on Compare Match when up-counting.

; Set OC0A on Compare Match when down-counting.

; Set OC0B on Compare Match when up-counting.

; Clear OC0B on Compare Match when down-counting.

TCCR0B = 0b00000010 ; Счетчик работает c предделителем = 8.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Да видел раздел, но с англ проблемотично. по функции _BV http://www.myrobot.ru/stepbystep/pr_mcports.php она возвращает указатель на вывод порта? Читал по битам как понять if (PORTB & _BV(PB4)==0) это типа И, как это словами описать (Если порта Б вывод 4 = 0 то, так?) есть еще другие если не ошибаюсь | (или) , ~ отрицание

TCCR0A это режим таймера?

TCCR0A = 0b10110001

TCCR0B = 0b00000001

приваеваем режим работы своему выводу?

Счетчик работает c предделителем = 8. откуда это стало известно? и что такое предделение?

Ссылка на комментарий
Поделиться на другие сайты

TCCR0A - это регистр управления таймером (байт в памяти контроллера, по которому логика процессора определяет, как с таймером обращаться). Когда процессор видит, что установлен бит, предписывающий обратный счёт, он будет на каждом такте отнимать единицу из байта счётчика, а не прибавлять как по умолчанию.

вы молодец, что задаёте конкретные вопросы

Предделитель - это устройство, которое стоит между счётчиком и тактовым генератором. Без предделителя счётчик изменят свои показания один раз за период тактового сигнала. Если мы хотим, чтобы счётчик работал медленнее, мы делим частоту тактового сигнала с помощью предделителя. Предделитель - это по сути такой же счётчик, который считает до определённого числа: скажем, если он считает до 10, то на выходе предделителя мы получим частоту в 10 раз меньше чем от тактового генератора.

Предделитель включается, если установлен соответствующий бит в регистре управления счётчиком TCCR. Там же задаётся коэффициент деления.

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

Да, это пример инициализации таймера в довольно сложном для понимания режиме работы Phase Correct, когда направление счета таймера меняется когда он достигает границы счета - что-то вроде пинг-понга.

TCCR0A и TCCR0B - это два регистра конфигурации для ОДНОГО таймера, от бит занесенных в эти регистры зависит то как таймер будет работать. Что именно там настраивается можно посмотреть в даташите, пройтись по таблицам и выяснить в каком режиме он работает. Смотри, в даташите есть структурная схема таймера, она приблизит тебя к пониманию как он работает.

Насчет _BV судя по всему можно сказать что она возвращает МАСКУ для указанного бита, легко заменяется на 1<<номер_бита, не удивлюсь если это окажется именно таким макроопределением. "&" - это операция поразрядного логического "И". По сути, берется значение всех 8 бит порта, накладывается маска - остается только один этот бит, и если результат НЕ равен нулю - значит 1 в этом бите была, если равен нулю - значит 0.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Обычный DSO PRO, генератор под 4кГц получился, трудно поймать высокие SR на разрешении менее 2uS. Но до 30V/uS генерируется правильно. Musesы, Lme49xxx, opa 16xx/21хх и т.п. все согласно даташитов. Более скоростные не пробовал. Разброс по току более 1mA встречал только у ОР27 и LF353.
    • Спрошу здесь, извиняюсь заранее если не совсем верно в тему.  Вопрос в следующем - хочу сделать экранчик для своего цапа (преобразователя) чтобы выводил частоту дискретизации (допустим это). Я узнал что можно реализовать эту задачу на контроллере Ардуино, можно Нано или другой и дисплей SSD1306 I2C OLED. Сигнал с цапа снимается по LRCLK с I2S и преобразовывается в I2C для вывода на экран. Купить экран и контроллер не проблема, а как подключить контроллер к цапу если на самом нано нет нужного пина или я что то не понимаю и все возможно? Прошивка есть! Хочу разобраться с подключением и купить плату с экраном. Можете обьяснить как соединять?  Вот у человека все подключено и работает. Частично он мне обьяснил...    
    • Ну надо сказать, заработало. Причём режимы даже совпали с расчётными. По усилению только не совсем понятно, толи погрешность осциллографа, толи действительно есть небольшой разбег...
    • "Так а если этот ваш телефон или монитор перенести на другую улицу - там все эти глюки пропадают?"  Телефон так работает везде по городу и области. Монитор не везде, но степень разная, где-то лучше, где-то хуже, но это не 1 монитор, это любой монитор. То есть в каких-то местах где одно устройство хорошо работает - там будет работать хорошо и другие.
    • Вот такие "мелкие" казалось бы детали, которые многие могут не заметить. Но я сразу подозревал, что на этой плате все-таки стоит внутренняя видеокарта (несмотря на заявления ТС что ее там нет). И выложеные (большое спасибо за это) выше таблицы раз за разом это подверждают тоже - чипсет 945GZ таки имеет встроенную видеокарту. В данном случае, ТС также использует внешнюю видеокарту (NVidia GeForce 210), а для внутренней не установлен драйвер, почему он и показан как "Microsoft Basic Adapter" (используется "драйвер Windows по-умолчанию"). Для того чтобы "добавить" памяти в систему (максимум что может добавиться это 512мб, писал об этом выше), надо вначале выключить внутреннюю видеокарту в BIOS (ну и включить Memory Re-Map, как уже предлагали). 
    • Так а если этот ваш телефон или монитор перенести на другую улицу - там все эти глюки пропадают?
    • Всех радиолюбителей поздравляю С ДНЁМ РАДИО.
×
×
  • Создать...