Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 4

Програмирование PIC

10.05.2017, 13:45. Показов 1134. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ТАкое дело программа получает команды из текстового файла через RCREG но читает только первую программу и 1 символ 2. Далее застревает в бесконечном цикле там где RCIF.
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
// PIC16F876 Configuration Bit Settings
 
// 'C' source line config statements
 
// CONFIG
#pragma config FOSC = EXTRC     // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low Voltage In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
#pragma config WRT = OFF         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
 
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
 
#include <xc.h>
#include <PIC16F876.h>
 
#include <stdio.h>
 
#include <string.h>
 
#include <stdlib.h>
 
 
 
#define BUF_SIZE 64
 
char Buffer[BUF_SIZE + 1];
 
char CurChar, CurPos, i;
 
char bExit;
 
void TranslateCommand() {
 
    if (strstr(Buffer, "help ")) {
 
        printf("Terminal system v1.0\n");
 
        printf("Type \'mpl x*y\' to multiply x and y.\n");
 
        printf("Type \'exit\' to exit from terminal.\n");
 
    } else if (strstr(Buffer, "exit")) {
 
        printf("Exit from program.\n");
 
        bExit = 1;
 
    } else if (strstr(Buffer, "mpl ")) {
 
        unsigned int a1 = 0, a2 = 0, mpl = 0;
 
        char * ptr;
 
        ptr = strtok(Buffer, " *");
 
        if (ptr != NULL) {
 
            ptr = strtok(NULL, " *");
 
            if (ptr != NULL) {
 
                a1 = atoi(ptr);
 
                ptr = strtok(NULL, " *");
 
                if (ptr != NULL) {
 
                    a2 = atoi(ptr);
 
                }
 
            }
 
        }
 
        mpl = a1 * a2;
 
        printf("Multiply = %d\n", mpl);
 
    } else {
 
        printf("Unknown command: \'%s\'\n", Buffer);
 
    }
 
}
 
void putch(unsigned char byte) {
 
    while (!TXIF);
 
    TXREG = byte;
 
}
 
unsigned char getch() {
 
    while (!RCIF);
 
    return RCREG;
 
}
 
unsigned char getche(void) {
 
    unsigned char c;
 
    putch(c = getch());
 
    return c;
 
}
 
void main() {
 
    BRGH = 1;
 
    SPBRG = 25;
 
    SPEN = 1;
 
    TXEN = 1;
 
    CREN = 1;
 
    printf("\ Program started.\n");
 
    CurPos = 0;
 
    Buffer[0] = 0;
 
    bExit = 0;
 
    while (bExit == 0) {
 
        CurChar = getche();
 
        if (CurChar == '\n') {
 
            TranslateCommand();
 
            CurPos = 0;
 
            Buffer[0] = 0;
 
        } else {
 
            Buffer[CurPos] = CurChar;
 
            CurPos++;
 
            Buffer[CurPos] = 0;
 
            if (CurPos == BUF_SIZE) {
 
                for (int i = 1; i <= BUF_SIZE; ++i) {
 
                    Buffer[i - 1] = Buffer[i];
 
                }
 
                CurPos--;
 
            }
 
        }
 
    }
 
    printf("Program finished.\n");
 
    while (1);
 
}
Вот файл с командами

wait 1 sec

"h"

wait 20 ms

"e"

wait 20 ms

"l"

wait 20 ms

"p"


wait 20 ms

" "

0a
// mpl

wait 1 sec

"m"

wait 20 ms

"p"

wait 20 ms

"l"

wait 20 ms

" "

wait 20 ms

"1"

wait 20 ms

"2"

wait 20 ms

"*"

wait 20 ms

"3"

wait 20 ms

"4"

wait 20 ms

0a
// exit

wait 1 sec

"e"

wait 20 ms

"x"

wait 20 ms

"i"

wait 20 ms

"t"

wait 20 ms

0a


Вот что выводит
Program started.
help
Terminal system v1.0
Type 'mpl x*y' to multiply x and y.
Type 'exit' to exit from terminal.
m
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2017, 13:45
Ответы с готовыми решениями:

Програмирование микроконтролера
Добрый день, подскажите как реализовать в МК48 отрицательное число? В процесе операции вычитание получается отрицательное число, 7E-FF, в...

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

Вольтметр на PIC
Вольтметр на PIC16F677 нужна помощь в разработке проекта. Технические характеристики: -Индикация тока на 3-разрядном индикаторе с...

12
38 / 38 / 11
Регистрация: 27.09.2014
Сообщений: 491
10.05.2017, 15:52
Цитата Сообщение от AlwaysWannaFly5 Посмотреть сообщение
CurPos++;
Buffer[CurPos] = 0;
Жесть!

getch() - Нафига плодить функции?

Цитата Сообщение от AlwaysWannaFly5 Посмотреть сообщение
Далее застревает в бесконечном цикле там где RCIF
Все правильно: нет данных - висим!

А вообще работу с USORT запихивают в обработчик прерываний и выставляют флаг наличия принятого байта, а в главном цикле контролируют этот флаг - тогда ничего не виснет...
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
10.05.2017, 18:07
Цитата Сообщение от Vovka Посмотреть сообщение
Жесть!
а в чем же "жесть"?
Цитата Сообщение от Vovka Посмотреть сообщение
getch() - Нафига плодить функции?
??
Цитата Сообщение от Vovka Посмотреть сообщение
А вообще работу с USORT запихивают в обработчик прерываний и выставляют флаг наличия принятого байта, а в главном цикле контролируют этот флаг - тогда ничего не виснет...
в прерывание запихивают FIFO, с флагом. Ибо в случае с флагом в главном цикле вообще можно не суетиться с прерываниями, т.к. USORT имеет двойную буферизацию. Другими словами, вы можете делать не софтверный флаг а использовать хардварный, от UART (RXNE).
0
38 / 38 / 11
Регистрация: 27.09.2014
Сообщений: 491
10.05.2017, 19:05
Цитата Сообщение от Voland_ Посмотреть сообщение
а в чем же "жесть"?
Хм, вроде было без +1
Цитата Сообщение от AlwaysWannaFly5 Посмотреть сообщение
char Buffer[BUF_SIZE + 1];
Тогда извиняюсь...

По поводу лишних функций. Вызов каждой функции расходует стек, а тут еще тяжеловесы типа printf()... а у МК памяти и так не ахти...

По прерыванию - ТС хотя бы примитив сделал - уже б не было зацикливаний!
А то еще собаку включит - будет расспрашивать почему МК постоянно сбрасывается
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
11.05.2017, 07:28
Цитата Сообщение от Vovka Посмотреть сообщение
Вызов каждой функции расходует стек,
всегда ли?
вот например у ARMов первые четыре параметра занимают регистры R0-R3 а адрес возврата R13
ни какого стека, насчет PICов не знаю, но думаю что то подобное, все таки разработчики не идиоты
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
11.05.2017, 08:28
Цитата Сообщение от ValeryS Посмотреть сообщение
всегда ли?
в стек же помещается метка возврата... Так что можно сказать, что всегда ). Даже если в GCC поставить аттрибут функции __noreturn__ - все равно компилятор скомпилит вызов, но не прыжок.

...ах да - вспомнил! Если функцию обозначить как static inline (для верности - always inline, в gcc), то она не будет расходовать стек, по крайней мере, от себя .
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
11.05.2017, 19:10
Цитата Сообщение от Voland_ Посмотреть сообщение
в стек же помещается метка возврата...
в ARM нет, адрес возврата в R14 он же LR
если конечно не запихивать функцию в функцию тогда придется сохранять LR, обычно это делают в стеке
Цитата Сообщение от ValeryS Посмотреть сообщение
адрес возврата R13
прошу пардону, обмишурился
1
12.05.2017, 08:03

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
всегда ли?
вот например у ARMов первые четыре параметра занимают регистры R0-R3 а адрес возврата R13
ни какого стека
Предыдущий LR всё равно надо в стек сохранить. Хотя, это и позволяет один уровень сэкономить.

Цитата Сообщение от ValeryS Посмотреть сообщение
насчет PICов не знаю, но думаю что то подобное, все таки разработчики не идиоты
Там (PIC16) маленький аппаратный стек. Поэтому каждая вложенная функция будет расходовать стек.

Цитата Сообщение от Voland_ Посмотреть сообщение
...ах да - вспомнил! Если функцию обозначить как static inline (для верности - always inline, в gcc), то она не будет расходовать стек, по крайней мере, от себя .
Но она будет просто занимать больше места, т.к. она уже становится не функцией, а копирует себя в каждое месте, где она вызывается. Например, функция вызывается в 10 разных местах - значит весь код этой функции будет целиком вставлен во все эти 10 мест. Обычно inline делают маленькие функции, которые вызываются всего из 1 - 2 мест. Кстати, компилятор при включенной оптимизации сам может некоторые обычные функции делать как inline.

0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
12.05.2017, 09:15
Цитата Сообщение от Humanoid Посмотреть сообщение
Кстати, компилятор при включенной оптимизации сам может некоторые обычные функции делать как inline.
...для этого она должна быть (как минимум) static. Объявленная обычная в объектнике функция всегда будет находиться в наборе и будет обособленной, даже если она нигде не вызывается. Вы всегда можете убедиться в этом в map-файле при компиляции (да, я знаю, что есть специальные ключи компилятора, позволяющие раскидывать функции по отдельным объектникам - тогда они будут выкинуты из результата при отсутствии их вызова). Компилятор из не_статик_функции не впихнет ее в код другой функции, даже если она будет вызвана всего один раз. Если это не так - поправьте меня, пожалуйста. Это очень важное (для меня) замечание.

Цитата Сообщение от ValeryS Посмотреть сообщение
в ARM нет, адрес возврата в R14 он же LR
если конечно не запихивать функцию в функцию
Что-то как-то слабое замечание ). А что делать, если в момент работы подпрограммы сработает несколько прерываний, и благодаря NVIC они будут вложены?

Хотя, справедливости ради - спасибо ). Я не знал что регистр используется вместо RAM'а у ARMов, для хранения адреса возврата. Надо будет почитать.
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
12.05.2017, 23:58
Цитата Сообщение от Voland_ Посмотреть сообщение
для этого она должна быть (как минимум) static
Да, согласен. Хотя бы потому, что не-static функции могут быть вызваны из другого объектника. А вот static можно оптимизировать как угодно.

Цитата Сообщение от Voland_ Посмотреть сообщение
Я не знал что регистр используется вместо RAM'а у ARMов, для хранения адреса возврата.
И в MIPS'ах так же. А вот с прерываниями тоже не знаю как разруливается. Возможно, там в самом NVIC есть какие-то регистры, которые хранят адрес возврата... но это просто предположение.
0
13.05.2017, 11:37

Не по теме:

REG'и у ARM'ов канают за RAM'у,
RAM'а у ARM'ов не катит за REG.
Если бы в ARM'e не было REG'ов -
RAM'у у ARM'ов заполнил бы стек!

0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
13.05.2017, 19:04
Цитата Сообщение от Humanoid Посмотреть сообщение
А вот с прерываниями тоже не знаю как разруливается. Возможно, там в самом NVIC есть какие-то регистры, которые хранят адрес возврата
В ARMах при возврате из прерывания, в регистре LR лежит не адрес возврата, а дескриптор, по которому NVIC определяет адрес возврата.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
14.05.2017, 15:12
Цитата Сообщение от paskal Посмотреть сообщение
В ARMах при возврате из прерывания
ну все, появилось время решить для себя вопрос. Вот дока.
Итак, давайте разберемся.

1) насчет "не использования стека в ARM":
When the processor takes an exception, unless the exception is a tail-chained or a late-arriving exception, the processor pushes information onto the current stack.
Регистры R0..R3, R12, LR, PC, xPSR.
2) Насчет использования регистра в качестве адреса возврата/или дескриптора:
The stack frame includes the return address. This is the address of the next instruction in the interrupted program. This value is restored to the PC at exception return so that the interrupted program resumes.
но
The processor saves an EXC_RETURN value to the LR on exception entry. The exception mechanism relies on this value to detect when the processor has completed an exception handler.
Короче говоря, для ускорения выхода из прерывания используется регистр LR, который хранит в себе информацию для выхода из прерывания, чтобы сохранить предыдущий режим, стек и свое состояние. Но при каждом входе в прерывание этот регистр также запихивается в стек аппаратно, чтобы обеспечить "chaining". Дескрипторов NVIC нету на уровне ЦП, равно как и "хранения адреса возврата в регистре". Но спасибо, что дали разобраться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2017, 15:12
Помогаю со студенческими работами здесь

LVP for PIC
Не владею пиками, но есть вопрос. Этот LVP, для пиков требует особой схемы программирования и настройки, как понял, каких то фьюзов.? ...

MicroPascal for PIC
Возникла непонятка с обработкой прерывания на MPascal и симуляции в Proteus 8. К примеру допустим код: program DEMO_CPU_1; ...

Дизассемблер PIC
Есть прошивка на ПИК http://www.obddiag.net/adaptir/obdcan2ec.hex для PIC18F2455 или PIC18F2550, чем её взять. Кто знает достойный,...

Таймер в PIC
Прошу прощения, интересует причина разной работы таймера на одинаковых бордах. Прошивка одна и та же, но при одинаковых настройках таймера,...

mikroPascal for PIC
Господа, а кроме SWK здесь кто-нибудь пользуется микропаскалем для PIC? Как впечатления? Стоит ли вообще его изучать?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru