Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
1

Формирование ЧИМ

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

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

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

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

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

Формирование задержек в МК
Добрый день. Нужно в задержке _delay_ms(1) вместо единицы использовать...

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

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

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

формирование 3 импульсных сигналов
собственно задание вроде нетрудное, но навыков нет, поэтому ступор....

20
Сергей 190
259 / 258 / 56
Регистрация: 18.03.2015
Сообщений: 967
01.10.2017, 12:58 2
Цитата Сообщение от Speed Fighter Посмотреть сообщение
мне тяжело почему-то дается программирование на языке ассемблера. ... Я всегда увлекался высокоуровневыми языками
Тогда, может, вместо PIC18F1230 ардуино взять? За пол часа все четыре вопроса решите.
0
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,680
01.10.2017, 16:05 3
Здарова, железячник!
1. Линейный конгруэнтный метод.
2. ВременнЫе задержки.
3. Простой алгоритм - а. Ждем одного состояния; б. Ждем противного состояния.
4. Если пин кнопки принял такое-то значение, то выставить на пине со светодиодом такое-то.
1
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
01.10.2017, 16:28 4
Цитата Сообщение от Speed Fighter Посмотреть сообщение
мне тяжело почему-то дается программирование на языке ассемблера.
Ну так можно на С, в чём проблема-то?
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
08.10.2017, 13:24  [ТС] 5
pyzhman, спасибо, надеюсь, что у меня получится.
0
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,680
08.10.2017, 13:43 6
Пожалуйста.
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
26.11.2017, 12:39  [ТС] 7
pyzhman,
Порылся я в интернете и не нашел, если честно того, что искал. Алгоритм работы у меня есть:

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

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

Мб есть какие-нибудь хорошие источники? Был бы очень благодарен.
0
Сергей 190
259 / 258 / 56
Регистрация: 18.03.2015
Сообщений: 967
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
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
26.11.2017, 16:07  [ТС] 9
Сергей 190,
Да, период и скважность.
0
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,680
26.11.2017, 16:46 10
C
1
if (digitalRead(buttonPin) == LOW) Rejim = !Rejim;
Жутко любопытно, что будет происходить со светодиодами, если нажатие длится дольше, нежели время исполнения цикла loop.
0
Сергей 190
259 / 258 / 56
Регистрация: 18.03.2015
Сообщений: 967
28.11.2017, 18:58 11
pyzhman, догадываюсь на что Вы намекаете. И полностью с Вами согласен.
Программа не отлавливает однократного нажатия, и сколько раз произойдет
C++
1
Rejim = !Rejim;
неизвестно.
А диоды, в момент нажатия, горят оба, но с меньшей яркостью.
0
pyzhman
782 / 477 / 65
Регистрация: 15.05.2012
Сообщений: 2,680
28.11.2017, 19:05 12
Бяка в том, что не в момент нажатия, а в то время, пока нажата кнопка. А ТС нужно управление при нажатии.
0
_SayHello
574 / 328 / 108
Регистрация: 30.07.2015
Сообщений: 1,188
29.11.2017, 19:57 13
Добавить переменную запоминающую состояние кнопки и сравнивайте - если перешел с высокого в низкий значит кнопку нажали. Ну и от дребезга бы избавиться, таймер бы на 100 мс завести и там опрашивать.
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
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
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
02.12.2017, 15:00  [ТС] 15
7. Какой из инклудов подключать:

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

C
1
#include <pic18f1230.inc>
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
02.12.2017, 16:53  [ТС] 16
Состряпал я код (пока что без кнопочки и светодиодов, только для генерации) на С. MPLABX v4.05 не хочет его компилировать.

Сам код:
Кликните здесь для просмотра всего текста
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <pic.h>  // Библитека пичков
#include <stdio.h>
#include <stdlib.h>
#include <pic18f1230.h> // Библиотека конкретного пичка
 
#define SIGNAL 30 // Длительность сигнала в мкс
#define DELMIN 100 // Минимальное время задержки в мкс
#define DELMAX 400000 // Максимальное время задержки в мкс
 
 
void delay(int type); // Функция задержки 
void Prepare(void); // Функция подготовки МК
 
int main(int argc, char** argv)
{
    Prepare(); // Запуск подготовки МК
    while(1) // Бесконечный цикл, основная задача МК
    {
        delay(0); // Задержка межуд сигналами
        TRISB = 0b00010000; // Подаем на выход лог. единицу
        delay(1); // Длительность сигнала
        TRISB = 0b00000000; // Выставляем лог. ноль        
    }
    return (EXIT_SUCCESS);    
}
 
void delay(int type) // Функция задержки
{
    int N; // Локальная переменная для промежуточных присвоений
    if(type == 0)
    {
        N = DELMIN + rand() % DELMAX; // Формируем случайную задержку
    }
    else
    {
        N = SIGNAL; // Определяем длительность сигнала
    }
    
    for(int i = 0; i <= N; i++) {} // Держим заданный лог. уровень
}
 
// Подготовка МК
void Prepare(void)
{
    TRISA = 0b00000000; // Направление работы ножек порта А
    TRISB = 0b00010000; // Направление работы ножек порта В
    CMCON = 0x07; // Отключение компараторов
    PORTA = 0; // Очищаем порт А
    PORTB = 0; // Очищаем порт Б
    RBPU = 0;  // Подтягивающие R (0-вкл, 1-выкл)
}


Ошибки:

Кликните здесь для просмотра всего текста
E:\Development environment\MPLABX\Compiler\include\pic_chip_select.h:3588: error: (103) #error: Device-specific header could not be found for target chip
E:\Development environment\MPLABX\Compiler\include\pic.h:25: warning: (111) redefining preprocessor macro "CLRWDT" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 39)
E:\Development environment\MPLABX\Compiler\include\pic.h:26: warning: (111) redefining preprocessor macro "SLEEP" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 47)
E:\Development environment\MPLABX\Compiler\include\pic.h:42: warning: (111) redefining preprocessor macro "__CONFIG" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 53)
E:\Development environment\MPLABX\Compiler\include\pic.h:45: warning: (111) redefining preprocessor macro "__IDLOC" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 57)
E:\Development environment\MPLABX\Compiler\include\pic.h:50: warning: (111) redefining preprocessor macro "__PROG_CONFIG" (E:\Development environment\MPLABX\Compiler\include\pic18.h: 50)
(908) exit status = 1


Проект прикладываю.
0
Вложения
Тип файла: rar Programm.X.rar (33.9 Кб, 0 просмотров)
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
03.12.2017, 04:05 17
Цитата Сообщение от Speed Fighter Посмотреть сообщение
MPLABX v4.05 не хочет его компилировать.
MPLABX сам ничего не компилирует, компилятор нужно ставить отдельно, а их несколько разных
У меня XC8 этот проект обработал и hex сделал.
Правда, у него свой хедер:
C
1
2
3
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
тут лежит HEX
Код
:040000000DEF07F009
:100DD80001000000000E926E100E936E070EB46EA6
:100DE800000E806E000E816EF19E1200EEEC06F091
:100DF800000E1A6E000E196E74EC07F0100E936E4A
:100E0800000E1A6E010E196E74EC07F0000E936E48
:100E1800EFD7D80EF66E0D0EF76E000EF86E00EED8
:100E280025F010EE04F00900F5CFEEFFE550E15093
:100E3800FAE10001FAEF06F025C001F026C002F041
:100E480027C003F028C004F06D0E056E4E0E066E26
:100E5800C60E076E410E086E49EC07F001C025F07A
:100E680002C026F003C027F004C028F0390E25265A
:100E7800300E2622000E2722000E2822FF0E2714ED
:100E88000D6E7F0E28140E6E1200000E096E000EF5
:100E98000A6E000E0B6E000E0C6E01A008D00550F5
:100EA800092606500A2207500B2208500C22D89017
:100EB8000536063607360836D89004320332023231
:100EC80001320150021003100410D8A4E6D709C05B
:100ED80001F00AC002F00BC003F00CC004F01200CD
:100EE80019501A10D8A41CD020EC07F00DC00FF030
:100EF8000EC010F0000E10BEFF0E116E126E800EA6
:100F0800136E1A0E146E060E156E000E166EAAECEF
:100F180007F0640E0F241C6E000E10201D6E04D006
:100F2800000E1D6E1E0E1C6E000E1F6E000E1E6E35
:100F380002D01E4A1F2A1E501C5C1D50800A1B6EC0
:100F48001F50800A1B58D8A01200F3D7000E186E45
:100F580012AE0AD0121E111E101E0F6C000E1022A7
:100F680011221222010E186E16AE08D0161E151E7A
:100F7800141E136C000E142215221622135014107E
:100F880015101610D8B424D0010E176E06D0D890BC
:100F98001336143615361636172A16AEF8D71350E8
:100FA8000F5C145010581550115816501258D8A0EC
:100FB80008D013500F5E1450105A1550115A16507D
:100FC800125AD8901632153214321332172EE7D728
:100FD8001850D8B408D0121E111E101E0F6C000E27
:100FE8001022112212220FC00FF010C010F011C0F1
:080FF80011F012C012F012000A
:020000040020DA
:08000000FFFFFFFFFFFFFFFF00
:020000040030CA
:0E000000FF071F1F0E8181FF03C003E00340B6
:00000001FF
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
03.12.2017, 07:57  [ТС] 18
Case-Man, спасибо, с этим разобрался. Только вот хотел бы узнать, как правильно подобрать компилятор под задачу?
0
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
03.12.2017, 15:37 19
Вроде как линейка XC продвигается как последнее слово их разработки.
0
Speed Fighter
Верховный Тюлень
43 / 10 / 3
Регистрация: 29.03.2015
Сообщений: 177
06.12.2017, 22:21  [ТС] 20
На PIC18F1230 сделаль, хоть и с костылями. На PIC10F322 проблемы. Не горит красный светодиод при нажатой кнопке выключения:

Код:


Кликните здесь для просмотра всего текста
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Подключение нужных библиотек
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
 
#define _XTAL_FREQ 8000000 // Тактовая частота 4 МГц
 
#define SIGNAL 30 // Длительность сигнала в мкс
#define DELMIN 100 // Максимальная задержка в мкс
#define DELMAX 400000 // Максимальная задержка в мкс
 
// PIC10F322 Configuration Bit Settings
 
// 'C' source line config statements
 
// CONFIG
#pragma config FOSC = EC        // Oscillator Selection bits (EC: CLKIN function enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config WDTE = OFF        // Watchdog Timer Enable (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = ON          // Code Protection bit (Program memory code protection is enabled)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)
#pragma config LPBOR = ON       // Brown-out Reset Selection bits (BOR enabled)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
 
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
 
void Prepare(); // Функция подготовки МК
 
int main()
{
    Prepare(); // Запуск функции подготовки      
    int K = 4; 
    while(1) // Бесконечный цикл работы
    {   
        if(RA3 == 1) // Проверка на нажатые кнопки
        {
            RA2 = 1; // Зажигаем зеленый светодиод
            srand(K); // Инициализация генератора случайных импульсов
            K = DELMIN + rand ()% DELMAX; // Присвоение псевдослучайного числа 
            for(int i = 0; i <= K/60; i++) {} // Пустой цикл задержки
            //__delay_us(SIGNAL-4); // Определяем задержку
            RA1 = 1; // Подаем на выход лог. единицу
            __delay_us(SIGNAL-2); // Определяем длительность сигнала
            RA1 = 0; // Подаем на выход лог. ноль   
        }
        else
        {
            RA2 = 0; // Зажигаем красный светодиод
            RA1 = 0; // На выход ставил лог. ноль
        }       
    }
    return 0;    
}
 
// Функция подготовки
void Prepare()
{
    TRISA = 0b1000; // Направление работы ножек порта А (вход)
    PORTA = 0b0000; // очищаем порт А
}


Проект в протосе и схемку прикладываю.
0
Миниатюры
Формирование ЧИМ  
Вложения
Тип файла: rar PIC10F322.rar (71.6 Кб, 0 просмотров)
Тип файла: rar PIC10F322.X.production.rar (1.1 Кб, 0 просмотров)
06.12.2017, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2017, 22:21

ASM. Неверное формирование последовательности
Есть программа в Ассемблере и есть схема, смоделируемая в Протеусе. Когда...

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

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


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

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

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