Возможно и это, если Вы разрешите и обслужите ВЛОЖЕННЫЕ прерывания (придется сохранять контекст дважды по уровню максимального вложения). Можно взять более совершенную архитектуру (пик24, например) и вопрос с прерыванием прерывания будет решаться очень просто. Нужно будет только прописать приоритеты.
Доброго времени суток. Тусуюсь в основном в ветке по MCS-51, так как изучаю их (нравятся они мне). Но по работе надо PIC, поэтому пришлось парралельно начать и их изучение. Интересные надо сказать процы оказались, даже не думал. Одни только табличные переходы (возврат по retlw) чего стоят И вот, в процессе изучения возникло несколько вопросов: есть комада movwf (из акумулятора в регистр), а вот вместо обратной команды movfw (из регистра в аккумулятор) надо использовать movf f,0. Но если я в MPLAB IDE наберу movfw, оно выделит ее как существующую команду. Так есть ли такая команда ??? И зачем нужна команда movf f,1 - зачем переписывать регистр сам в себя ? Разве что только считать существующие значения на пинах порта...
Последний раз редактировалось Пока_без_кота Чт дек 10, 2015 15:20:30, всего редактировалось 2 раз(а).
Ну например таким образом можно узнать число отрицательное,положительное или нулевое в регистре, так как команда влияет на флаги N и Z Вместо 0/1 лучше писать MOVF reg,W или MOVF reg,F
_________________ __________________ Все, что нельзя запрограммировать на ассемблере, приходится паять
Пока_без_кота, какая команда на какие влияет флаги - всегда смотрите INSTRUCTION SET SUMMARY на ваш контроллер. Дело в том, что у разных поколений PIC-контроллеров есть отличия в наборе команд и на какие флаги влияет "вроде бы, одна и та же" команда. К примеру, флаги после выполнения команды INCF: у PIC16F87X - флаг Z У PIC18F2X/4XK22 - флаги C, DC, Z, OV, N
Спасибо. Вот не поленился проверить, вбил в свою программку бегущего огонька movfw вместо movf f,0 и оно работает. Хотя такой команды в списке 35 команд моего 16F84 нет))
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 ; Добавим значение указателя к текущему значению счетчика команд, перейдя таким образом на команду возврата с необходимым состоянием порта
Раздел Special Instruction Mnemonics в документе MPASM USER’S GUIDE Там еще много других мнемоник упрощающих жизнь, например BZ k - Branch on Zero = BTFSC 3,2 GOTO k
_________________ __________________ Все, что нельзя запрограммировать на ассемблере, приходится паять
Подскажите еще такой момент. В 8051 есть очень удобная команда сравнения с константой. В Пиках я пока вижу только способ побитной проверки. Например, сравнить инкрементируемую переменную с числом 13 (дес.) = 1101 (дв.). Я начиная от старшего к маладшему проверяю 3,2,0 бит на установку командами btfss, и если 3 бит установлен, проверяю 2, и в конце 0 бит. Существует ли более елегантное решение ? Потому что сравнивать таким способом например с числом 255 это как-то ...
Последний раз редактировалось Пока_без_кота Пн дек 14, 2015 09:51:44, всего редактировалось 2 раз(а).
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
_________________ __________________ Все, что нельзя запрограммировать на ассемблере, приходится паять
Всем привет! Прошу помощи. Имеется схема DC-AC преобразователя, на PIC12F629 в качестве ШИМ. Рабочая частота 25 Кгц. Схему собрал, работает отлично, но хочется разобраться, как в исходнике правильно изменить частоту, на 50Кгц, 100Кгц. В MPLAB, в исходнике, нашёл значение call Temp, потом открыл вкладку VIEW/Programm Memory, отыскал значение 2015, если его меняю (уже в готовом HEX), например на 2018, то получаю частоту около 82кгц.
Объясните пожалуйста на пальцах, какие строчки (значения, числа) подправить, и где они вообще? где эта зависимость микросекунд, к тактовой частоте 4Мгц? как расчитать, какие формулы?
Вот, очистил в исходнике всё лишнее (комментарии), чтобы не отвлекаться, ничего не пойму, как эти буквы влияют на частоту, хоть хвост отстрели. Второй день с кодом бьюсь ((
Это не ШИМ , а генератор прямоугольных импульсов. Зачем править НЕХ, если есть исходник ? Для ШИМа нужно переписать программу. Для изменения частоты тоже нужно править весь исходник. В МПЛАБ есть симулятор и инструменты к нему. Можно наблюдать что и где происходит.
1МЦ (машинный цикл) = 1us (микросекунде) Команда может выполняться за 1МЦ, некоторые за 2. Тут все временнЫе задержки выполнены тупо на счётчиках, что в корне неправильно. Грамотнее, для этой цели, использовать прерывания от таймера.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения