Форум РадиоКот https://radiokot.ru/forum/ |
|
Проблема при переходе с pic16 на pic18 https://radiokot.ru/forum/viewtopic.php?f=58&t=187053 |
Страница 1 из 2 |
Автор: | Hailmary [ Вт фев 21, 2023 07:54:06 ] |
Заголовок сообщения: | Проблема при переходе с pic16 на pic18 |
Доброго времени суток, уважаемые коты. Начал я изучать работу динамической индикации. Просмотрел урок на эту тему, написал программу счётчика, запустил в протеусе - всё работает. Код был для МК Pic16f84a. Когда я поменял на pic18f4520, то пошли проблемы. Счётчик начал считать так: 0,1,2,3,4,0,1,2,3,4. Потом включался второй разряд и так же считал. Искал решение этой проблемы в интернете и только понял то, что в 16 и 18 пиках регистр pcl как-то по другому работает. Подскажите, пожалуйста, в чём проблема? Фрагмент кода: ....... MOVF IND4, 0 CALL TABLE ........... TABLE. ADDWF PCL, F RETLW B'00000011' ; 0 RETLW B'10011111' ; 1 ........... RETLW B`00001011' ; 9 |
Автор: | Martian [ Вт фев 21, 2023 08:31:41 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Даташит на pic18f4520 страница 58 раздел 5.1.4.1 Computed GOTO The offset value (in WREG) specifies the number of bytes that the program counter should advance and should be multiples of 2 (LSb = 0). |
Автор: | Hailmary [ Вт фев 21, 2023 08:52:40 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
"Значение смещения (в wreg) определяет количество байт, которое должно продвинуть счётчик и должно быть кратно 2". Читал я это, только не понимаю. Если можно, объясните на пальцах. |
Автор: | Martian [ Вт фев 21, 2023 09:11:51 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
В данном случае имеется ввиду, что индекс должен быть удвоен - в PIC18F4520 команда занимает два байта (за исключением некотрых), а не один, как в PIC16F (за исключением некоторых), а значит, адресация должна быть удвоена |
Автор: | Hailmary [ Вт фев 21, 2023 09:30:13 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Я вот что не понимаю. Если адресация удвоена, то счётчик должен работать так: 0,2,4,0,2,4, т. е. если адрес единицы равен 0, то с учётом удвоения адресации следующая цифра должна быть по адресу 2, т. е. двойка. Но т. к. счётчик работает 0,1,2,3,4, значит я не понимаю, какая адресация должна быть удвоена. |
Автор: | Martian [ Вт фев 21, 2023 09:55:11 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
ADDWF PCL, F что делает? Добавлено after 4 minutes 57 seconds: ...всё-таки "кратно двум" более правильно, чем "удвоен".. то есть, если раньше индекс изменялся так: 00000000 +1 00000001 +1 00000010 +1 00000011... то теперь должен так: 00000000 +2 00000010 +2 00000100 +2 00000110... |
Автор: | Hailmary [ Вт фев 21, 2023 13:18:04 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
ADDWF PCL, F что делает? Насколько я знаю складывается wreg и pcl и сохраняется в pcl ...всё-таки "кратно двум" более правильно, чем "удвоен".. то есть, если раньше индекс изменялся так: 00000000 +1 00000001 +1 00000010 +1 00000011... то теперь должен так: 00000000 +2 00000010 +2 00000100 +2 00000110... Так я об этом и говорю. Почему читается первые 5 цифр, а не через одну? |
Автор: | Martian [ Вт фев 21, 2023 13:45:48 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
ну я не знаю почему, что и как симулятор читает, к тому же из приведенного кода не видно Hailmary писал(а): складывается wreg и pcl и сохраняется в pcl что заносится в W, и может Вы перепутали соответствие набора битов цифрам ![]() |
Автор: | Родэрик [ Вт фев 21, 2023 14:14:22 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
умножай на два приращение и всего лишь, вставь вот это: Код: MULLW .2
MOVF PRODL,W |
Автор: | Martian [ Вт фев 21, 2023 14:46:13 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
RLNCF |
Автор: | Родэрик [ Вт фев 21, 2023 15:18:17 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
да, так будет проще |
Автор: | Hailmary [ Вт фев 21, 2023 17:39:28 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
А где эту команду написать? Вот мой код LIST p=18f4520 #include "p18f4520.inc" ; CONFIG1H CONFIG OSC = XT ; Oscillator Selection bits (XT oscillator) CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) CONFIG IESO = OFF ; Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) ; CONFIG2L CONFIG PWRT = OFF ; Power-up Timer Enable bit (PWRT disabled) CONFIG BOREN = OFF ; Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software) CONFIG BORV = 3 ; Brown Out Reset Voltage bits (Minimum setting) ; CONFIG2H CONFIG WDT = OFF ; Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) CONFIG WDTPS = 32768 ; Watchdog Timer Postscale Select bits (1:32768) ; CONFIG3H CONFIG CCP2MX = PORTC ; CCP2 MUX bit (CCP2 input/output is multiplexed with RC1) CONFIG PBADEN = OFF ; PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset) CONFIG LPT1OSC = OFF CONFIG MCLRE = OFF ; MCLR Pin Enable bit (RE3 input pin enabled; MCLR disabled) ; CONFIG4L CONFIG STVREN = OFF CONFIG LVP = OFF CONFIG XINST = OFF ; CONFIG5L CONFIG CP0 = OFF ; Code Protection bit (Block 0 (000800-001FFFh) not code-protected) CONFIG CP1 = OFF ; Code Protection bit (Block 1 (002000-003FFFh) not code-protected) CONFIG CP2 = OFF ; Code Protection bit (Block 2 (004000-005FFFh) not code-protected) CONFIG CP3 = OFF ; Code Protection bit (Block 3 (006000-007FFFh) not code-protected) ; CONFIG5H CONFIG CPB = OFF CONFIG CPD = OFF ; Data EEPROM Code Protection bit (Data EEPROM not code-protected) ; CONFIG6L CONFIG WRT0 = OFF ; Write Protection bit (Block 0 (000800-001FFFh) not write-protected) CONFIG WRT1 = OFF ; Write Protection bit (Block 1 (002000-003FFFh) not write-protected) CONFIG WRT2 = OFF ; Write Protection bit (Block 2 (004000-005FFFh) not write-protected) CONFIG WRT3 = OFF ; Write Protection bit (Block 3 (006000-007FFFh) not write-protected) ; CONFIG6H CONFIG WRTC = OFF CONFIG WRTB = OFF CONFIG WRTD = OFF ; CONFIG7L CONFIG EBTR0 = OFF CONFIG EBTR2 = OFF CONFIG EBTR3 = OFF ; CONFIG7H CONFIG EBTRB = OFF BSR EQU 0xFE0 STATUS EQU 0xFD8 ;задаём PORTA EQU 0xF80 ; имена PORTB EQU 0xF81 ; регистрам TRISA EQU 0xF92 ; специального TRISB EQU 0xF93 ; назначения PCL EQU 0xFF9 ;переход на любую строчку LATA EQU 0x89 ; LATB EQU 0x8A COUNT EQU 0x101 ;задаём IND1 EQU 0x102 ; имена IND2 EQU 0x103 ; рагистрам IND3 EQU 0x104 ; общего IND4 EQU 0x105 ; назначения REG1 EQU 0x106 REG2 EQU 0x107 REG3 EQU 0x108 ORG 0 ; ;инициализация портов CLRF TRISA ;обнуляем trisa для настройки порта на выход. Вывод цифр. MOVLW 0x00 MOVWF TRISA CLRF TRISB ;обнуляем trisb для настройки порта на выход. Вывод цифр. MOVLW 0x00 MOVWF TRISB MOVLW .0 ;закгружаем в акк. 0 MOVWF IND4 ;копируем из акк. в регистр ind4 MOVWF IND3 ;копируем из акк. в регистр ind3 MOVWF IND2 ;копируем из акк. в регистр ind2 MOVWF IND1 ;копируем из акк. в регистр ind1 MOVLW .8 ;загружае в акк. 8 (будет использоваться как задержка) MOVWF COUNT ;копируем из акк. в регистр coun ;основная программа MAIN ;первый индикатор MOVF IND4,0 ;копируем в акк. из ind4 и сохраняем в акк., т.к. стоит 0 CALL TABLE ;переход на метку MOVWF PORTB ;копирум из акк. (из подпрограммы table) в порт В BSF PORTA,0 ;включаем нулевой бит порта А CALL DELAY ;задержка BCF PORTA,0 ;очищаем нулевой бит порта А ;второй индикатор MOVF IND3,0 ;копируем в акк. из ind3 и сохраняем в акк. CALL TABLE ;переход на метку MOVWF PORTB BSF PORTA,1 ;включаем первый бит порта А CALL DELAY BCF PORTA,1 DECFSZ COUNT,1 ;вычитаем 1 и сравниваем, если = 0, то следующая команда игнорируется ; результата записывается в count, т.к. стоит 1. Это задержка перед переключением на ; следующий разряд GOTO MAIN ;возврат к началу основной программы MOVLW .8 ;снова задаём параметр задержки. Если это не сделать, MOVWF COUNT ; то вычитание будет с 255 и до 0 INCF IND4,1 ;увеличивается на 1 и сохраняется в ind4,т.к. стоит 1 после запятой BCF STATUS,2 ;очищаем второй бит регистра, флаг z для проверки нуля MOVLW .10 ;сравниваем с 10 SUBWF ind4,0 ;вычитает и записывается в аккумулятор, т.к. стоит 0 после запятой BTFSC STATUS,2 ;провуряем второй бит регистра status, если он =0, команда пропускается GOTO ZERO4 GOTO MAIN DELAY MOVLW .75 ;задаются MOVWF REG1 ; числа MOVLW .5 ; регистрам MOVWF REG2 ; WR4 DECFSZ REG1,f ;уменьшает f на единицу и записывает в f. Если результата =0, то следующая команда игнорируется GOTO WR ;возврат на метку DECFSZ REG2,f GOTO WR RETURN TABLE ADDWF PCL,F ;складываем аккум. с pcl и сохраняем в pcl. ;при pcl = 0 переходим на следующую строчку, при pcl = 1 - через одну ;при pcl = 2 - через 2, при pcl = 3 - через 3 и т.д RETLW b'00000011'; 0 ;retlw как return, только ещё записывает значение в аккумулятор RETLW b'10011111' ; 1 RETLW b'00100101' ; 2 RETLW b'00001101' ; 3 RETLW b'10011001' ; 4 RETLW b'01001001' ; 5 RETLW b'01000001' ; 6 RETLW b'00011111' ; 7 RETLW b'00000001' ; 8 RETLW b'00001001' ; 9 ZERO4 MOVLW .0 ;загружаем MOVWF IND4 ; в ind4 ноль INCF IND3,1 ;увеличиваем ind3 на единицу и записываем в ind3 BCF STATUS,2 ;очищаем второй бит регистра, флаг z для проверки нуля MOVLW .10 ;сравниваем с 10 SUBWF IND3,0 ;вычитает и записывается в аккумулятор, т.к. стоит 0 после запятой BTFSC STATUS,2 ;провуряем второй бит регистра status, если он =0, команда пропускается GOTO ZERO3 GOTO MAIN ZERO3 MOVLW .0 MOVWF IND1 GOTO MAIN END |
Автор: | Родэрик [ Вт фев 21, 2023 18:45:45 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
MOVF IND3,0 ;копируем в акк. из ind3 и сохраняем в акк. RLNCF WREG,F CALL TABLE ;переход на метку ; короче во всех случаях перед "CALL TABLE" |
Автор: | Martian [ Вт фев 21, 2023 18:48:03 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
полагаю, лучше всё-таки внутри TABLE, ибо вызовов несколько |
Автор: | BOB51 [ Вт фев 21, 2023 22:55:56 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Работая с таблицами и PCL не забываем, что есть еще и PCU:PCH (и PCLATU:PCLATH)... ![]() |
Автор: | Hailmary [ Ср фев 22, 2023 05:57:18 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Всем огромное спасибо!!! Заработало! Пробовал два варианта, и оба работают. Выбрал второй, внутри таблицы, т. к. он компактнее. Но, к сожалению, я так и не понял, как это работает. Буду дальше разбираться. Добавлено after 9 minutes 55 seconds: Работая с таблицами и PCL не забываем, что есть еще и PCU:PCH (и PCLATU:PCLATH)... ![]() Читал я про них, что есть два байта младший PCL и старший PCH, к которому доступ только через PCLATH. PCU верхний байт, к нему доступ через PCLATH. но, обычно, на этом все объяснения и заканчиваются. Мне бы поподробнее, с примерами. Так что пока я не совсем понимаю, как работает счётчик программ (или совсем не понимаю ![]() |
Автор: | Martian [ Ср фев 22, 2023 08:11:36 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
к сожалению, я так и не понял, как это работает. Вы - слепой гигантский почтальон. Обслуживали старый дом, с кучей подъездов, и знаете, что перейти от одного подъезда до другого можно за один шаг. Но тут построили новый дом, в котором квартир стало больше. Чтобы вместить все квартиры, подъезды стали стоять дальше друг от друга, теперь надо делать два шага. |
Автор: | КРАМ [ Ср фев 22, 2023 08:34:54 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Читал я про них, что есть два байта младший PCL и старший PCH, к которому доступ только через PCLATH. PCU верхний байт, к нему доступ через PCLATU. но, обычно, на этом все объяснения и заканчиваются. А какие еще нужны объяснения? Писать все разряды в PC непосредственно невозможно, патамушта разрядность контроллера всего 8. Писать по частям тоже невозможно, патамушта это программный счетчик и первая же запись байта приведет к переходу на "недоадрес". Поэтому имеется механизм с буферами старших байт, при котором запись в буферы не приводит к переходу, а запись в младший байт PC - PCL ОДНОВРЕМЕННО приводит к перезаписи старших байт из буферов в PCH и PCU соответственно. По поводу счетчика команд. Счетчик не задействует младший бит программного адреса. Поэтому при его инкременте шаг адреса получается ДВОЙНЫМ автоматически. Изменение младшего бита адреса происходит только при ЧТЕНИИ флеша как данных. |
Автор: | BOB51 [ Ср фев 22, 2023 09:12:03 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Собственно вопрос вероятно в том, что сайт с русским переводом документации для начинающих "переехал" (или его "переехали")... Сегодня старые буклетики вроде можно найти тут: https://web.archive.org/web/20080208141 ... t/?mid=1x0 в частности https://web.archive.org/web/20080208141 ... manual.pdf ![]() |
Автор: | Hailmary [ Ср фев 22, 2023 09:39:29 ] |
Заголовок сообщения: | Re: Проблема при переходе с pic16 на pic18 |
Вы - слепой гигантский почтальон. Обслуживали старый дом, с кучей подъездов, и знаете, что перейти от одного подъезда до другого можно за один шаг. Но тут построили новый дом, в котором квартир стало больше. Чтобы вместить все квартиры, подъезды стали стоять дальше друг от друга, теперь надо делать два шага. Задам ещё раз вопрос по своему коду: почему он читал первые 5 цифр, а остальные не читал? Согласно логике про почтальона он должен читать числа через одно, но читает только первые 5. Если я начинаю сравнивать не с 10 а с 20, то он читает первые 10 цифр, и т. д. Добавлено after 2 minutes 21 second: Собственно вопрос вероятно в том, что сайт с русским переводом документации для начинающих "переехал" (или его "переехали")... Сегодня старые буклетики вроде можно найти тут: https://web.archive.org/web/20080208141 ... t/?mid=1x0 в частности https://web.archive.org/web/20080208141 ... manual.pdf ![]() Благодарю за ссылки, буду читать. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |