Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры

Войти
Регистрация
Восстановить пароль
 
 
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
#1

Формирование ЧИМ - Микроконтроллер

01.10.2017, 12:46. Просмотров 594. Ответов 20
Метки нет (Все метки)

Здарова, железячники!
Вводная часть:
Кликните здесь для просмотра всего текста

Нужно сделать формирователь случайной импульсной последовательности с фиксированной длит. импульса и случайной задержкой. Хотел бы сделать на пичке, а конкретно - PIC18F1230. Но увы, мне тяжело почему-то дается программирование на языке ассемблера. С чем это связано - хз. Я всегда увлекался высокоуровневыми языками, а сейчас тут одни и те же команды в разных контроллерах могут означать разные вещи/по разному исполнятся. Если увидите глупость - не пинайте сильно.

Кто может помочь с ответами на след. вопросы:
1. Как получить всевдослучайное число для дальнейшего использования?
2. Как заставить МК генерировать сигнал с определенной длительностью и задержкой?
3. Как вообще запустить и прервать работу по нажатию/отжатию кнопки/кнопок?
4. Как зажечь светодиод с помощью МК по нажатию кнопки?

Буду благодарен за информацию, так как хочется разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2017, 12:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Формирование ЧИМ (Микроконтроллер):

Формирование задержек в МК - Микроконтроллер
Добрый день. Нужно в задержке _delay_ms(1) вместо единицы использовать переменную. Возможно ли это? Программирую в среде Atmel Studio...

Формирование синусоиды. - Atmega AVR микроконтроллер
Помогите, пожалуйста. Есть 256 входных импульсов. Нужно на выход, согласно этим импульсам, сформировать синусоиду. Очень нужно. ...

Формирование меандра (8051) - Микроконтроллер
Подскажите или посоветуйте где можно прочесть. Начали изучение микроконтроллера 8051. Задача: На выводе порта Р внутреннего...

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

Формирование задержки "РЕШЕНО" - Atmega AVR микроконтроллер
Коллеги, очень нужна ваша помощь, понимаю, что многие меня сразу подвергнут анафеме, но сознательно иду на это шаг, так как деваться мне...

ASM. Неверное формирование последовательности - Микроконтроллер
Есть программа в Ассемблере и есть схема, смоделируемая в Протеусе. Когда вставляю программу в микропроцессор, включаю схему и вывожу...

20
Сергей 190
253 / 254 / 54
Регистрация: 18.03.2015
Сообщений: 938
01.10.2017, 12:58 #2
Цитата Сообщение от Speed Fighter Посмотреть сообщение
мне тяжело почему-то дается программирование на языке ассемблера. ... Я всегда увлекался высокоуровневыми языками
Тогда, может, вместо PIC18F1230 ардуино взять? За пол часа все четыре вопроса решите.
0
pyzhman
1009 / 450 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
01.10.2017, 16:05 #3
Здарова, железячник!
1. Линейный конгруэнтный метод.
2. ВременнЫе задержки.
3. Простой алгоритм - а. Ждем одного состояния; б. Ждем противного состояния.
4. Если пин кнопки принял такое-то значение, то выставить на пине со светодиодом такое-то.
1
Case-Man
167 / 107 / 21
Регистрация: 02.01.2012
Сообщений: 596
01.10.2017, 16:28 #4
Цитата Сообщение от Speed Fighter Посмотреть сообщение
мне тяжело почему-то дается программирование на языке ассемблера.
Ну так можно на С, в чём проблема-то?
0
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
08.10.2017, 13:24  [ТС] #5
pyzhman, спасибо, надеюсь, что у меня получится.
0
pyzhman
1009 / 450 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
08.10.2017, 13:43 #6
Пожалуйста.
0
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
26.11.2017, 12:39  [ТС] #7
pyzhman,
Порылся я в интернете и не нашел, если честно того, что искал. Алгоритм работы у меня есть:

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

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

Мб есть какие-нибудь хорошие источники? Был бы очень благодарен.
0
Сергей 190
253 / 254 / 54
Регистрация: 18.03.2015
Сообщений: 938
26.11.2017, 13:29 #8
На ардуине
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int buttonPin = 2; //Кнопка
int LED_1 = 7;     //Красный светодиод
int LED_2 = 13;    //Зеленый светодиод
byte Rejim = 0;
 
void setup() {
  pinMode(buttonPin, INPUT_PULLUP); 
  pinMode(LED_1, OUTPUT);  
  pinMode(LED_2, OUTPUT);  
}
 
void loop() {
  if (digitalRead(buttonPin) == LOW) Rejim = !Rejim;
 
  if (Rejim == 0)   {
    digitalWrite(LED_1, HIGH);
    digitalWrite(LED_2, LOW);
    /*вЫключаем генератор*/
  }
  else {
    digitalWrite(LED_1, LOW);
    digitalWrite(LED_2, HIGH);
    /*Включаем генератор*/
  }
 
}
Добавлено через 8 минут
Цитата Сообщение от Speed Fighter Посмотреть сообщение
МК начинает формировать последовательность заданных импульсов.
Какая последовательность импульсов: период, скважность? Можно и на ардуине сделать.
1
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
26.11.2017, 16:07  [ТС] #9
Сергей 190,
Да, период и скважность.
0
pyzhman
1009 / 450 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
26.11.2017, 16:46 #10
C
1
if (digitalRead(buttonPin) == LOW) Rejim = !Rejim;
Жутко любопытно, что будет происходить со светодиодами, если нажатие длится дольше, нежели время исполнения цикла loop.
0
Сергей 190
253 / 254 / 54
Регистрация: 18.03.2015
Сообщений: 938
28.11.2017, 18:58 #11
pyzhman, догадываюсь на что Вы намекаете. И полностью с Вами согласен.
Программа не отлавливает однократного нажатия, и сколько раз произойдет
C++
1
Rejim = !Rejim;
неизвестно.
А диоды, в момент нажатия, горят оба, но с меньшей яркостью.
0
pyzhman
1009 / 450 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
28.11.2017, 19:05 #12
Бяка в том, что не в момент нажатия, а в то время, пока нажата кнопка. А ТС нужно управление при нажатии.
0
_SayHello
313 / 271 / 85
Регистрация: 30.07.2015
Сообщений: 997
29.11.2017, 19:57 #13
Добавить переменную запоминающую состояние кнопки и сравнивайте - если перешел с высокого в низкий значит кнопку нажали. Ну и от дребезга бы избавиться, таймер бы на 100 мс завести и там опрашивать.
0
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
02.12.2017, 14:15  [ТС] #14
Вот я сейчас сел за MPLAB X 4.05, докачал для него компилятор, который сам MPLAB предложил и ещё скачал Протос 8.6.

Конечно, на Ардуинке получился мелкий и простой в осознании код, но хотелось бы самому разобраться и написать на C.

Посмотрел код от Сергей 190, подумал чуть-чуть. Но все равно вопросы возникают:

0. Как выбрать правильно МК под мою задачу?
Кликните здесь для просмотра всего текста
Как минимум, я могу предположить, что МК должен нормально работать с импульсами, имеющими длительность 30 мкс. Но сейчас, как мне кажется, любой, даже самый дешевый МК может это.
Вот я выбрал PIC18F1230, но что-то мне кажется, что это не совсем рационально, т.к. я использую функции в работе только те, которые есть в каждом пичке.


1. Где можно в даташите посмотреть требования к окружающим условиям и к источнику питания? (Я в английском слаб, хотел бы просто ключевые слова получить, если можно).

2. Как я понял из приведенного кода, 1-3 строчки отвечают за "объявление" портов.

Кликните здесь для просмотра всего текста
C++
1
2
3
int buttonPin = 2; //Кнопка
int LED_1 = 7;     //Красный светодиод
int LED_2 = 13;    //Зеленый светодиод
А как их объявить, если я не использую Ардуино?

Нашел вот такой код с комментариями.

C++
1
2
3
4
5
6
7
8
9
10
// === подготовка МК
void podgot (void)
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b00010000; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б
RBPU = 0;  // подтягивающие R (0-вкл, 1-выкл)
}
Т.е. чтобы задать направление порта А (я привел картинку своего МК, там стрелочки показывают, что можно и туда и сюда настраивать) на вход, нужно записать в регистр все нули, а для входа - 00010000 в двоичной или 16 в десятичной.

Посмотрел описание команды TRIS:
http://www.microchip.ru/?mid=3&cid=70

Но она же предназначена для PIC16, а в PIC18 я не нашел её. Так как быть и куда запихивать вообще объявление нужных мне ножек?


3. Как сделать задержку на определенное время?

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

Где-то читал, что цикл for выполняется за 3 такта, а частота моего внутреннего генератора вроде бы 4 МГц (Oscillator frequency), так вот, получается, что 1 итерация цикла задерживает работу на:

http://www.cyberforum.ru/cgi-bin/latex.cgi?\tau = \frac{3}{F} = \frac{3}{4\times1000000} = 0,75\times{10}^{-6} s = 0,75 \mu s.


4. Можно ли выставлять логическую единицу на выходе МК так:

Кликните здесь для просмотра всего текста

C++
1
PORTB = 0b10010001 // На RB0, RB4 и RB7 будет установлен ВЛУ


5. Как узнать, что кнопка нажата?

6. Является ли признаком быдло-кода использование оператора goto программировании МК на C?
0
Миниатюры
Формирование ЧИМ  
Speed Fighter
6 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 162
02.12.2017, 15:00  [ТС] #15
7. Какой из инклудов подключать:

C
1
#include <pic.h>
или

C
1
#include <pic18f1230.inc>
0
02.12.2017, 15:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2017, 15:00
Привет! Вот еще темы с ответами:

Задача. Проверенное формирование на пьезоизлучателе - Микроконтроллер
Разработать алгоритм и написать программу на языке ассемблера, обеспечивающую поочередное формирование на пьезоизлучателе ZQ2 с интервалом...

Формирование задержек в PIC через прерывания - Микроконтроллер
Не могу понять почему период задержки формируемый микроконтроллером на выходе всегда больше в 4 раза чем период срабатывания Timer0....

Формирование и прием импульса одним портом - Микроконтроллер
Добрый вечер, что я сейчас крепко призадумался. Решаю задачу разработки диагностического устройства. За основу взял PIC 16f886 Нужно...

Формирование двух независимых ШИМ-сигналов - Микроконтроллер
Здравствуйте! Подскажите пожалуйста что нужно писать в TACTL для формирования двух ШИМ-сигналов для msp430, если диапазон ШИМ-сигналов от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru