Design of Table Lookup Program for PIC Microcontroller

Publisher:幸福时光Latest update time:2019-12-02 Source: elecfans Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

The PIC table lookup program can be implemented by using the feature of subroutines with value returns. Specifically, in the main program, first get the table data address and put it into W, then call the subroutine. The first instruction of the subroutine puts W into PC, then the program jumps to the data address, and then the "RETLW" instruction puts the data into W and returns to the main program. The following program uses F10 to put the table header address.


MOVLW TABLE ; Table header address → F10

MOVWF 10

MOVLW 1; 1→W, ready to take the line segment value of "1"

ADDWF 10,1; data address of F10+W = "1"

CALL CONVERT

MOVWF 6; Set the line segment value to port B and light up the LED

CONVERT MOVWF 2 ;W→PC TABLE

RETLW 0C0H ; "0" segment value

RETLW 0F9H ; "1" segment value

RETLW 90H ;“9” segment value

9) "READ...DATA, RESTORE" format program

The "READ...DATA" program reads one data in the data table each time, then adds 1 to the data pointer and prepares to fetch the next data. In the following program, F10 is used as the starting address of the data table, and F11 is used as the data pointer.

POINTER EQU 11 ; define F11 name as POINTER

MOVLW DATA

MOVWF 10; Data header address → F10

CLRF POINTER ; data pointer clear

MOVF POINTER,0

ADDWF 10,0; W = F10 + POINTER

INCF POINTER, 1; pointer plus 1

CALL CONVERT; call the subroutine to get the table data

CONVERT MOVWF 2 ;Data address→PC

DATA RETLW 20H ; data

RETLW 15H ;Data

If you want to execute "RESTORE", just execute a "CLRF POINTER".

Design of Table Lookup Program for PIC Microcontroller

10) Delay program

If the delay time is short, you can simply let the program execute several no-operation instructions "NOP" in succession. If the delay time is long, you can use a loop to implement it. The following example uses F10 to calculate and repeat the loop 100 times.

MOVLW D'100'

MOVWF 10

LOOP DECFSZ 10, 1; F10—1→F10, jump if the result is zero

GOTO LOOP

The delay time is calculated by the time it takes to execute the instructions in the delay program. If a 4MHz oscillation is used, each instruction cycle is 1μS. Therefore, the single-cycle instruction time is 1μS, and the double-cycle instruction time is 2μS. In the above example, the LOOP loop delay time is: (1+2)*100+2=302 (μS). Inserting a no-operation instruction in the loop can extend the delay time:

MOVLW D'100'

MOVWF 10

LOOP NOP

NOP

NOP

DECFSZ 10,1

GOTO LOOP

Delay time = (1+1+1+1+2)*100+2=602 (μS).

The delay time can be greatly extended by nesting several loops. The following example uses 2 loops to delay:

MOVLW D'100'

MOVWF 10

LOOP MOVLW D'16'

MOVWF 11

LOOP1 DECFSZ 11,1

GOTO LOOP1

DECFSZ 10,1

GOTO LOOP

Delay time = 1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(μS)

11) Use of RTCC counter

RTCC is a pulse counter. Its counting pulse has two sources, one is the external signal input from the RTCC pin, and the other is the internal instruction clock signal. You can use the program to select one of the signal sources as input. RTCC can be used by the program for timing; the program reads the RTCC register value to calculate the time. When RTCC is used as an internal timer, the RTCC pin needs to be connected to VDD or VSS to reduce interference and current consumption. The following program uses RTCC for delay:

RTCC EQU 1

CLRF RTCC; RTCC cleared

MOVLW 07H

OPTION ; Select preset multiple 1:256→RTCC

LOOP MOVLW 255; RTCC count final value

SUBWF RTCC, 0

BTFSS STATUS, Z; RTCC=255?

GOTO LOOP

In this delay program, the RTCC register increases by 1 every 256 instruction cycles (division ratio = 1:256). Assuming the chip uses a 4MHz oscillation, then:

Delay time = 256*256 = 65536 (μS)

The RTCC is self-oscillating. When it is counting, the program can do other things. It only needs to read it at regular intervals and detect its count value.

12) Addressing of register bank (BANK)

For PIC16C54/55/56, there are 32 registers and only one bank, so there is no bank addressing problem. For PIC16C57/58, there are 80 registers, divided into 4 banks (BANK0-BANK3). In the description of F4 (FSR), we know that bit6 and bit5 of F4 are register bank addressing bits, and their corresponding relationship is as follows:

When the chip is powered on and RESET is performed, bit6 and bit5 of F4 are randomized, while non-powered RESET will keep the original status unchanged.

The following example writes data to the 30H and 50H registers of BANK1 and BANK2.

Example 1. (Assume that the current bank is BANK0)

BSF 4, 5; set bit5 = 1, select BANK1

MOVLW DATA

MOVWF 10H ; DATA → 30H

BCF 4,5

BSF 4, 6; bit6 = 1, bit5 = 0 select BANK2

MOVWF 10H; DATA→50H

From the above example, we can see that to read or write registers in a bank, we must first operate the bank addressing bits in F4. In practical applications, after power-on reset, we usually clear bit 6 and bit 5 of F4 to 0 to point to BANK0, and then point to the corresponding bank as needed.

Note that in the example, when writing numbers to the 30H register (BANK1) and the 50H register (BANK2), the register address in the instruction "MOVWF 10H" is "10H", instead of the "MOVWF 30H" and "MOVWF 50H" expected by the reader. Why?

Let's review the instruction table. In all the register-related instruction codes of PIC16C5X, the register addressing bits only occupy 5 bits: fffff, which can only address 32 (00H-1FH) registers. Therefore, to address 80 registers, we need to use two-bit body addressing bits PA1 and PA0. When we set the body addressing bits PA1 and PA0 to point to a BANK, the instruction "MOVWF 10H" will put the content of W into the corresponding register in this BANK (10H, 30H, 50H, or 70H).

Some designers may have different understandings of the concept of volume location when they first encounter it. Here is an example:

Example 2: (Assume that the current bank is selected as BANK0)

MOVLW 55H

MOVWF 30H; To transfer register 55H to register 30H

MOVLW 66H

MOVWF 50H; To transfer register 66H→50H

It is wrong to think that "MOVWF 30H" can definitely put W into 30H, and "MOVWF 50H" can definitely put W into 50H. This is because the actual effect of these two instructions is "MOVWF 10H", and the reason has been explained above. Therefore, the final result of this program in Example 2 is F10H=66H, and the actual F30H and F50H are not operated.

Suggestion: To make the program of bank address selection clear, it is recommended to use more name definition symbols to write the program, so as to avoid confusion. Example 3: Assume that the registers of BANK0, BANK1, and BANK2 are used in the program as follows:

AEQU10H ;BANK0

B EQU 10H ;BANK1

C EQU 10H ;BANK2

FSR EQU 4

Bit6 EQU 6

Bit5 EQU 5

DATA EQU 55H

MOVLW DATA

MOVWF A

BSF FSR, Bit5

MOVWF B ;DATA→F30H

BCF FSR, Bit5

BSF FSR, Bit6

MOVWF C ;DATA→F50H

If the program is written in this way, I believe it will not be easy to make mistakes in body location selection.

13) Program jumps and calls across pages

The following introduces the page concept of the program storage area of ​​PIC16C5X and an example of the application of the page address bits PA1 and PA0 in the F3 register.

(1) “GOTO” across pages

Example: If the current program is on page 0 (PAGE0), and you want to use "GOTO" to jump to a location on page 1

KEY(PAGE1).

STATUS EQU 3

PA1 EQU 6

PA0 EQU 5

BSF STATUS, PA0; PA0=1, select PAGE

GOTO KEY; jump to the KEY of page 1 across pages

KEY NOP; 1 page program

(2) “CALL” across pages

Example: Assume that the current program is on page 0 (PAGE0), and now you want to call the subroutine DELAY placed on page 1 (PAGE1).

BSF STATUS, PA0; PA0=1, select PAGE1

CALL DELAY; cross-page call

BCF STATUS, PA0; restore page 0 address

DELAY NOP; 1 page subroutine

Note: The program sets the page address for cross-page CALL. Be sure to restore the original page address after returning from the subroutine.

(3) Programming of cross-page jumps and calls

Readers who have read this must be asking: When I write the source program (.ASM), I don't pay attention to the storage address of each instruction. How do I know that this GOTO needs to cross pages, and that CALL needs to cross pages? Indeed, when you start writing the source program, you don't know when a cross-page jump or call will occur, but when you assemble the source program, it will be automatically given. When the assembly result shows:

XXX (address) "GOTO out of Range"

XXX (address) "CALL out of Range"

This indicates that your program has cross-page jumps and calls, and the corresponding page addresses have not been set before these cross-page GOTO and CALL in your program. At this time, you should check the .LST file generated by the assembly, find these GOTO and CALL, and check which page the address they are going to jump to is located, and then return to the source program (.ASM) to make necessary modifications. Until your source program passes the assembly (0 Errors and Warnnings).

(4) Link to program page

The connection between the four pages of the program should be processed. It is generally recommended to use the following format: That is, after entering another page, immediately set the corresponding page address bit (PA1, PA0). Page processing is the most troublesome part of PIC16C5X programming, but it is not difficult. As long as you do a practical programming exercise, you will be able to master it.

Reference address:Design of Table Lookup Program for PIC Microcontroller

Previous article:What issues should be paid attention to when processing the interrupt service program of the PIC microcontroller
Next article:Design of DC motor speed measurement program based on PIC microcontroller

Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号