RS232 #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7 BAUD=x; Set baud rate to x units bits/sec ...

Preview:

Citation preview

RS232

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7

BAUD=x; Set baud rate to x units bits/sec XMIT=pin ; Set transmit pin RCV=pin; Set receive pin printf("%u",value); the printf command is

used to write data to serial port.

RS232

RS232 receive data available, at the receiver pin , for example for PIC16F877 at pin RC7.

value = getc(), value = fgetc(stream), value=getch(), value=getchar()

This function waits for a character to come in over the RS232 RCV pin and returns the character.

Example

This example receives data and resends it via RS232

Continue ADC

The A/D converter module has the following features:

The converter generates a 10-bit binary result (or 8-bit) using the method of successive approximation and stores the conversion results into the ADC registers (ADRESL and ADRESH);

The A/D converter converts an analog input signal into a 10-bit binary number (or 8-bit);

The minimum resolution or quality of conversion may be adjusted to various needs by selecting voltage references Vref- and Vref+.

Continue ADC

To select the Vref- and Vref+: Choose Constants used in

SETUP_ADC_PORTS(): Example:(AN0_VREF_VREF) // A0 VRefh=A3 VRefl=A2(AN0_AN1_AN2_AN4_VSS_VREF)// A0 A1 A2 A5

VRefh=A3

Continue ADC

To select the number of bits which read_adc() returns use:

#Device ADC=10 ADC=x Where x is the number of bits

read_adc() should return If we use PIC16f877 x could be 8 or 10

Bits.

Interrupts

Three simple steps: First: Enable Interrupts Global:enable_interrupts(GLOBAL);//tells the PIC that we are going to use interrupt Second: Enable the Specific type of Interrupt

you want to use:enable_interrupts(INT_xxx);//specify the type ofinterrupt.See the devices .h file for all valid interrupts for

the part

Interrupts10

Third: Write the Interrupt Subroutine:This function is executed when the interruptoccurs.The subroutine is written outside the Main

loop.The function should be written directly after

#Int_xxxThe name of subroutine should refer to theaction taken.

#Int_xxx11

These directives specify the following function is an interrupt function.

#INT_EXT //External interrupt #INT_RB //Port B any change on B4-B7

Example Using INT_RB

The following example shows how to use INT_RB.

The Microcontroller is reading analog signal from analog channel one, but if a change occurred at pin RB4 (Low to High or High to Low) an Interrupt occurs and the microcontroller is programmed to light a LED at Pin RB2 and a Motor is on at pins RB0, RB1.

13

RA0/AN02

RA1/AN13

RA2/AN2/VREF-4

RA4/T0CKI6

RA5/AN4/SS7

RE0/AN5/RD8

RE1/AN6/WR9

RE2/AN7/CS10

OSC1/CLKIN13

OSC2/CLKOUT14

RC1/T1OSI/CCP216

RC2/CCP117

RC3/SCK/SCL18

RD0/PSP019

RD1/PSP120

RB7/PGD40

RB6/PGC39

RB538

RB437

RB3/PGM36

RB235

RB134

RB0/INT33

RD7/PSP730

RD6/PSP629

RD5/PSP528

RD4/PSP427

RD3/PSP322

RD2/PSP221

RC7/RX/DT26

RC6/TX/CK25

RC5/SDO24

RC4/SDI/SDA23

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI15

MCLR/Vpp/THV1

U1

PIC16F877

RXD

RTS

TXD

CTS

R210k

U1(RA1/AN1)

D2LED-RED

R3330

Note: Practically the motor is not simply connected as shown. (it needs a driver circuit between MC and

the motor it self).

Practically Don't

forget to connect the

oscillator and power.

14

#include <16f877.h> #fuses hs,nowdt #use delay (clock=20000000) #use rs232 (baud=9600,xmit=pin_c6,rcv=pin_c7) #int_Rb //Interrupt Subroutine (Motor on Clock Wise

and LED On/Off five times) Rb_isr() { int i; output_high(pin_b0); output_low(pin_b1); for ( i=1;i<=5;i++) {output_high(pin_b2); delay_ms(500); output_low(pin_b2); delay_ms(500);} output_low(pin_b0); output_low(pin_b1);}

Cont. code15

void main() {int value; enable_interrupts(INT_Rb); enable_interrupts(GLOBAL); setup_adc( ADC_CLOCK_INTERNAL ); setup_adc_ports( ALL_ANALOG );

while (1) { set_adc_channel(1); value= read_adc(); printf("A/D value = %u\n\r",value);}}

Other Interrupts16

INT_EXT //External interrupt INT_RDA //RS232 receive data

available INT_TIMERx //Timer x overflow

INT_EXT17

Change at pin RB0 Also requires specifying the edge change using:

EXT_INT_EDGE( ) Determines when the external interrupt is acted

upon. The edge may be L_TO_H or H_TO_L to specify the rising or falling edge

Example: ext_int_edge( H_TO_L ); // Sets up EXT This is written after enabling the interrupts (In

the main loop)

INT_RDA18

Rather than waiting serial data to be received from the Rx pin, give this job to a specialist which is INT_RDA.

If data is available at the receiver pin an Interrupt occurs.

Example

The First PIC transmit data to be received by the second PIC. see the figure next slide.

Receive the data using Interrupt RDA.

RA0/AN02

RA1/AN13

RA2/AN2/VREF-/CVREF4

RA4/T0CKI/C1OUT6

RA5/AN4/SS/C2OUT7

RE0/AN5/RD8

RE1/AN6/WR9

RE2/AN7/CS10

OSC1/CLKIN13

OSC2/CLKOUT14

RC1/T1OSI/CCP216

RC2/CCP117

RC3/SCK/SCL18

RD0/PSP019

RD1/PSP120

RB7/PGD40

RB6/PGC39

RB538

RB437

RB3/PGM36

RB235

RB134

RB0/INT33

RD7/PSP730

RD6/PSP629

RD5/PSP528

RD4/PSP427

RD3/PSP322

RD2/PSP221

RC7/RX/DT26

RC6/TX/CK25

RC5/SDO24

RC4/SDI/SDA23

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI15

MCLR/Vpp/THV1

U1

PIC16F877A

X1

CRYSTAL

C122p

C222p

RA0/AN02

RA1/AN13

RA2/AN2/VREF-/CVREF4

RA4/T0CKI/C1OUT6

RA5/AN4/SS/C2OUT7

RE0/AN5/RD8

RE1/AN6/WR9

RE2/AN7/CS10

OSC1/CLKIN13

OSC2/CLKOUT14

RC1/T1OSI/CCP216

RC2/CCP117

RC3/SCK/SCL18

RD0/PSP019

RD1/PSP120

RB7/PGD40

RB6/PGC39

RB538

RB437

RB3/PGM36

RB235

RB134

RB0/INT33

RD7/PSP730

RD6/PSP629

RD5/PSP528

RD4/PSP427

RD3/PSP322

RD2/PSP221

RC7/RX/DT26

RC6/TX/CK25

RC5/SDO24

RC4/SDI/SDA23

RA3/AN3/VREF+5

RC0/T1OSO/T1CKI15

MCLR/Vpp/THV1

U2

PIC16F877A

R110k

R210k

RXD

RTS

TXD

CTS

D7

14D6

13D5

12D4

11D3

10D2

9D1

8D0

7

E6

RW

5RS

4

VSS

1

VDD

2

VEE

3

LCD1LM016L

50%

RV2

1k

X2

CRYSTAL

C422p

C322p

Transmitter Code

#include <16f877a.h>#fuses xt,nowdt#use delay(clock=4000000)#users232(baud=9600,xmit=pin_c6,rcv=pin_c7)void main(){while(1){printf("HIJJAWI ");delay_ms(500);}}

Receiver Code#include<16f877a.h>

#fuses xt,nowdt

#use delay(clock=4000000)

#include<lcd.c>

#use rs232(baud=9600,xmit=PIN_c6,rcv=PIN_c7)

char Rx[50];

int i=0;

#int_RDA

RDA_isr()

{Rx[i++]=getch();}

void main()

{enable_interrupts(INT_RDA);

enable_interrupts(GLOBAL);

lcd_init();

while(1)

{lcd_putc('\f');

lcd_gotoxy(1,1);

printf(lcd_putc,"%s",Rx);}}

INT_TIMERx

23

To deal with timers you must know the following simple commands:

value=get_timer0() //Returns the count value of a real time clock/counter. RTCC and Timer0 are the same. All timers count up. When a timer reaches the maximum value it will flip over to 0 and continue counting (254, 255, 0, 1, 2...).

set_timer0(value)// Sets the count value of a real time clock/counter.

INT_TIMERx

// 20 mhz clock, no prescaler, set timer 0 // to overflow in 35us set_timer0(81);     //

256-(.000035/(4/20000000))

Recommended