Всем добрый вечер. Первые дни играю с контроллером, собрал программатор, поиграл с готовыми проектами (бинарый счетчик до 15, цифровая кость).
Читал один учебничек, где приведен код для мигалки простенькой (ну синтаксис понятен), а вот не работает и все тут. То есть как, только начальное состояние отображает и все. Никакой анимации. Спойлер
Код:
LIST P=PIC16F628A __CONFIG 0x3FF1 STATUS EQU 0x0003 PORTB EQU 0x0006 TRISB EQU 0x0006 PORTA EQU 0x0005 TRISA EQU 0x0005 Reg_1 EQU 0x000C Reg_2 EQU 0x000D Reg_3 EQU 0x000E
ORG 0 ; подготовительные моменты bsf STATUS,5 ; переход в Банк 1 clrf TRISB clrf TRISA bcf STATUS,5 ; переход назад в Банк 0
m1 movlw 0x0 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0x0 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x20 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x30 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x8 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0xC ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
call miganie
movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x18 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x8 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x0 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x5 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
movlw 0x1 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
call miganie goto m1 ; переход на метку (зацикливание)
miganie movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) movlw 0x0 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0x2 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) movlw 0x0 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0x2 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) movlw 0x0 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0x2 ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) return
end ; конец программы
*** маленькая подробность, схема собрана как для цифровой кости, на ней и играюсь. соответственно у меня задумка в коде: 1) начинать зажигать сегменты с A до F 2) помигать поочередно (A-F) и G 3) начинать тушить сегменты с A до F 4) вернуться к пункту 1
Вложения:
Комментарий к файлу: Цифровая кость 01.gif [9.47 KiB]
Скачиваний: 980
Написано неправильно LIST P=16F628A с отступом. #INCLUDE <p16F628a.inc> после вставки этого файла у вас полезут ошибки. Вы пользуетесь программой для вычисления задержек, в ней нужно дописывать RETURN. При выборе ячеек ОЗУ см файл Microchip/MPASM Suite/P16F628.INC ; RAM Definition ; ;====================
__MAXRAM H'01FF' __BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E' как видите 0х0D нельзя использовать В настройке МК нужно учитывать и вкл или выкл всю переферию , а не только ПОРТА ПОРТВ Впредь выкладывайте проект MPLAB
miganie movlw 0x38 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт movlw 0xD ; запись в аккумулятор movwf PORTA ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом)
Поигрался с анимацией еще, с опросом кнопки и еще по мелочи.
Новые задачи - новые проблемы. Пытаюсь сделать счетчик. (схема та же, пишу под нее же) Нажатие на кнопку дает +1 начинает с 0, если 9 на индикаторе, то помигать Н и сбросить на 0(это я допишу, не проблема:) У меня не считает, на кнопку реагирует неадекватно. Буду признателен за помощь. Еще беда, никак не пойму как мне таблицу прикрутить в моем случае. В простых примерах там индикатор на портуВ висит весь. У меня половина там, половина там. Мой ход мысли в коде хоть немножко правильный?) Спойлер
Код:
LIST P=PIC16F628A __CONFIG 0x3F11 F EQU 1 W EQU 0 STATUS EQU 0x003 C EQU 0x0 TRISA EQU 0x005 PORTA EQU 0x005 Rega EQU 0x001A Regb EQU 0x001B TRISB EQU 0x006 PORTB EQU 0x006 Reg_1 EQU 0x000C Reg_2 EQU 0x000F Reg_3 EQU 0x000E Reg_4 EQU 0x0011 regw EQU 0x001C PC EQU 0x002
org 0 ; начало программы bsf STATUS,5 ; переход в Банк 1 movf b'0000001',1 movwf TRISB clrf TRISA bcf STATUS,5 ; переход назад в Банк 0 clrf Reg_4 movlw 0x38 movwf PORTB movlw 0xd movwf PORTA
; отслеживание нажатий кнопок m3 btfss PORTB,0 ; бит-проверка ножки RA3 - увеличение goto m2 goto m3 ; зацикливание проверки ; проверка на 9 (на крайнее значение) и увеличение значения регистра
m2 bcf STATUS,0 ; опускаем флаг С в ноль movlw .247 ; (255-9)+1 = 247 -> W addwf Reg_4,0 ; (Reg_4)+W btfss STATUS,C ; goto m1 goto m4
m1 incf Reg_4,0 ; увеличить значение на 1 и сохранить movwf Regb incf Regb,0 movwf Rega
;================== TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W retlw 0x38 ; 0 B retlw 0xD ; 0 A retlw b'11000' ; 1 B retlw 0x0 ; 1 A retlw b'110000' ; 2 B retlw b'1110' ; 2 A retlw b'111000' ; 3 B retlw b'1010' ; 3 A retlw b'11000' ; 4 B retlw b'11' ; 4 A retlw b'101000' ; 5 A retlw b'1011' ; 5 B retlw b'101000' ; 6 B retlw b'1111' ; 6 A retlw b'11000' ; 7 B retlw b'10' ; 7 A retlw b'111000' ; 8 B retlw b'1111' ; 8 A retlw b'111000' ; 9 B retlw b'1011' ; 9 A retlw b'011000' ; H B retlw b'0111' ; H A ;==================
Pause movlw .221 movwf Reg_1 movlw .130 movwf Reg_2 wr decfsz Reg_1, F goto wr decfsz Reg_2, F goto wr nop nop return end ; конец программы
Уважаемый! Вы плохой ученик. Почему не исправили ошибки? Не верите мне посмотрите пример < Microchip\MPASM Suite\Template\Code\16F628ATEMP.ASM>. Нет необходимости описывать спец. регистры они в файле INC уже назначены. Инициализация МК не сделана. Для кнопки нужно ввести антидребезг.
Каюсь, я плохой ученик. и все-таки, почему не идет подсчет (или он просто не показывает значение, так как в таблице не все так тривиально...) Код поправил, откомментировал, выровнял, кнопку в режиме антидребезг туда прописал, кнопку опрашивает. (но дальше ничего нет). Спойлер
BCF INTCON,GIE ; прерывания BCF RCSTA,7 ; USART off BCF CCP1CON,3 ; CCP off BCF CCP1CON,2 ; CCP off BCF CCP1CON,1 ; CCP off BCF CCP1CON,0 ; CCP off MOVLW 007h ; Порт A ВЫКЛЮЧАЕМ КОМПАРАТОРЫ MOVWF CMCON bsf STATUS,5 ; переход в Банк 1 movlw b'0000001' ; запись в W movwf TRISB ; порты В на выход, кроме RB0 он на кнопку clrf TRISA ; порты А на выход bcf STATUS,5 ; переход назад в Банк 0 clrf Reg_4 ; очищаем регистр movlw 0x38 ; зажигаем 3 сегмента порта В (5,4,3) movwf PORTB ; movlw 0xd ; аналогично с А (3,2,0) movwf PORTA ;
; отслеживание нажатия кнопки
m1 btfss PORTB,0 ; бит-проверка ножки RB0 goto m1 ; если нажата, то RB0=1, перескакиваем на m2 m2 btfsc PORTB,0 ; бит-проверка ножки RA2 goto m2 ; отслеживаем отжатие кнопки
; проверка на 9 (на крайнее значение) и увеличение значения регистра m12 bcf STATUS,C ; опускаем флаг С в ноль movlw .247 ; (255-9)+1 = 247 -> W addwf Reg_4,0 ; (Reg_4)+W btfss STATUS,C ; Если переноса не было то идем на метку m11 goto m11 ; Если не было переноса goto m14 ; если был перенос, перескакиваем сюда
m11 incf Reg_4,F ; увеличить значение на 1 и сохранить
m14 movf Reg_4,1 ; копируем в W значение movwf Regb ; Копируем из W в регВ incf Regb,0 ; Увеличиваем га единичку и оставляем в W movwf Rega ; Копируем из W в регА (строчка ниже строчки В, запаздывает на единицу) Movf Regb,W ; Копируем в W содержимое регВ call TABLE ; обращение к таблице с готовым набором цифр movwf PORTB ; запись того что выдернуто из таблицы в регистр портаВ ; аналогично с портом А Movf Rega,W ; копируем в W содержимое регистра регА call TABLE ; обращение к таблице с готовым набором цифр movwf PORTA ; копируем из W в порт А goto m1 ; возврат на отслеживание кнопки
;================== TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W retlw 0x38 ; 0 сегменты для порта B retlw 0xD ; 0 сегменты для порта A retlw b'11000' ; 1 сегменты для порта B retlw 0x0 ; 1 сегменты для порта A retlw b'110000' ; 2 сегменты для порта B retlw b'1110' ; 2 сегменты для порта A retlw b'111000' ; 3 сегменты для порта B retlw b'1010' ; 3 сегменты для порта A retlw b'11000' ; 4 сегменты для порта B retlw b'11' ; 4 сегменты для порта A retlw b'101000' ; 5 сегменты для порта A retlw b'1011' ; 5 сегменты для порта B retlw b'101000' ; 6 сегменты для порта B retlw b'1111' ; 6 сегменты для порта A retlw b'11000' ; 7 сегменты для порта B retlw b'10' ; 7 сегменты для порта A retlw b'111000' ; 8 сегменты для порта B retlw b'1111' ; 8 сегменты для порта A retlw b'111000' ; 9 сегменты для порта B retlw b'1011' ; 9 сегменты для порта A retlw b'011000' ; H сегменты для порта B retlw b'0111' ; H сегменты для порта A ;==================
Помогите разобраться с обработкой прерываний пожалуйста (ассемблер). Допустим идет счетчик (самое банальное разумеется) при нажатии на кнопку (на вывод RB7 ее подключил) происходит стоп. при следующем нажатии - продолжение счета.
пока я усек только то, что надо установить биты GIE, PEIE RBIE регистра INTCON, и отслеживать флаг RBIF (INTCON,0). не смог найти подходящего объяснения в иных источниках. Так же интересен вопрос, можно ли организовать прерывание по регистру А?..
**следующим моим вопросом будет работа с таймерами (инициализация, прерывание по сравнению, прерывание по переполнению) *** дальше будет вопрос про динамическую индикацию и ШИМ (вроде он используется для управление яркостью, и прочими фишечками то как мигание одним разрядом из например 4х) ... оО
Не понятно как твой МПЛАБ пропускает опечатки & _LVP_OFF & DATA_CP_OFF & Попробуй такой конфиг _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF На метку START программа никогда не попадёт. Зачем прошивать 1000раз МК. В МПЛАБе есть симулятор для отладки или Протеус поставь.
Не удается прочитать из EEPROM значения, которые потом необходимо вывести на 4х разрядный семисегментный индикатор. взял из ДШ по примеру, не работает. где я ошибся опять?
PS может уже с контроллером беда?.. когда в EEPROM что-то записано - ошибка возникает при сравнении, т.к. в нем остаются старые значения. Стирание не работает на EEPROM, а перезаписать поверх - пожалуйста.... Не нравится мне это. Точнее адреса 0001 и 0002 так себя ведут. Со всеми - не эксперементировал. хотя, старые прошивки(предыдущая например которую выкладывал) - проишваются и работают. Если прошить с MCLR - то вероятнее всего что МК не запустит программу при подаче питания (не понимаю почему!!!)
PPS сколько бы не пытался сегодня процедурно производить операцию чтения, индикации - ничерта не вышло. Хотелось бы конечно по-умному сделать: записал число в аккумулятор, вызвал процедуру, сделал действия. Следующее число в аккумулятор.... Не хватило фантазии.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения