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

Вопросы от начинающих по МК


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

Так считает до восьми, на 1 больше,уже прогресс!

А другая часть кода(не связанная с n) может влиять на счет n ?

Это почему-то связанно с портом, на порту B все отлично работает, такой вопрос, это только в протеусе или в реальной модели тоже?

Т.е. может ли протеус ошибаться?

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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

У вас внешние прерывания разрешены а обработчиков нет... что происходит во время изменения уровней на соответствующих выводах одному богу известно! Почему-то я не удивлюсь, если эти прерывания находятся на выводах порта D... В меге 48/88PA на выводе PD3 аккурат находится вход INT1... совпадение? У вас это прерывание разрешено, обработчика нет... Как только счетчик доходит до 8 возникает это прерывание(вероятно, надо посмотреть еще настройки по умолчанию) и контроллер выполняет неизвестно что, возможно даже переходит на 0 вектор прерывания и программа начинает работать заново.

Проверить этот факт несложно - вставьте в начале программы, там где у вас все обнуляется вывод "1" в любой из портов(только на INT0 не попадите!), а перед бесконечным циклом вывод "0". Таким образом если в процессе работы программы там будет периодически появляться "1" то вы будете знать что происходит. Можно конечно туда еще задержку в пол секунды вставить, чтобы наверняка было заметно даже обычным логическим пробником.

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

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

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

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

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

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

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

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

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

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

вызов vivod() из главного цикла убрали?

на выход может влиять включенная периферия АЦП, компараторы и тд...

вряд ли протез ошибается

В vivod() у меня содержится другой код программы которую должна запускать переменная n поэтому мне ее обязательно нужно переадреcовать в функцию vivod()

а если я ее уберу с главноко цикла, как же vivod() тогда вообще запустится?

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

У вас внешние прерывания разрешены а обработчиков нет... что происходит во время изменения уровней на соответствующих выводах одному богу известно! Почему-то я не удивлюсь, если эти прерывания находятся на выводах порта D... В меге 48/88PA на выводе PD3 аккурат находится вход INT1... совпадение? У вас это прерывание разрешено, обработчика нет... Как только счетчик доходит до 8 возникает это прерывание(вероятно, надо посмотреть еще настройки по умолчанию) и контроллер выполняет неизвестно что, возможно даже переходит на 0 вектор прерывания и программа начинает работать заново.

Проверить этот факт несложно - вставьте в начале программы, там где у вас все обнуляется вывод "1" в любой из портов(только на INT0 не попадите!), а перед бесконечным циклом вывод "0". Таким образом если в процессе работы программы там будет периодически появляться "1" то вы будете знать что происходит. Можно конечно туда еще задержку в пол секунды вставить, чтобы наверняка было заметно даже обычным логическим пробником.

Спасибо большое, да, ошибку обработчик внешн. прерываний вносил.

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

Налаживаю UART - только передачу на комп. Имею проблемы синхронизации. Может быть, дело в #define F_CPU? Для понимания делаю простой цикл, в нем _delay_ms(100) и вывод меандра в порт, для просмотра на осциллографе. Прерывания отключены. Если #define F_CPU 4915200L объявить, то периоды на осциллографе ну никак не соответствует задержкам в миллисекундах. Почему? Есть что-то порядка 1-2 сек.... Убрав F_CPU, имеем что-то ближе к истине.... Вопросы: А) важно ли F_CPU в части работы UART? Б) размах напряжения на кварце всего 100-200 мв -это норма? ATmega162. На ATmega8 делал давно - все работало.

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

Код, схему, фузы, частоту кварца в студию.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Код, схему, фузы, частоту кварца в студию.

Пытаюсь по UART выложить... что касается CPU. Понял так: скажем внутреннее тактирование 1 мгц. Если задать в коде F_CPU 2 мгц, то задержки откомпилируются в 2 раза короче. Если 1 мгц, то норма. Если нет дефайна, то якобы по максимуму... наверное, 20 мгц, т.е. задержка минимальна. Зачем L?

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

По большому счету, компилятор не знает на какой частоте у вас работает контроллер. Поскольку задержки и скорость работы UART зависят напрямую от частоты тактирования, то задавать ПРАВИЛЬНУЮ тактовую частоту просто необходимо! Причем с учетом делителя частоты кварца(фьюзы CKDIV8 и тому подобное). Во вторых, убедитесь что CKSEL вообще выбирает кварц и соответствует его частоте, если неправильно выбрать или налажать со схемотехникой подключения кварца(кривая разводка, несоответствующие емкости нагрузки кварцевого генератора) он может заводится не на своей частоте(овертоны, или на основной частоте если овертон это его рабочая частота).

Маленькая амплитуда это просто экономный режим, плох он только тем что скорость выхода генератора на рабочий режим значительно длиннее чем в сильном режиме - это критично если активно используется энергосберегающий режим контроллера с отключением тактового генератора.

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

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

Лично я телепатией не обладаю (за остальных говорить не буду, вдруг они просто скрывают) и, соответственно, не могу определить, о чем вообще речь. Как именно инициализируется скорость UART? Как тактируется камень? Не "если задать в коде", а реальная тактовая частота, которую из программы изменить нельзя, потому что она задается фузами и кварцем.

Сам по себе #define F_CPU нужен в основном для системных библиотек, но может использоваться и пользовательскими (расчет делителей для таймеров, интерфейсов и прочих модулей), но на тактовую частоту никак не влияет.

Зачем L?
Попробую воспользоваться той телепатией, которой у меня нет. Имеется в виду запись #define F_CPU 20000000L? Тут это указатель на то, что число long.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

Юзаю AvrStudio 6.1. Там нет выбора фузов CKSEL в диапазонах частот. А есть LO, MED, HI. Понятно, что низкие, скажем, до 3 мгц, средние - до 8, и высшие -больше. Это для Меги8 и т.п.. А для Меги162 вообще выбирается только LO - других не дает. Кварц 4 мгц. Есть ставлю LO, потом "докторю". Еще есть EXTXOSC с выбором, но это осциляторы, а не кварцы? Картинку -скрин надо на внешний хостинг выкладывать, что-ли? Так не прикрепляется.

...... Так, оказывается LO - это для 32 кгц. Привычных "XTAL" - как признак внешнего кварца тут нет, вместо него "OSC" - т.е. осциллятор и есть кварц. Тогда допустимы и выбор всех диапазонов.

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

Вообще-то эти вопросы отпадают при поверхностном чтении даташита на микроконтроллер.

есть LO, MED, HI. Понятно, что низкие, скажем, до 3 мгц, средние - до 8, и высшие -больше.
это очень приблизительно, там вообще 16 состояний этих фьюзов, и каждый диапазон имеет несколько вариантов, в даташите и нигде об этом не пишется, но ИМХО это по сути разные настройки цепи ОС кварцевого генератора, от этого зависит устойчивость генерации и ток потребления генератором и соответственно контроллером, скорость выхода в рабочий режим и т.д. Для надежности проще ставить максимальное значение, при этом генератор будет работать стабильней, быстрей стартовать но больше потреблять энергии, и могут быть отклонения частоты от заданной для кварцев с низкой добротностью. А низко частотный режим работы меняет схему работы генератора, поэтому он не работает с высокочастотными кварцами.

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

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

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

важно ли F_CPU в части работы UART?

F_CPU никак не влияет на реальную частоту кварцевого генератора. А вот на работу delay_ms оно влиять будет. Причем если F_CPU не будет соответствовать частоте реального кварца, то и delay_ms будет работать неправильно. Для UART же очень важен выбор частоты кварца и правильный выбор значения в регистре UBRR. При этом нельзя ставить кварц какой попало. В даташите есть таблица с рекомендуемыми частотами и соответствующими им коэффициентами UBRR. И вообще, без единой строчки вашего кода никто никаких полезных рекомендаций вам дать не сможет. Как правильно заметил выше COKPOWEHEU, телепатов здесь нет.

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

Помогите пожалуйста. Разобраться с дисплеем и правильной посылкой команд.

Короче есть дисплей WG12864. Ночью не могу уснуть. Я видел много тем как люди его подцепляли, и сам копировал их программы, вставлял, разбирался, но мне всё же охота сделать своё. Я открыл даташит и много чего не понял. Прошу помощи разобраться в нём.

есть ножка R/W - (Read/Write) что она делает, что читает и что записывает? Если я правильно понял то дисплей сначала записывает в себя W, а потом при выводе на экран нужно R что бы он прочитал то что записал и вывел на экран - Верно ли я понял?

есть ножка D/I - (Data/Instruction) - Data - я понял это параллельный порт, DB0-DB7 по которому передаётся 8 бит информации, а Instruction - это команды типа, Вкл/Выкл Дисплей, и т.п.? верно ли я понял?

Дальше есть стробирующий E - тактовый сигнал, после каждой команды или информации мне его надо посылать длительностью не менее 450нс? верно?

PORT B / PORT D

E RS RW DI S1 S2 / D0 D1 D2 D3 D4 D5 D6 D7

0 1 2 3 4 5 6 7 / 0 1 2 3 4 5 6 7

0 0 0 0 0 0 / 1 1 1 1 1 1 0 0 - Start // Запускаем дисплей

0 0 0 0 0 0 / (0 0 0 0 0 0) 1 0 - X(0-64) // Устанавливаем курсор в ноль по Х

0 0 0 0 0 0 / (0 0 0) 1 1 1 0 1 - Y(0-7) // Устанавливаем курсор в ноль по Y

в atmel studio я начал писать такой код, верны ли мои начинания?

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>int main(void)
{
  DDRD = 0xFF; // - порт D как вывод
  DDRB = 0xFF; // - порт B как вывод
  PORTB = 0b00000000;
_delay_us(1);
  PORTD = 0b00111111; //включаем дисплей
_delay_us(1);
  PORTD = 0b01000000; //курсор по Х на 0
_delay_us(1);
  PORTD = 0b10111000; //курсор по Y на 0
_delay_us(1);

  while(1)
   {
   }
}

Помогите чайнику в начале своего дела, как зажечь точку по координате Х и Y (1,1) - что надо делать дальше? какие команды посылать?

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

R/W - (Read/Write) что она делает, что читает и что записывает?

есть ножка D/I - (Data/Instruction)

Контроллер выставляет на этих выводах логические уровни, в зависмости от того, что передается данные или команда, считываются данные с индикатора на шину или загружаются с шины в индикатор

  • D/I — Данные/команда. Логический уровень на этом выводе определяет предназначение кода на шине данных. 1 — данные, 0 — команда.
  • R/W — Чтение/Запись. Уровень на этой ноге задает тип действия. 1 чтение, 0 запись.

Здесь все описано достаточно подробно для начального уровня:

http://easyelectronics.ru/rabota-s-graficheskim-displeem-wg12864-na-baze-kontrollera-ks0107.html

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

....частоте реального кварца, то и delay_ms будет работать неправильно.

Всем спасибо, но поскольку, как писал выше, имею успешный опыт настройки UART на Mega8, советы не очень помогли :bye: . Причина была в том, что Мега162 имеет фуз SCKDIV8 и мои задержки были в 8 раз больше и в обмене также не было синхронизации. Снял и все стало ОК.

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

  • R/W — Чтение/Запись. Уровень на этой ноге задает тип действия. 1 чтение, 0 запись.

Я в том смысле - что он записывает что читает,... Записывает я понял в память дисплея, т.е. команду с микроконтроллера в ОЗУ дисплея, А чтение это что, Из памяти ОЗУ в микроконтроллер? или из памяти ОЗУ на выход дисплея? Вот что меня интересует, куда запись производится из чего, и откуда и для чего производится чтение.

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

Дисплей так не работает.

Во первых, надо выставить все в соответствии с операцией которую ты хочешь выполнить - сигналы R/W, RS, S1, S2 и D/I на шину данных выставить то что ты хочешь передать в дисплей если производишь запись. И потом выдать короткий импульс на вход E (0-1-0, по даташиту минимальный интервал на который дисплей отреагирует - 450нс, для надежности надо несколько больше - хотя бы 1 мкс) чтобы дисплей понял что это к нему обращаются и выполнил действие которое выставлено на его шине - если операция записи, то он считывает данные на шине и выполняет действие(команду или запись в память). Надо так же иметь в виду что подав команду надо выждать время пока она исполнится, о чем сообщит дисплей если считать с него определенным образом его состояние.

т.е. типичный алгоритм записи в индикатор:

1) установить сигналы E = 0, R/W = 0, RS, S1, S2 и D/I(=1 - команда, =0-данные) согласно необходимого действия

2) установить необходимое значение на шине D0...D7

3) небольшая задержка пару NOP-ов пока все сигналы на шине надежно установятся

4) установить E = 1 не изменяя остальных сигналов

5) подождать минимум 450нс(лучше 1мкс)

6) установить E = 0 не изменяя остальных сигналов

В остальное время следить за тем чтобы состояние сигнала E не менялось!!! иначе в индикатор пойдет мусор...

Грубо говоря индикатор ждет фонт или спад на линии E и только тогда реагирует на состояния остальных выводов.

Чтение из индикатора происходит аналогично, только сначала контроллер должен перевести порт подключенный к D0...D7 в режим ввода и на этапе 5) считать данные с этого порта - там будут данные с индикатора.

где-то в логических состояниях мог ошибиться, поэтому перед применением алгоритмов, уточни полярность импульсов в даташите.

Обычно, я этот алгоритм запихиваю в процедуру, и делаю несколько макросов с осмысленными именами с заранее заданными аргументами (например для чтения из области данных R/W = 1 D/I = 0) так вызов функции не будет мозолить глаза ненужными подробностями.

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

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

Добрый день

Подскажите как можно понять почему не запускается микроконтроллер.

Какие основные должны быть сигналы? Что смотреть в первую очередь?

Конкретный пример. Есть панель приборов от авто с мк моторолла 68HC908AZ60.

Смотрю даташит питание

21 и 22 есть 5 вольт есть

59 и 58 кварц там 4 мГц есть

Что еще надо для запуска? Какие сигналы обязательны?

Сам мк и новый ставил (перелил прошивку) и старый. Хотелось бы понять в общем.

Спасибо заранее

P.S. Если не туда запостил извените

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

Здравствуйте! С новым годом вас, уважаемые радиолюбители!!

Вы, наверное, празднуете еще и не подозреваете, что какой то чайник, сидит и сушит голову над какой то очевидной ерундой...

А ерунда следующая. Я хотел бы сделать, некий электронный потенциометр, и управлять им с помощью МК. Но ничего толкового не получается. Сварганил схемку в ИСИСе, где МК заменил на простые кнопки, не могу добиться плавного переключения сопротивления. Может что подскажете в схеме?? Как, какие изменения сделать??

Как заставить данную схему, работать в двоичном коде? Хотя это не принципиально, тут не так много вариантов чтобы не прописать их каждый по отдельности. Но все равно, есть подозрения что все это не правильно. А как найти в интернете, я даже ключевых слов не предположу чтобы найти то что нужно. Искал типа - электронный потенциометр и прочую фигню писал, все выкидывает какие то спец микросхемы...

res_240.jpgi.gif

Новая папка.rar

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

Фигня... просто возьми специальную м/с цифрового потенциометра. Или тебе надо чисто в "транзисторах"?

На биполярных транзисторах потенциометр не выйдет, поскольку для малых напряжений он будет дико нелинеен.

Можно попробовать R-2R матрицу на основе которой делаются многие ЦАП.

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

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

Ага, так это ЦАП мне нужен... :crazy: Но у найденых в инете, нет середины, тоесть движка резистора...

Развязка нужна... А еще, у меня ведро опто и просто транзисторов.. Почему бы и не использовать их везде где не попадя?

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

нет, не конкретно ЦАП, но обычно все ЦАП-ы построены на основе управляемого потенциометра.

Нужен с отводом посередине - смотри MCP41xxx серию микросхем. Проще гальванически развязать парочку цифровых цепей, чем развязывать цепи управления матрицей переключателей.

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

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

Да, можно купить готовую микросхему, или сервомоторчик или еще какую ни будь хреновину... Но, как раз весь смысл в том, чтобы слепить чудо с ведра хлама. Если начать для каждой поделки, покупать спец приспособины, то не настарчишься на следующую покупку

Блин, ну должно же быть какое то простое решение...

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...