LIST and INCLUDE directive
list p=pic16f873
include p16f873.inc
Processor type is set by LIST directive.
The standard label definition of PIC16F873 is read by the INCLUDE directive.
Configuration Word
Configuration Word is specified using CONFIG directive.
__config _hs_osc & _wdt_off & _pwrte_on & _cp_off
Configuration Word can be set when writing a program by the programmer. However, it is automatically established when using CONFIG directive.
The following specification is done as configuration word.
Oscillator | : | HS |
Watchdog Timer | : | OFF |
Power-up Timer | : | enabled |
Low Voltage ICSP | : |
OFF
(RB3 can not be used for the input/output port when not making this OFF). |
The result is 3F72h.
The item except the above is included in Configuration Word of PIC16F873. Generally, it is to be OK in above-mentioned directine.
Suppressing of the bank warning
errorlevel -302 ;Suppress bank warning
In PIC16F873, SFR is divided into four banks. There are SFRs which are common to all banks, but there are SFRs which are peculiar to the bank. The specification of the bank is done with RP0 bit and RP1 bit of the STATUS register. Even if the specification of the bank to the STATUS register is normally done, the message to confirm bank specification is displayed.
Ex.
Message[302] C:\MPLAB\PROJECT\MOTOR_~2\MOTOR.ASM 32 : Register in operand not in bank 0.
Ensure that bank bits are correct.
Above-mentioned example is a warning message about the TRISA register (bank 1) which is specified at the line of 32nd of the source code.
The content with the 32nd line is hereinafter.
032 movwf trisa ;Set TRISA register
Bank specification is normally set at the 30th line. In the case, this message is displayed. This message is displayed even if a bank is specified at the 31th line. It is none of your business. "errorlevel" is used to suppress the displaying of message (302). There is a way of changing bank specification with p16f873.inc, too.
Label definition
;**************** Label Definition ********************
In the processing this time, three labels are defined.
"speed" is a reference speed value. It is controlled for the value which changed the voltage which occurred with the control voltage input circuit by the A/D and the value which was specified by speed to become equal. The value which multiplied the value which was specified by "speed" on the value which divided 5V in 256 is reference speed voltage. Because 8 is specified this time, 5*8/256=0.156V is reference speed voltage. When making the value which is specified by "speed" big, the reference speed voltage becomes high. It should change the value of "speed" in the output voltage of the circuit which detects the number of rotations of the motor.
"change" is the value which specifies the speed to change the control electric current of the motor to. The detection of the rotational speed of the motor is done every 10 milliseconds. When there is a difference in the voltage of the control voltage input circuit and the reference speed voltage, the value which was specified by "change" is added or subtracted to or from the value of the PWM duty. The duty specification for PWM is done by the CCPR1 register. 256 kinds of duties can be set by CCPR1 because it is 8 bits. When the motor drive electric current stops when the value of CCPR1 is 255 and the value is 0, it is driven in the maximum electric current. When 1 is set to "change", 1 is added to or subtracted from the value of CCPR1 every 10 milliseconds. For example, in the time which the maximum drive condition(CCPR1=0) takes from the stop condition(CCPR1=255), it is 10ms x 256=2.56 seconds. Because it is 2.56 seconds in the time which the 5V change takes, as for 1 value, it is possible to assume that the value of change is about 2mV/ms. The variation with the control value of 10 milliseconds becomes big when making the value of "change" big. With the characteristic of the motor to use, this value should be adjusted.
"led" is the work area which is saved the duty value temporarily to make LEDs for the control situation monitor light up. Address 20h is used.
Program start
;**************** Program Start ***********************
Instruction is executed from Zero addresses of the program memory when making the power ON of the PIC. When there is interruption processing, processing is begun from the addresse 4.
It makes each processing jump with the GOTO instruction.
Initialization process
;**************** Initial Process *********************
The following processing is done as the initialization processing after the turning on.
Initialization of the mode of ports A , B and C |
|
I use the 0th of port A for an analog input. All other A ports are set to output mode to avoid the influence from other input port. There may are not an influence.
All B ports are set to output mode for LED control.
All C ports are set to output mode for CCP. |
|
Initialization of the A/D converter |
|
Because 10 MHz are used as the clock of PIC, A/D conversion clock is set to Fosc/32.
The input channel is set to AN0 and A/D converter ON bit is set.
The conversion result is set to left justification to use a higher byte.
As for the input port configuration control, the pattern of "Only 0th port is analog" is selected. |
|
Initialization of PWM |
|
CCP1 is used as the PWM mode.
The counter of timer2 is cleared and duty is set because of the certain operation.
The period of the output pulse is 1638.4 microseconds (about 610 Hz).
The setting value of prescaler is 1:16. Timer2 ON bit is set. |
|
Initialization of the compare mode |
|
CCP2 is used as the compare mode and makes interruption occur periodically.
The interruption period is 10 milliseconds. I set the internal clock as the count source of timer1.
The prescaler of timer1 is set to 1:1 and is set timer1 to operate.
The CCP2 mode is selected to start an A/D converter at the same time when interruption occurs. |
|
Initialization of interruption |
| The interruption enable bit of CCP2 is set. Also GIE and PIE are set. |
The initialization processing ended above. After this, it waits for the interruption only. As the main processing, it repeats the execution of the same address. '$' with operand means its address. '$+1' means an next address from its address.
Interruption process
;*************** Interruption Process *****************
Clearing of interruption flag |
| The interruption occurs every 10 milliseconds with CCP2. The interruption flag of CCP2 should be cleared first. When not clearing this, the following interruption occurs without waiting desired time. |
|
Wait until A/D converter completion |
| The conversion of the A/D converter has started simultaneously with interruption of CCP2. So, it waits until change completion.(The GO bit of ADCON0 becomes '0') This time, because the analog channel is only 0 channel, it is not need to wait until the input taking-in (the about 20 microseconds). When A/D converting while switching more than one channel, after channel selecting, the waiting time should be provided before start the A/D conversion. |
|
Comparison with reference speed voltage |
|
If the A/D conversion completes, the higher rank byte of the converted result is compared with the reference speed value. A converted value is composed of 10 bits. However, at the circuit this time, because it doesn't need 1024 pieces of division. So, only the higher rank byte is used and makes 256 pieces of division.
An A/D conversion value and reference speed value (speed) are compared and a difference between the number of rotations and the reference speed of the motor is judged. |
|
Speed down process |
| When the turning of the motor is higher than the reference speed, a duty ratio is made big and a motor drive electric current is suppressed. The rate that the duty ratio becomes big is decided by "change". |
|
Speed up process |
| When the turning of the motor is lower than the reference speed, a duty ratio is made small and a motor drive electric current is increased. The rate that the duty ratio becomes small is decided by "change". |
|
LED lighting-up control |
|
An LED level meter is used to confirm the drive situation of the motor. Seven LEDs are housed in the LED level meter which is used this time. I thought that eight LEDs were needed. However, I made this processing and knew that it was enough in seven LEDs. In the logic this time, 3 bits of higher ranks of CCPR1 are used to control a level meter. There are eight kinds of condition which it is possible to express by 3 bits from 000 to 111. So, I thought that I needed eight LEDs. When making one LED light up every code, eight LEDs are needed. However, in case of the level meter, the number of the LEDs which are lit up as the level rises is increased. Also, 000 becomes all LED going-out conditions. So, the LED is enough at seven.
In case of drive stop, it makes the bit of CCPR1 00000000 and in case of the maximum drive, it makes it 11111111. So, to use this information for the level meter control, 0 and 1 should be reversed. The "comf" instruction is for its purpose. Only 3 bits of higher ranks of the reversed data of CCPR1 are used for the lighting-up of a level meter. The lighting-up of the LEDs are controlled according to the code. The circuit prepared 8 ports to RB7 from RB0. The 4th bit from the higher rank of CCPR1 is used for the control of RB0. At the circuit this time, the control of RB0 is unnecessary. |
Interruption ending process
;************ END of Interruption Process **************
The RETFIE instruction is executed at end of the interruption processing. With this, it becomes the interruption possible condition. Because it isn't saving registers in case of interruption, there is no need to resave.
The control of the B port is done before executing RETFIE instruction. This is to reduce the processing step of the PORTB register.
End of coding
;********************************************************
; END of signboard control processing
;********************************************************
end
At the end of coding, END directive is used.
|