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

Шим На Тини13А


cargo29

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

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

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

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

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

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

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

Выбираем схему 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 пользователей онлайн

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

    • параллельно изучать по фото платы, сервис мануал (схема) если будет, то на него и ориентировать покупку. Цена определяет качество, резонансный всегда дороже. Про нагрузку Вы не написали, что там будет?
    • Спасибо! Сегодня буду смотреть почему проседает... Хотя аккум нормальный, 11.1v, максимальный долговременный ток до 20А... Вообщем разбираюсь.
    • Ловите, как раз на широкую полосу для Палника рисовали, автора не знаю. Все, что нужно.   
    • @Андрей0З9  Это что за учитель и где, такой по трудовому обучению, задает задачи по физике 10 класса.?!  Бред полный.
    • Румынский дядька - перфекционист-фенечник. Бисера и бусин - дофига, вот и ставит куда не попадя, в данном случае бусинками выставил единую высоту ряда конденсаторов. Подобное встречалось, когда на ножки впаиваемых элементов одевались короткие кембрики одинаковой высоты, чем задавалась единая высота монтажа. Ну видимо румынскому дядьке лень было нарезать кучу одинаковой мелочёвки, зато было вналичии много бисера..., и креативно и желаемого достиг. С уважением, Сергей. 
    • О, это очень полезные регистры! в 88 только GPIOR0 сохранил свои полезные свойства. использую их как флаги событий прерываний. для GPIOR0 адрес порта ввода-вывода 0х1Е, а значит к нему применяются команды cbi, sbi, sbic, sbis   ну и   in, out. Когда происходит прерывание, процессор переходит на адрес обработки прерывания, вот там-то мы и располагаем код: sbi   GPIOR0, 0     ;установить в 1 бит 0 в регистре GPIOR0 reti                        ;вернуться из прерывания   Без использования регистра GPIOR0, а с использованием обычного регистра код выглядел бы иначе: push   R0                          ;освобождаем регистр R0 для SREG и сохраняем его in        R0, SREG               ;сохраняем SREG в R0, все флаги операций текущей программы sbr     R23, 1<<0             ;выставляем флаг признака прерывания, например бит 0 в регистре R23 out    SREG, R0               ;восстанавливаем SREG, все флаги операций текущей программы pop   R0                          ;восстанавливаем значение R0 reti                                  ;вернуться из прерывания   Нетрудно заметить......!   А, да команда: sbr     R23, 1<<0 в идеале изменяет флаги в SREG, потому и такая длинная цепочка команд. Далее, из всего сказанного выше... в АТмега8 до адреса ввода / вывода 0x1F, находятся некоторое количество регистров, которые крайне редко (...никогда...) используются, например: TWBR, TWSR, TWAR, SPCR, ....... их можно (... нужно...) использовать как GPIOR регистр. До связи.
×
×
  • Создать...