1 How to further reduce power consumption
Power consumption is an important consideration in battery-powered instruments. The PIC16C×× series microcontrollers have low power consumption (the operating current is less than 2mA at 5V, 4MHz oscillation frequency). To further reduce power consumption, the operating frequency can be reduced while ensuring that the working requirements are met. The reduction in operating frequency can greatly reduce power consumption (for example, when the PIC16C×× works at 3V, 32kHz, its current can be reduced to 15μA), but the lower operating frequency may cause some subroutines (such as mathematical calculations) to take up more time. In this case, when the oscillation mode of the microcontroller adopts the form of an RC circuit, the solution can be to increase the operating frequency midway.
The specific method is to connect a resistor (R1) between an idle I/O pin (such as RB1) and the OSC1 pin, as shown in Figure 1. In the low-speed state, set RB1=0. When fast calculation is required, set RB1=1 first. Since the capacitor voltage rises quickly during charging, the operating frequency increases and the calculation time decreases. After the calculation is completed, set RB1=0 again to enter the low-speed, low-power state. The change in the operating frequency depends on the resistance value of R1 (note that R1 cannot be selected too small to prevent the oscillation circuit from not oscillating. Generally, it is selected to be greater than 5kΩ).
In addition, the "sleep" instruction can be fully utilized to further reduce power consumption. When the "sleep" instruction is executed, the machine is in sleep mode and the power consumption is several microamperes. The program can use the "sleep" instruction not only in the standby state to wait for events, but also in the delay program (see Example 1 and Example 2). Using the "sleep" instruction in the delay program to reduce power consumption is one aspect. At the same time, even if the interrupt is turned off, the change of the level of Port B can wake up "sleep" and end the delay program in advance. This is particularly useful in some applications. At the same time, pay attention to the relationship with WDT and interrupts when using "sleep".
Example 1 (written in Mplab-C) Example 2 (written in Masm)
Delay() Delay
{ ; This line can add a switch interrupt instruction
/*This line can add a switch interrupt instruction*/ movlw.10
for (i=0; i<=10; i ) movwf Counter
SLEEP(); Loop1
} Sleep
decfsz Counter
goto Loop1
return
2 Note the RBIF bit in INTCON
The interrupt enable bits in INTCON have no effect on the interrupt status bits. When PORT B is configured as input mode, the RB "7:4" pin input is sampled and compared with the old latch value in each read operation cycle. Once different, a high level is generated and RBIF = 1 is set. Before opening the RB interrupt, RBIF may have been set to "1", so when opening the RB interrupt, the RBIF bit should be cleared first to avoid being affected by the original value of RBIF. At the same time, it is best to clear the RBIF bit after the interrupt processing is completed.
3 Issues to note when using Mplab-C high-level language to write PIC microcontroller programs
3.1 When embedding assembly instructions in a program, pay attention to the writing format as shown in Example 3.
Example 3
…………
while(1) {#asmwhile(1) {
... #asm /*Should start a new line*/
#endasm ...
}/*Cannot compile correctly*/ #endasm
...... }/*Compilation passed*/
…
When inlining assembly instructions, each instruction from "#asm" to "endasm" must occupy a line, otherwise an error will occur during compilation.
3.2 The safest representation of addition and multiplication is shown in Example 4.
Example 4
#include《16c71.h》
#include《math.h》
unsigned int a, b;
unsigned long c;
void main()
{ a=200;
b=2;
c=a*b;
} /*Cannot get the correct result c=400*/
The reason is that Mplab-C compiles c=a*b in 8×8 multiplication mode, returns a single-byte result to c, and the overflow of the result is ignored. It is safest to change the expression "c=a*b;" in the above example to "c=a; c=c*b;" (the same treatment is applied to addition).
3.3 Understanding the register usage of multiplication and division functions
Since the RAM in the PIC chip is only a few dozen bytes, the space is particularly valuable, and the Mplab-C compiler has a non-release property for RAM addresses, that is, the address used by a variable cannot be allocated to other variables. If the RAM space cannot meet the requirements of too many variables, some variables can only be forced by the user to allocate the same RAM space for alternating use. The multiplication and division functions in Mplab-C need to borrow RAM space to store intermediate results, so if the RAM occupied by the multiplication and division functions overlaps with the address of the user variable, it will lead to unpredictable results. If multiplication and division operations are used in a C program, it is best to first check whether the addresses occupied by the multiplication and division functions conflict with the addresses of other variables through the disassembly code of the program machine code (included in the generated LST file) to avoid the program running away. The Mplab-C manual does not give the specific RAM address occupied by its multiplication and division functions. Example 5 is the address occupation of 0×13, 0×14, 0×19, and 0×1A by the multiplication function.
Partial disassembly code
#include 《pic16c71》01A7081FMOVF 1F,W
#include《math.h》01A80093MOVWF 13
;borrow
unsigned long Value @0x101A90820MOVF 20, W
char Xm @0x2d;01AA0094MOVWF 14
;borrow
void main() 01AB082DMOVF 2D,W
{Value=20;01AC0099MOVWF 19
;borrow
Xm=40;01AD 019ACLRF1A
;borrow
Value = Value * Xm01AE235FCALL 035Fh
; Call the multiplication function
……01AF1283BCF 03,5
}01B0009FMOVWF 1F
; Return the low byte of the result
01B10804MOVF 04,W
01B200A0MOVWF 20
; Return the high byte of the result
4. Repeat the chip programming
For users without hardware emulators, they always use chips with EPROM to debug programs. Every time a program is changed, the original content is erased and then programmed, which wastes a lot of time and shortens the life of the chip. If the result of the latter programming is different from the previous one, only the same bit of the corresponding machine code byte changes from "1" to "0", the data can be written again on the previously programmed chip without erasing the original chip content.
During the debugging process of the program, constant adjustments are often encountered. If the change of the constant can ensure that the corresponding bit changes from "1" to "0", programming can continue on the basis of the original content. In addition, since the machine code corresponding to the instruction "NOP" is "00", the deletion of the instruction during the debugging process can be replaced with the "NOP" instruction first, and programming can continue on the original content after compilation.
In addition, when programming a chip with EPROM, pay special attention to the program security status bit. The manufacturer has changed the security status bit of the new generation of EPROM chips from the original erasable EPROM type to the fuse type. Once the program code security fuse is programmed to "0", the reprogrammable EPROM chip cannot be programmed again. Pay attention to this when using it to avoid unnecessary waste (Microchip's information does not explain this).
Previous article:PIC16F887 MPLAB IDE Multiple Projects Creation Multi-Machine Simulation
Next article:PIC16 MCU LCD1602 Driver PIC16F877A PIC16F887
- Popular Resources
- Popular amplifiers
- Learn ARM development(16)
- Learn ARM development(17)
- Learn ARM development(18)
- Embedded system debugging simulation tool
- A small question that has been bothering me recently has finally been solved~~
- Learn ARM development (1)
- Learn ARM development (2)
- Learn ARM development (4)
- Learn ARM development (6)
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- LED chemical incompatibility test to see which chemicals LEDs can be used with
- Application of ARM9 hardware coprocessor on WinCE embedded motherboard
- What are the key points for selecting rotor flowmeter?
- LM317 high power charger circuit
- A brief analysis of Embest's application and development of embedded medical devices
- Single-phase RC protection circuit
- stm32 PVD programmable voltage monitor
- Introduction and measurement of edge trigger and level trigger of 51 single chip microcomputer
- Improved design of Linux system software shell protection technology
- What to do if the ABB robot protection device stops
- CGD and Qorvo to jointly revolutionize motor control solutions
- CGD and Qorvo to jointly revolutionize motor control solutions
- Keysight Technologies FieldFox handheld analyzer with VDI spread spectrum module to achieve millimeter wave analysis function
- Infineon's PASCO2V15 XENSIV PAS CO2 5V Sensor Now Available at Mouser for Accurate CO2 Level Measurement
- Advanced gameplay, Harting takes your PCB board connection to a new level!
- Advanced gameplay, Harting takes your PCB board connection to a new level!
- A new chapter in Great Wall Motors R&D: solid-state battery technology leads the future
- Naxin Micro provides full-scenario GaN driver IC solutions
- Interpreting Huawei’s new solid-state battery patent, will it challenge CATL in 2030?
- Are pure electric/plug-in hybrid vehicles going crazy? A Chinese company has launched the world's first -40℃ dischargeable hybrid battery that is not afraid of cold
- Channel explanation in wireless communication
- [Mil MYC-JX8MPQ Review] 1. Basic Function Test
- Power Amplifier Basics
- What's wrong with Atmel Studio 7.0?
- OfficeSuite software for mobile reading and document editing
- New neopixel usage on STM32
- Excitation reset of half-bridge (including full-bridge/push-pull)
- Switching AC-DC Conversion in Power Supplies
- Detailed explanation of terminal device state switching in TI ZigBee protocol stack
- #Free application for evaluation#DFRobot AS7341 visible spectrum sensor