Преобразование 10 бит числа в десятичное

Вторая жемчужина моей коллекции. Дело в том, что АЦП (ADC)  широко применяется в 10-битном формате. Для нас естественен вывод результата в десятичном формате.

Ниже приводится код преобразования 0x2CD  в десятичное число 732, данные введены в регистры данных — в качестве примера для проверки.

Код  PIC_ASSEMBLER

; Assembly source line config statements

PROCESSOR 16F18855

#include <xc.inc>

 

; CONFIG1

CONFIG  FEXTOSC = OFF          ;Oscillator not enable// CRYSTAL Oscillator mode selection bits (HS above 4MHz; PFM set to high power)

CONFIG  RSTOSC = EXT1X        ; Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits)

CONFIG  CLKOUTEN = OFF        ; Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)

CONFIG  CSWEN = ON            ; Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)

CONFIG  FCMEN = OFF            ; Fail-Safe Clock Monitor disable bit (FSCM timer disabled)

; CONFIG2

CONFIG  MCLRE = OFF            ; Master Clear disable bit (MCLR pin is port defined function)

CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)

CONFIG  LPBOREN = OFF         ; Low-Power BOR enable bit (ULPBOR disabled)

CONFIG  BOREN = OFF           ; Brown-out reset disable bits

CONFIG  BORV = HI             ; Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 2.7V

CONFIG  ZCD = OFF             ; Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)

CONFIG  PPS1WAY = ON          ; Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software)

CONFIG  STVREN = ON           ; Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)

 

; CONFIG3

CONFIG  WDTCPS = WDTCPS_31    ; WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)

CONFIG  WDTE = OFF            ; WDT disabled ; SWDTEN ignored

CONFIG  WDTCWS = WDTCWS_7     ; WDT Window Select bits (window always open (100%); software control; keyed access not required)

CONFIG  WDTCCS = SC           ; WDT input clock selector (Software Control)

; CONFIG4

CONFIG  WRT = OFF             ; UserNVM self-write protection bits (Write protection off)

CONFIG  SCANE = not_available     ; Scanner Enable bit (Scanner module is available for use)

CONFIG  LVP = OFF             ; Low Voltage Programming Disaable bit (MCLR/Vpp must be used for programming)

; CONFIG5

CONFIG  CP = OFF              ; UserNVM Program memory code protection bit (Program Memory code protection disabled)

CONFIG  CPD = OFF             ; DataNVM code protection bit (Data EEPROM code protection disabled)

;objects in common (Access bank) memory

 

PSECT udata                          ; 0x20

R0      :   DS  1                       ; equ     12              ; RAM Assignments

R1      :   DS  1                       ; equ     13

R2      :   DS  1                       ; equ     14

 

;this must be linked to the reset vector

PSECT resetVec,class=CODE,reloc=2

resetVec:                                 ; это метка и двоеточие после метки — обязательно

goto main                                               ;наверное                метка resetVec: должна быть выше строки PSECT resetVec,class=CODE,reloc=2

/* find the highest PORTA value read, storing this into

the object max */

PSECT code

main:

B2_BCD:  bcf     STATUS,0                ; clear the carry bit

movlw   10

movwf   CountB

 

movlw 0xA0                           ;Указатель на начальную ячейку памяти

;BANKSEL FSR0

movwf FSR0L                        ; open indirect bank 0xA0,0xA1,0xA2

movlw 0x0F

movwf     INDF0                     ; Data inR0 — cell N0

;CLRF INDF0

INCF FSR0L

movlw     0x10

movwf INDF0                        ;FSR0 Data in R1 — cell N1

;CLRF INDF0

INCF FSR0L

movlw     0x11

movwf    INDF0                    ; Data in R2- cell N2

 

adjDEC:  movlw   0xA0;- first bank /R2

Banksel  FSR0L

MOVWF    FSR0L;movwi   ++FSR0; load new address bank 0xA3 =++FSR0  i   ++FSR0;INDF0;FSR0;movwf   FSR

movf       R2

movwf   INDF0

;movwf   temp

;movwf   ++FSR0L;INDF0; memory cell A2???

;movf    INDF0,1

call    adjBCD

;

INCF      FSR0L

movf   R1

movwf    INDF0

;movwf   —FSR0L; i              FSR0++;INDF1;FSR1;movwf   FSR

call    adjBCD

;

INCF      FSR0L

movf   R0

movwf    INDF0

;movwi    FSR0++;INDF1+1;FSR1+ ;movwf   FSR

call    adjBCD

;

goto    Loop10

;

adjBCD:  movlw   3

addwf          INDF0,0;FSR0L,0;INDF0,1;R2,0;W;R2;0,W

;movf      FSR0L,0;INDF1

movwf   temp

btfsc   temp,3          ; test if result > 7 (b’1000’=Hx08 carry from 7 to 8 = B’0111′ to B’1000′

movwf   INDF0;FSR0L;INDF0;R2;0

movlw   30h ;B’0011 0000′

addwf   INDF0,0;FSR0L;INDF0;R2,0;0,W

;movf      FSR0L;INDF1,0

movwf   temp

btfsc   temp,7          ; test if result > 7 bit=H 0x40 =D64

movwf   INDF0 ;FSR0L;R2;0               ; save as MSD

RETLW   0

;START

mainbcd:

movlw   2;

movwf   H_byte

SWAPF   H_byte,1

rlf     H_byte,1

rlf     H_byte,1

movlw   0xDC;0xDC

movwf   L_byte          ; The 16 bit binary number = FFFF

call    B2_BCD          ; After conversion the Decimal Number

;                               ; in R0,R1,R2 = 06,55,35

;

;self    goto    self

;org     1FF

goto    mainbcd

END;

От военных сводок к мирной жизни — распределяем память микроконтроллера PIC16F

Это очень важно — хранить данные не только в регистрах Памяти для Данных, но и Памяти для Программ (Линейной памяти, флэш памяти). При необходимости извлекать из программной памяти данные и выводить их на ЖКИ LCD 1602 (дисплей). Тем самым создавая удобный интерфейс конечного пользователя-потребителя вместе с 16-битной клавиатурой. Которая, кстати может быть запараллелена с 8-битным портом данных ЖКИ. (входящие и выходящие данные).

ORG 0x2000
В ассемблере MPASM, PIC_ASM — есть директива da «ABCD», 0; —  для ввода строки символов в ячейки памяти начиная со строки 0x2000 Liner Memory, за содержанием которой Вы можете наблюдать в меню IDE->Windos->Programm Memory, а также непосредственно — за регистрами косвенной адресации FSRn (0-1, для PIC16f) через меню WATCH.

Данные прописались в GPR Memory со (строки) 0х0020 – ячейки. Это  Temp_N(0x0020), FLAG_edge (0x0021),
H_byte (0x022)/ Суппер!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  Дважды копировался WREG, пришлось закомментировать инструкцию записи movwf INDF1, — Т.К. ПРИ ЭТОМ ЯЧЕЙКА FSR1++ СДВИГАЛАСЬ ЕЩЕ НА ОДИН ШАГ.
Данные FSR0 – сдвинул вправо на одну ячейку при записи изначально. Потому что к адресации получалось – что ячейка сдвигается для получения данных и первое число терялось. Можете проверить и устранить небольшие шероховатости при отладке — пошагово. А я потом, расскажу — какие именно. Так интереснее.
В этой программе мы побайтово, в режиме косвенной адресации заносим ASCII символы «О», «К», «R» в память Program Memory начиная с адреса 20А1. При извлечении этих данных обращаемся к ячейке 20А0, т.к. инструкция MOVIW FSRO++ (ПОСТИНКРЕМЕНТ), при первом цикле — инкрементирует адрес к 20А1. Происходит как бы преинкремент. Считываем данные в 20А1, потом постинкремент данных и еще два раза. В случае da «OKR», 0; будет цикл адресации к метке с прекращением по условию Z=0; IORLW  0x00;
— Успехов друзья в программировании!!!

Код программы приведен ниже:

list           p = 16f18855

#include p16f18855.inc

; CONFIG1
__CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON

; CONFIG2
__CONFIG _CONFIG2, _MCLRE_OFF & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_OFF & _BORV_HI & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON

; CONFIG3
__CONFIG _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_SC

; CONFIG4
__CONFIG _CONFIG4, _WRT_OFF & _SCANE_not_available & _LVP_ON

; CONFIG5
__CONFIG _CONFIG5, _CP_OFF & _CPD_OFF

UDATA  0x20;Specify RAM

Temp_N      res 1; Counter loop

H_byte  res     1      ; equ     10

L_byte  res     1       ; equ     11

CountB    res           1              ;

org 0x000

RES_VECT  CODE    0x0000            ; processor reset vector

GOTO    START                   ; go to beginning of program

org 0x0004

; TODO ADD INTERRUPTS HERE IF USED

BTFSC     PIR6,CCP1IF; Here CCP1? — bit 0; заполнил прерывания для компаратора

;GOTO    CCP_ISR; PROGRAMM isr  for CCP; в этом примере — не задействован

retfie;

START

MAIN_PROG CODE                      ; let linker place main program

movlw 0xA1          ;

movwf FSR0L         ; open indeirect bank 0xA0,0xA1,0xA2

movlw A’O’;0x0F

movwf    INDF0    ; Data inR0 — cell N0

;CLRF INDF0

INCF FSR0

movlw A’K’            ;0x10

movwf INDF0       ;FSR0 Data in R1 — cell N1

;CLRF INDF0

INCF FSR0

movlw A’R’            ;0x11

movwf    INDF0    ; Data in R2- cell N2

movlw     .3                            ;Data of counter

movwf    CountB   ;

movlw     0x00        ;shifting 0x20A0 — before 0xA0first address memory bank1

movwf    FSR0H   ;

movlw     0xA0       ;

movwf    FSR0L    ;

movlw     0x020      ;first address memory bank2 H_byte

movwf    FSR1L    ;

movlw     0x00        ;

movwf    FSR1H   ;

B3           moviw     FSR0++  ;10FSR0; 10;postincrement FSR0 cells bank1

movf       INDF0,0 ;

movwi     FSR1++; 10           ;p-i FSR1 cells bank2

;movwf   INDF1;

decfsz      CountB   ;

BRA       B3           ; CHECK                the line mamory

 

GOTO $                          ; loop forever

 

END

 

К мирной жизни от военных сводок. Завариваем чай:)

Все так привыкли к фильтр пакетикам, что заваривать вкуснейший листовой чай стало полнейшим архаизмом.
Мой способ самый простой. Мало ополоснуть чайник кипятком, все равно он не заварится как надо. Убедиться в этом  можно заглянув через 20 минут в заварочник. Сверху светлая заварка, ниже — темнее.
И так, завариваем чай в фарфоровом — фаянсовом чайничке. Примерно на 400 мл., столовая ложка чая без горки. Залили крутым кипятком и…
— Размышляем. Ведь у нас в руках огнеупорная посуда. Включаем малую газовую горелку на самый малый газ. Ставим наш дорогой и уважаемый чайничек и медитируем, глядя на него и в окошко. Крышка начнет постукивать : «кля-кля», через минуту — «кля-кля». Он сообщает что достаточно нагрелся и что скоро может закипеть. Что категорически не допускается.
Поэтому газ выключаем, чайничек накрываем полотенчиком, и готовим бутерброды. Можно белый батон помазать медом, благо сосед пасечник угостил своим медком, здоровья ему, или домашнего посола скумбрией или горбушей.
Как делать такие деликатесы может быть расскажу в следующий раз.
Удачи друзья!!!