помощ лузерам в прогромировании МК PIC
- КРАМ
- Друг Кота
- Сообщения: 25124
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: помощ лузерам в прогромировании МК PIC
Возможно и это, если Вы разрешите и обслужите ВЛОЖЕННЫЕ прерывания (придется сохранять контекст дважды по уровню максимального вложения).
Можно взять более совершенную архитектуру (пик24, например) и вопрос с прерыванием прерывания будет решаться очень просто. Нужно будет только прописать приоритеты.
Можно взять более совершенную архитектуру (пик24, например) и вопрос с прерыванием прерывания будет решаться очень просто. Нужно будет только прописать приоритеты.
Re: помощ лузерам в прогромировании МК PIC
Прерываний много, вектор один.wss60 писал(а):Значит в pic16 только одно прерывание
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: помощ лузерам в прогромировании МК PIC
Доброго времени суток. Тусуюсь в основном в ветке по MCS-51, так как изучаю их (нравятся они мне). Но по работе надо PIC, поэтому пришлось парралельно начать и их изучение. Интересные надо сказать процы оказались, даже не думал. Одни только табличные переходы (возврат по retlw) чего стоят
И вот, в процессе изучения возникло несколько вопросов: есть комада movwf (из акумулятора в регистр), а вот вместо обратной команды movfw (из регистра в аккумулятор) надо использовать movf f,0. Но если я в MPLAB IDE наберу movfw, оно выделит ее как существующую команду. Так есть ли такая команда ??? И зачем нужна команда movf f,1 - зачем переписывать регистр сам в себя ? Разве что только считать существующие значения на пинах порта...
Последний раз редактировалось Пока_без_кота Чт дек 10, 2015 15:20:30, всего редактировалось 2 раза.
-
driver_gv
- Потрогал лапой паяльник
- Сообщения: 399
- Зарегистрирован: Сб авг 08, 2009 23:02:57
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: помощ лузерам в прогромировании МК PIC
Ну например таким образом можно узнать число отрицательное,положительное или нулевое в регистре, так как команда влияет на флаги N и Z
Вместо 0/1 лучше писать MOVF reg,W или MOVF reg,F
Вместо 0/1 лучше писать MOVF reg,W или MOVF reg,F
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: помощ лузерам в прогромировании МК PIC
Пока_без_кота, какая команда на какие влияет флаги - всегда смотрите INSTRUCTION SET SUMMARY на ваш контроллер.
Дело в том, что у разных поколений PIC-контроллеров есть отличия в наборе команд и на какие флаги влияет "вроде бы, одна и та же" команда.
К примеру, флаги после выполнения команды INCF:
у PIC16F87X - флаг Z
У PIC18F2X/4XK22 - флаги C, DC, Z, OV, N
Дело в том, что у разных поколений PIC-контроллеров есть отличия в наборе команд и на какие флаги влияет "вроде бы, одна и та же" команда.
К примеру, флаги после выполнения команды INCF:
у PIC16F87X - флаг Z
У PIC18F2X/4XK22 - флаги C, DC, Z, OV, N
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: помощ лузерам в прогромировании МК PIC
Спасибо. Вот не поленился проверить, вбил в свою программку бегущего огонька movfw вместо movf f,0 и оно работает. Хотя такой команды в списке 35 команд моего 16F84 нет))
Спойлер
Код: Выделить всё
list p=16F84A
__Config 3FF1
pcl equ 02
status equ 03
portA equ 05
trisA equ 05
portB equ 06
trisB equ 06
pointer equ 10
del_1 equ 11
del_2 equ 12
org 0
start
bsf status,5 ; Выбор 1 банка памяти
movlw b'00011111' ; Весь порт на ввод
movwf trisA ; W в trisA
movlw b'00000000' ; Весь порт на вывод
movwf trisB ; W в trisB
bcf status,5 ; Выбор 0 банка памяти
Main
movlw 0 ; Потушим весь порт
movwf portB ; Перенос W в portB
movwf pointer ; Очищаем указатель
Loop
movfw pointer ; Указатель в аккумулятор, по нему будем вытягивать из поисковой таблицы состояние порта
call Table ; Перейдем в поисковую таблицу
movwf portB ; Выведем то, что взяли из нее, в порт В
call Delay
incf pointer,1 ; Увеличим указатель
btfsc pointer,3 ; Если 3 бит установлен, значит счетчик уже досчитал до 8 (00001000), а значит пора его обнулять
clrf pointer ; Досчитали до 8, обнуляем
goto Loop ; Зациклимся
;*****************************************************
Delay
movlw d'255'
movwf del_2
Reload_del_1
movlw d'255'
movwf del_1
No_reload_del
decfsz del_1,1
goto No_reload_del
decfsz del_2,1
goto Reload_del_1
return
;******************************************************
Table
addwf pcl ; Добавим значение указателя к текущему значению счетчика команд, перейдя таким образом на команду возврата с необходимым состоянием порта
retlw b'00000001'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00010000'
retlw b'00100000'
retlw b'01000000'
retlw b'10000000'
end
-
driver_gv
- Потрогал лапой паяльник
- Сообщения: 399
- Зарегистрирован: Сб авг 08, 2009 23:02:57
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: помощ лузерам в прогромировании МК PIC
Раздел Special Instruction Mnemonics в документе MPASM USER’S GUIDE
Там еще много других мнемоник упрощающих жизнь, например
BZ k - Branch on Zero =
BTFSC 3,2
GOTO k
Там еще много других мнемоник упрощающих жизнь, например
BZ k - Branch on Zero =
BTFSC 3,2
GOTO k
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
Re: помощ лузерам в прогромировании МК PIC
Я эти макросы начинающим не показывал бы. Они их путают с командами со всеми вытекающими.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: помощ лузерам в прогромировании МК PIC
scorpi_0n, полностью поддерживаю.
Лучше, пусть смотрят список команд в документации на контроллер (у Microchip-а эта информация "на поверхности").
Лучше, пусть смотрят список команд в документации на контроллер (у Microchip-а эта информация "на поверхности").
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: помощ лузерам в прогромировании МК PIC
Подскажите еще такой момент. В 8051 есть очень удобная команда сравнения с константой. В Пиках я пока вижу только способ побитной проверки. Например, сравнить инкрементируемую переменную с числом 13 (дес.) = 1101 (дв.). Я начиная от старшего к маладшему проверяю 3,2,0 бит на установку командами btfss, и если 3 бит установлен, проверяю 2, и в конце 0 бит. Существует ли более елегантное решение ? Потому что сравнивать таким способом например с числом 255 это как-то ...
Последний раз редактировалось Пока_без_кота Пн дек 14, 2015 09:51:44, всего редактировалось 2 раза.
-
driver_gv
- Потрогал лапой паяльник
- Сообщения: 399
- Зарегистрирован: Сб авг 08, 2009 23:02:57
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: помощ лузерам в прогромировании МК PIC
XORLW Constant сравнение W с константой, результат Флаг Z =1 значит равны
XORWF Reg, W/F сравнение W с регистром , результат Флаг Z =1 значит равны, модификация регистра или W
сравнение вычитанием
MOVLW CONST
SUBWF REG,W/F
Z=1 - РАВНЫ
С=1 - REG>=CONST
Для 18 серии смотрите также
CPFSEQ
CPFSGT
CPFSLT
XORWF Reg, W/F сравнение W с регистром , результат Флаг Z =1 значит равны, модификация регистра или W
сравнение вычитанием
MOVLW CONST
SUBWF REG,W/F
Z=1 - РАВНЫ
С=1 - REG>=CONST
Для 18 серии смотрите также
CPFSEQ
CPFSGT
CPFSLT
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
Все, что нельзя запрограммировать на ассемблере, приходится паять
-
Пока_без_кота
- Потрогал лапой паяльник
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Re: помощ лузерам в прогромировании МК PIC
driver_gv писал(а):XORLW...
Спасибо, оперативно
Re: помощ лузерам в прогромировании МК PIC
Всем привет! Прошу помощи.
Имеется схема DC-AC преобразователя, на PIC12F629 в качестве ШИМ. Рабочая частота 25 Кгц.
Схему собрал, работает отлично, но хочется разобраться, как в исходнике правильно изменить частоту, на 50Кгц, 100Кгц.
В MPLAB, в исходнике, нашёл значение call Temp, потом открыл вкладку VIEW/Programm Memory, отыскал значение 2015, если его меняю (уже в готовом HEX), например на 2018, то получаю частоту около 82кгц.
Объясните пожалуйста на пальцах, какие строчки (значения, числа) подправить, и где они вообще? где эта зависимость микросекунд, к тактовой частоте 4Мгц? как расчитать, какие формулы?
Вот, очистил в исходнике всё лишнее (комментарии), чтобы не отвлекаться, ничего не пойму, как эти буквы влияют на частоту, хоть хвост отстрели. Второй день с кодом бьюсь ((
#include <p12f629.inc>
__CONFIG _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
#DEFINE Pos GPIO,0
#DEFINE Neg GPIO,1
#DEFINE LED GPIO,2
#DEFINE Syn GPIO,4
CBLOCK 0x20
Clign1 : 1
Clign2 : 1
ENDC
org 0x000
bcf STATUS,RP0
clrf GPIO
movlw 0x07
movwf CMCON
bsf STATUS,RP0
clrf TRISIO
call 3FFh
movwf OSCCAL
bcf STATUS,RP0
Debut clrf GPIO
Altp0
bsf Pos
bsf Syn
call Temp
bcf Pos
nop
nop
bsf Neg
bcf Syn
call Temp
bcf Neg
goto Altp0
Temp incf Clign1,F
btfsc STATUS,Z
incf Clign2,F
btfss STATUS,Z
nop
btfsc Clign2,4
bsf LED
btfss Clign2,4
bcf LED
nop
nop
return
END
Имеется схема DC-AC преобразователя, на PIC12F629 в качестве ШИМ. Рабочая частота 25 Кгц.
Схему собрал, работает отлично, но хочется разобраться, как в исходнике правильно изменить частоту, на 50Кгц, 100Кгц.
В MPLAB, в исходнике, нашёл значение call Temp, потом открыл вкладку VIEW/Programm Memory, отыскал значение 2015, если его меняю (уже в готовом HEX), например на 2018, то получаю частоту около 82кгц.
Объясните пожалуйста на пальцах, какие строчки (значения, числа) подправить, и где они вообще? где эта зависимость микросекунд, к тактовой частоте 4Мгц? как расчитать, какие формулы?
Вот, очистил в исходнике всё лишнее (комментарии), чтобы не отвлекаться, ничего не пойму, как эти буквы влияют на частоту, хоть хвост отстрели. Второй день с кодом бьюсь ((
Спойлер
LIST p=12F629#include <p12f629.inc>
__CONFIG _MCLRE_OFF & _CP_OFF & _CPD_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
#DEFINE Pos GPIO,0
#DEFINE Neg GPIO,1
#DEFINE LED GPIO,2
#DEFINE Syn GPIO,4
CBLOCK 0x20
Clign1 : 1
Clign2 : 1
ENDC
org 0x000
bcf STATUS,RP0
clrf GPIO
movlw 0x07
movwf CMCON
bsf STATUS,RP0
clrf TRISIO
call 3FFh
movwf OSCCAL
bcf STATUS,RP0
Debut clrf GPIO
Altp0
bsf Pos
bsf Syn
call Temp
bcf Pos
nop
nop
bsf Neg
bcf Syn
call Temp
bcf Neg
goto Altp0
Temp incf Clign1,F
btfsc STATUS,Z
incf Clign2,F
btfss STATUS,Z
nop
btfsc Clign2,4
bsf LED
btfss Clign2,4
bcf LED
nop
nop
return
END
- Вложения
-
- MPLAB.rar
- (72.65 КБ) 144 скачивания
Последний раз редактировалось 501 Вт дек 15, 2015 00:58:09, всего редактировалось 1 раз.
Re: помощ лузерам в прогромировании МК PIC
Это не ШИМ , а генератор прямоугольных импульсов.
Зачем править НЕХ, если есть исходник ?
Для ШИМа нужно переписать программу.
Для изменения частоты тоже нужно править весь исходник.
В МПЛАБ есть симулятор и инструменты к нему. Можно наблюдать что и где происходит.
Зачем править НЕХ, если есть исходник ?
Для ШИМа нужно переписать программу.
Для изменения частоты тоже нужно править весь исходник.
В МПЛАБ есть симулятор и инструменты к нему. Можно наблюдать что и где происходит.
Re: помощ лузерам в прогромировании МК PIC
1МЦ (машинный цикл) = 1us (микросекунде)501 писал(а):как расчитать, какие формулы?
Команда может выполняться за 1МЦ, некоторые за 2.
Тут все временнЫе задержки выполнены тупо на счётчиках, что в корне неправильно.
Грамотнее, для этой цели, использовать прерывания от таймера.