Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 07:54:06

Доброго времени суток, уважаемые коты. Начал я изучать работу динамической индикации. Просмотрел урок на эту тему, написал программу счётчика, запустил в протеусе - всё работает. Код был для МК 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

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 08:31:41

Даташит на 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).

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 08:52:40

"Значение смещения (в wreg) определяет количество байт, которое должно продвинуть счётчик и должно быть кратно 2". Читал я это, только не понимаю. Если можно, объясните на пальцах.

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 09:11:51

В данном случае имеется ввиду, что индекс должен быть удвоен - в PIC18F4520 команда занимает два байта (за исключением некотрых), а не один, как в PIC16F (за исключением некоторых), а значит, адресация должна быть удвоена

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 09:30:13

Я вот что не понимаю. Если адресация удвоена, то счётчик должен работать так: 0,2,4,0,2,4, т. е. если адрес единицы равен 0, то с учётом удвоения адресации следующая цифра должна быть по адресу 2, т. е. двойка. Но т. к. счётчик работает 0,1,2,3,4, значит я не понимаю, какая адресация должна быть удвоена.

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 09:55:11

ADDWF PCL, F что делает?

Добавлено after 4 minutes 57 seconds:
...всё-таки "кратно двум" более правильно, чем "удвоен"..

то есть, если раньше индекс изменялся так:
00000000 +1
00000001 +1
00000010 +1
00000011...

то теперь должен так:
00000000 +2
00000010 +2
00000100 +2
00000110...

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 13:18:04

ADDWF PCL, F что делает?

Насколько я знаю складывается wreg и pcl и сохраняется в pcl

...всё-таки "кратно двум" более правильно, чем "удвоен"..

то есть, если раньше индекс изменялся так:
00000000 +1
00000001 +1
00000010 +1
00000011...

то теперь должен так:
00000000 +2
00000010 +2
00000100 +2
00000110...

Так я об этом и говорю. Почему читается первые 5 цифр, а не через одну?

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 13:45:48

ну я не знаю почему, что и как симулятор читает, к тому же из приведенного кода не видно
Hailmary писал(а):складывается wreg и pcl и сохраняется в pcl
что заносится в W, и может Вы перепутали соответствие набора битов цифрам :dont_know:

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 14:14:22

умножай на два приращение и всего лишь, вставь вот это:
Код:
    MULLW    .2
    MOVF     PRODL,W

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 14:46:13

RLNCF

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 15:18:17

да, так будет проще

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 17:39:28

А где эту команду написать?


Вот мой код
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

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 18:45:45

MOVF IND3,0 ;копируем в акк. из ind3 и сохраняем в акк.
RLNCF WREG,F
CALL TABLE ;переход на метку
;
короче во всех случаях перед "CALL TABLE"

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 18:48:03

полагаю, лучше всё-таки внутри TABLE, ибо вызовов несколько

Re: Проблема при переходе с pic16 на pic18

Вт фев 21, 2023 22:55:56

Работая с таблицами и PCL не забываем, что есть еще и PCU:PCH (и PCLATU:PCLATH)...
:wink:

Re: Проблема при переходе с pic16 на pic18

Ср фев 22, 2023 05:57:18

Всем огромное спасибо!!! Заработало! Пробовал два варианта, и оба работают. Выбрал второй, внутри таблицы, т. к. он компактнее. Но, к сожалению, я так и не понял, как это работает. Буду дальше разбираться.

Добавлено after 9 minutes 55 seconds:
Работая с таблицами и PCL не забываем, что есть еще и PCU:PCH (и PCLATU:PCLATH)...
:wink:

Читал я про них, что есть два байта младший PCL и старший PCH, к которому доступ только через PCLATH. PCU верхний байт, к нему доступ через PCLATH. но, обычно, на этом все объяснения и заканчиваются. Мне бы поподробнее, с примерами. Так что пока я не совсем понимаю, как работает счётчик программ (или совсем не понимаю :( ).

Re: Проблема при переходе с pic16 на pic18

Ср фев 22, 2023 08:11:36

к сожалению, я так и не понял, как это работает.

Вы - слепой гигантский почтальон. Обслуживали старый дом, с кучей подъездов, и знаете, что перейти от одного подъезда до другого можно за один шаг. Но тут построили новый дом, в котором квартир стало больше. Чтобы вместить все квартиры, подъезды стали стоять дальше друг от друга, теперь надо делать два шага.

Re: Проблема при переходе с pic16 на pic18

Ср фев 22, 2023 08:34:54

Читал я про них, что есть два байта младший PCL и старший PCH, к которому доступ только через PCLATH. PCU верхний байт, к нему доступ через PCLATU. но, обычно, на этом все объяснения и заканчиваются.

А какие еще нужны объяснения?
Писать все разряды в PC непосредственно невозможно, патамушта разрядность контроллера всего 8. Писать по частям тоже невозможно, патамушта это программный счетчик и первая же запись байта приведет к переходу на "недоадрес". Поэтому имеется механизм с буферами старших байт, при котором запись в буферы не приводит к переходу, а запись в младший байт PC - PCL ОДНОВРЕМЕННО приводит к перезаписи старших байт из буферов в PCH и PCU соответственно.
По поводу счетчика команд. Счетчик не задействует младший бит программного адреса. Поэтому при его инкременте шаг адреса получается ДВОЙНЫМ автоматически. Изменение младшего бита адреса происходит только при ЧТЕНИИ флеша как данных.

Re: Проблема при переходе с pic16 на pic18

Ср фев 22, 2023 09:12:03

Собственно вопрос вероятно в том, что сайт с русским переводом документации для начинающих "переехал" (или его "переехали")...
Сегодня старые буклетики вроде можно найти тут:
https://web.archive.org/web/20080208141 ... t/?mid=1x0
в частности
https://web.archive.org/web/20080208141 ... manual.pdf
:roll:

Re: Проблема при переходе с pic16 на pic18

Ср фев 22, 2023 09:39:29

Вы - слепой гигантский почтальон. Обслуживали старый дом, с кучей подъездов, и знаете, что перейти от одного подъезда до другого можно за один шаг. Но тут построили новый дом, в котором квартир стало больше. Чтобы вместить все квартиры, подъезды стали стоять дальше друг от друга, теперь надо делать два шага.

Задам ещё раз вопрос по своему коду: почему он читал первые 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
:roll:

Благодарю за ссылки, буду читать.
Ответить