Файл: The PIC Microcontroller Book for beginning (Nebojsa Matic).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 15.06.2025

Просмотров: 1179

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Chapter 2 - Microcontroller PIC16F84

The same example can be realized by using macros, thus getting a more legible program. Macros that are already defined can be used for writing new macros. Macros BANK1 and BANK0 which are explained in "Memory organization" chapter are used with macros 'push' and 'pop'.

External interrupt on RB0/INT pin of microcontroller

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_07Poglavlje.htm (5 of 7) [4/2/2003 16:17:55]

Chapter 2 - Microcontroller PIC16F84

External interrupt on RB0/INT pin is triggered by rising signal edge (if bit INTEDG=1 in OPTION<6> register), or falling edge (if INTEDG=0). When correct signal appears on INT pin, INTF bit is set in INTCON register. INTF bit (INTCON<1>) must be reset in interrupt routine, so that interrupt wouldn't occur again while going back to the main program. This is an important part of the program which programmer must not forget, or program will constantly go into interrupt routine. Interrupt can be turned off by resetting INTE control bit (INTCON<4>).

Interrupt during a TMR0 counter overflow

Overflow of TMR0 counter (from FFh to 00h) will set T0IF (INTCON<2>) bit. This is very important interrupt because many real problems can be solved using this interrupt. One of the examples is time measurement. If we know how much time counter needs in order to complete one cycle from 00h to FFh, then a number of interrupts multiplied by that amount of time will yield the total of elapsed time. In interrupt routine some variable would be incremented in RAM memory, value of that variable multiplied by the amount of time the counter needs to count through a whole cycle, would yield total elapsed time. Interrupt can be turned on/off by setting/resetting T0IE (INTCON<5>) bit.

Interrupt during a change on pins 4, 5, 6 and 7 of port B

Change of input signal on PORTB <7:4> sets RBIF (INTCON<0>) bit. Four pins RB7, RB6, RB5 and RB4 of port B, can trigger an interrupt which occurs when status on them changes from logic one to logic zero, or vice versa. For pins to be sensitive to this change, they must be defined as input. If any one of them is defined as output, interrupt will not be generated at the change of status. If they are defined as input, their current state is compared to the old value which was stored at the last reading from port B. Interrupt can be turned on/off by setting/resetting RBIE bit in INTCON register.

Interrupt upon finishing write-subroutine to EEPROM

This interrupt is of practical nature only. Since writing to one EEPROM location takes about 10ms (which is a long time in the notion of a microcontroller), it doesn't pay off to a microcontroller to wait for writing to end. Thus interrupt mechanism is added which allows the microcontroller to continue executing the main program, while writing in EEPROM is being done in the background. When writing is completed, interrupt informs the microcontroller that writing has ended. EEIF bit, through which this informing is done, is found in EECON1 register. Occurrence of an interrupt can be disabled by resetting the EEIE bit in INTCON register.

Interrupt initialization

In order to use an interrupt mechanism of a microcontroller, some preparatory tasks need to be performed. These procedures are in short called "initialization". By initialization we define to what interrupts the microcontroller will respond, and which ones it will ignore. If we do not set the bit that allows a certain interrupt, program will not execute an interrupt subprogram. Through this we can obtain control over interrupt occurrence, which is very useful.

The above example shows initialization of external interrupt on RB0 pin of a microcontroller. Where we see one being set, that means that interrupt is enabled. Occurrence of other interrupts is not allowed, and all interrupts together are disallowed until GIE bit is keeping to one.

The following example shows a typical way of handling interrupts. PIC16F84 has only one location where the address of an interrupt subprogram is stored. This means that first we need to detect which interrupt is at hand (if more than one interrupt source is available), and then we can execute that part of a program which refers to that interrupt.

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_07Poglavlje.htm (6 of 7) [4/2/2003 16:17:55]


Chapter 2 - Microcontroller PIC16F84

Return from interrupt routine can be accomplished with instructions RETURN, RETLW and RETFIE. It is recommended that instruction RETFIE be used because that instruction is the only one which automatically sets the GIE bit which allows new interrupts to occur.

Previous page

Table of contents

Chapter overview

Next page

© Copyright 1999. mikroElektronika. All Rights Reserved. For any comments contact webmaster.

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_07Poglavlje.htm (7 of 7) [4/2/2003 16:17:55]


Chapter 2 - Microcontroller PIC16F84

Previous page

Table of contents

Chapter overview

Next page

2.7 Free-run timer TMR0

Timers are usually most complicated parts of a microcontroller, so it is necessary to set aside more time for their explaining. With their application it is possible to create relations between a real dimension such as "time" and a variable which represents status of a timer within a microcontroller. Physically, timer is a register whose value is continually increasing to 255, and then it starts all over again: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc.

This incrementing is done in the background of everything a microcontroller does. It is up to programmer to "think up a way" how he will take advantage of this characteristic for his needs. One of the ways is increasing some variable on each timer overflow. If we know how much time a timer needs to make one complete round, then multiplying the value of a variable by that time will yield the total amount of elapsed time.

PIC16F84 has an 8-bit timer. Number of bits determines what value timer counts to before starting to count from zero again. In the case of an 8-bit timer, that number is 256. A simplified scheme of relation between a timer and a prescaler is represented on the previous diagram. Prescaler is a name for the part of a microcontroller which divides oscillator clock before it will reach logic that increases timer status. Number which divides a clock is defined through first three bits in OPTION register. The highest divisor is 256. This actually means that only at every 256th clock, timer value would increase

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_08Poglavlje.htm (1 of 5) [4/2/2003 16:17:58]

Chapter 2 - Microcontroller PIC16F84

by one. This provides us with the ability to measure longer timer periods.

After each count up to 255, timer resets its value to zero and starts with a new cycle of counting to 255. During each transition from 255 to zero, T0IF bit in INTCOM register is set. If interrupts are allowed to occur, this can be taken advantage of in generating interrupts and in processing interrupt routine. It is up to programmer to reset T0IF bit in interrupt routine, so that new interrupt, or new overflow could be detected. Beside the internal oscillator clock, timer status can also be increased by the external clock on RA4/TOCKI pin. Choosing one of these two options is done in OPTION register through T0CS bit. If this option of external clock was selected, it would be possible to define the edge of a signal (rising or falling), on which timer would increase its value.

In practice, one of the typical example that is solved via external clock and a timer is counting full turns of an axis of some production machine, like transformer winder for instance. Let's wind four metal screws on the axis of a winder. These four screws will represent metal convexity. Let's place

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_08Poglavlje.htm (2 of 5) [4/2/2003 16:17:58]

Chapter 2 - Microcontroller PIC16F84

now the inductive sensor at a distance of 5mm from the head of a screw. Inductive sensor will generate the falling signal every time the head of the screw is parallel with sensor head. Each signal will represent one fourth of a full turn, and the sum of all full turns will be found in TMR0 timer. Program can easily read this data from the timer through a data bus.

The following example illustrates how to initialize timer to signal falling edges from external clock source with a prescaler 1:4. Timer works in "polig" mode.

The same example can be realized through an interrupt in the following way:

Prescaler can be assigned either timer TMR0 or a watchdog. Watchdog is a mechanism which microcontroller uses to defend itself against programs getting stuck. As with any other electrical circuit, so with a microcontroller too can occur failure, or some work impairment. Unfortunately, microcontroller also has program where problems can occur as well. When this happens, microcontroller will stop working and will remain in that state until someone resets it. Because of this, watchdog mechanism has been introduced. After a certain period of time, watchdog resets the microcontroller (microcontroller in fact resets itself). Watchdog works on a simple principle: if timer overflow occurs, microcontroller is reset, and it starts executing a program all over again. In this way, reset will occur in case of both correct and incorrect functioning. Next step is preventing reset in case of correct functioning, which is done by writing zero in WDT register (instruction CLRWDT) every time it nears its overflow. Thus program will prevent a reset as long as it's executing correctly. Once it gets stuck, zero will not be written, overflow of WDT timer and a reset will occur which will bring the microcontroller back to correct functioning again.

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_08Poglavlje.htm (3 of 5) [4/2/2003 16:17:58]


Chapter 2 - Microcontroller PIC16F84

Prescaler is accorded to timer TMR0, or to watchdog timer trough PSA bit in OPTION register. By clearing PSA bit, prescaler will be accorded to timer TMR0. When prescaler is accorded to timer TMR0, all instructions of writing to TMR0 register (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) will clear prescaler. When prescaler is assigned to a watchdog timer, only CLRWDT instruction will clear a prescaler and watchdog timer at the same time . Prescaler change is completely under programmer's control, and can be changed while program is running.

There is only one prescaler and one timer. Depending on the needs, they are assigned either to timer TMR0 or to a watchdog.

OPTION Control Register

Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit)

The subject of a prescaler, and how these bits affect the work of a microcontroller will be covered in section on TMR0.

bit 3 PSA (Prescaler Assignment bit)

Bit which assigns prescaler between TMR0 and watchdog timer. 1=prescaler is assigned to watchdog timer.

0=prescaler is assigned to free timer TMR0

bit 4 T0SE (TMR0 Source Edge Select bit)

If trigger TMR0 was enabled with impulses from a RA4/T0CKI pin, this bit would determine whether it would be on the rising or falling edge of a signal.

1=falling edge 0=rising edge

bit 5 T0CS (TMR0 Clock Source Select bit)

This pin enables a free-run timer to increment its value either from an internal oscillator, i.e. every 1/4 of oscillator clock, or via external impulses on RA4/T0CKI pin.

1=external impulses 0=1/4 internal clock

bit 6 INTEDG (Interrupt Edge Select bit)

If occurrence of interrupts was enabled, this bit would determine at what edge interrupt on RB0/INT pin would occur.

1= rising edge 0= falling edge

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_08Poglavlje.htm (4 of 5) [4/2/2003 16:17:58]

Chapter 2 - Microcontroller PIC16F84

bit 7 RBPU (PORTB Pull-up Enable bit)

This bit turns internal pull-up resistors on port B on or off. 1='pull-up' resistors turned on

0='pull-up' resistors turned off

Previous page

Table of contents

Chapter overview

Next page

© Copyright 1999. mikroElektronika. All Rights Reserved. For any comments contact webmaster.

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_08Poglavlje.htm (5 of 5) [4/2/2003 16:17:58]


Chapter 2 - Microcontroller PIC16F84

Previous page

Table of contents

Chapter overview

Next page

2.8 EEPROM Data memory

PIC16F84 has 64 bytes of EEPROM memory locations on addresses from 00h to 63h those can be written to or read from. The most important characteristic of this memory is that it does not loose its contents during power supply turned off. That practically means that what was written to it will be remaining even if microcontroller is turned off. Data can be retained in EEPROM without power supply for up to 40 years (as manufacturer of PIC16F84 microcontroller states), and up to 10000 cycles of writing can be executed.

In practice, EEPROM memory is used for storing important data or some process parameters. One such parameter is a given temperature, assigned when setting up a temperature regulator to some process. If that data wasn't retained, it would be necessary to adjust a given temperature after each loss of supply. Since this is very impractical (and even dangerous), manufacturers of microcontrollers have began installing one smaller type of EEPROM memory.

EEPROM memory is placed in a special memory space and can be accessed through special registers. These registers are:

EEDATA at address 08h, which holds read data or that to be written.

EEADR at address 09h, which contains an address of EEPROM location being accessed.

EECON1 at address 88h, which contains control bits.

EECON2 at address 89h. This register does not exist physically and serves to protect EEPROM from accidental writing.

EECON1 register at address 88h is a control register with five implemented bits.

Bits 5, 6 and 7 are not used, and by reading always are zero. Interpretation of EECON1 register bits follows.

EECON1 Register

bit 0 RD (Read Control bit)

Setting this bit initializes transfer of data from address defined in EEADR to EEDATA register. Since time is not as essential in reading data as in writing, data from EEDATA can already be used further in the next instruction.

1=initializes reading 0=does not initialize reading

bit 1 WR (Write Control bit)

Setting of this bit initializes writing data from EEDATA register to the address specified trough EEADR register.

1=initializes writing 0=does not initialize writing

bit 2 WREN (EEPROM Write Enable bit) Enables writing to EEPROM

If this bit was not set, microcontroller would not allow writing to EEPROM. 1=writing allowed

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_09Poglavlje.htm (1 of 3) [4/2/2003 16:18:00]

Chapter 2 - Microcontroller PIC16F84

0=writing disallowed

bit 3 WRERR (Write EEPROM Error Flag ) Error during writing to EEPROM

This bit was set only in cases when writing to EEPROM had been interrupted by a reset signal or by running out of time in watchdog timer (if it's activated).

1=error occured 0=error did not occur

bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit) Bit used to inform that writing data to EEPROM has ended.

When writing has terminated, this bit would be set automatically. Programmer must clear EEIF bit in his program in order to detect new termination of writing.

1=writing terminated

0=writing not terminated yet, or has not started

Reading from EEPROM Memory

Setting the RD bit initializes transfer of data from address found in EEADR register to EEDATA register. As in reading data we don't need so much time as in writing, data taken over from EEDATA register can already be used further in the next instruction.

Sample of the part of a program which reads data in EEPROM, could look something like the following:

After the last program instruction, contents from an EEPROM address zero can be found in working register w.

Writing to EEPROM Memory

In order to write data to EEPROM location, programmer must first write address to EEADR register and data to EEDATA register. Only then is it useful to set WR bit which sets the whole action in motion. WR bit will be reset, and EEIF bit set following a writing what may be used in processing interrupts. Values 55h and AAh are the first and the second key whose disallow for accidental writing to EEPROM to occur. These two values are written to EECON2 which serves only that purpose, to receive these two values and thus prevent any accidental writing to EEPROM memory. Program lines marked as 1, 2, 3, and 4 must be executed in that order in even time intervals. Therefore, it is very important to turn off interrupts which could change the timing needed for executing instructions. After writing, interrupts can be enabled again .

Example of the part of a program which writes data 0xEE to first location in EEPROM memory could look something like the following:

http://www.mikroelektronika.co.yu/english/product/books/PICbook/2_09Poglavlje.htm (2 of 3) [4/2/2003 16:18:00]