Вы находитесь на странице: 1из 201

205

void interrupt tmrO_int(void)

if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
} // TMRO.
// .
// . -
// :
LCDNybble(char Nybble, char RS) { // .
unsigned int i;
Data = 0; // .
for ( 1 = 0 ; i < 6; i++) { // .
Clock = 1; Clock = 0; // Clock
// .

Data = 1; // .
Clock = 1; Clock = 0; // Clock.
Data = RS; // R/S.
Clock = 1; Clock = 0;
for (i = 0; i < 4; i++) f // 4 .
if ((Nybble & 0x008) != 0)
Data = 1;
else
Data = 0;
Clock = 1; Clock = 0; // Clock.
Nybble = Nybble 1; //
// .

Data = 1; Data = 0; // .
} // LCDNybble.
LCDByte(char Byte, char RS) { // .
int LBDlay;
LCDNybble((Byte 4) & OxOOF, RS); // .
LCDNybble(Byte & OxOOF, RS); // .
if ((Byte < 4) && (RS == 0)) // .
LBDlay = RTC + 6; // 5 .
else
LBDlay = RTC + 2; // 1 .
while(LBDlay != RTC); // .
} // LCDByte.
// :
206

void main(void)
<
int i;
OPTION = OxOD1; // TMRO,
// 4.
TMRO = 0; // .
TOIE = 1; // .
GIE = 1; // .
// .
Clock = 0; Data = 0; //
// .
ClockTRIS = 0; // ,
DataTRIS = 0; // ,
// .
Dlay = RTC + 20; // 1 - 15
while (Dlay != RTC); // .
LCDNybble(Ox003, 0); // 2 -
Dlay = RTC + 6; // 5 .
while (Dlay != RTC);
LCDNybble(Ox003, 0); // 3 -
Dlay = RTC + 1; //
while (Dlay != RTC); // 160 (1 ).
LCDNybble(Ox003, 0); // 4 -
Dlay = RTC + 1; //
while (Dlay != RTC); // .
LCDNybble(Ox002, 0); // 5 -
Dlay = RTC + 1; // .
while (Dlay != RTC); // .
LCDByte(Ox028, 0); // 6 -
// (4- , ,
// 5x7).
LCDByte(Ox008, 0); // 7 - .
LCDByte(Ox001, 0); // 8 - .
LCDByte(Ox006, 0); // 9 -
// ( ,
// ).
LCDByte(OxOOE, 0); // 10 - .
for (i = 0; i < 12; i++) // "Hello World!".
LCDByte(Message[i], 1);
while (1 == 1) { // .
// .

} // .
207 \

,
. , -
TMRO,
.
.
' , , -
, , , , -
. -
,
. -
- .
, .
-
, .
Code\Lcd\lcd2.c:
include <pic.h>
// 17 2002 -
// , " ".
//
//
// 74LS174.
//
// :
// PIC16F84/PIC16F627,
// 4 ,
// ,
// RB1 - Clock (),
// RB2 - Data ().

// :
int RTC = 0; // .
volatile char LCDDlay = 20; // .
volatile char LCDState = 1; //
// .
static volatile bit Clock @ (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS @ (unsigned)&TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB*8+2;
static volatile bit DataTRIS @ (unsigned)&TRISB*8+2;
char * MessageOut; // ,
volatile char MessageOuti = 0; // ,
// .
char Message[13] = "Hello World!"; // ,
char Message2[11] = "\376\3002nd Line";
// :
if defined (J6F84)
warning PIC16F84 selected
CONFIG(Ox03FF1); // PIC16F84:
// ,
208

// PWRT ,
// ,
// ,
ftelif defined (J6F627)
warning PIC16F627 with internal oscillator selected
_CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
Seise
((error Unsupported PlCraicro MCU selected
endif
// :
LCDNybble(char Nybble, char RS) { // .
unsigned int i;
Data = 0; // .
for (i = 0; i < 6; i++) { // .
Clock = 1; Clock = 0; // Clock
// .

Data = 1; // .
Clock = 1; Clock = 0; // Clock.
Data = RS; // R/S.
Clock = 1; Clock = 0;
for (i = 0; i < 4; i++) { // 4 .
if ((Nybble & 0x008) != 0)
Data = 1;
else
Data = 0;
Clock = 1; Clock = 0; // Clock.
Nybble = Nybble 1; //
// .

Data = 1; Data = 0; // .
} // LCDNybble.
LCDByte(char Byte, char RS) { // .
int LBDlay;
LCDNybble((Byte 4) & OxOOF, RS); // .
LCDNybble(Byte & OxOOF, RS); // .

// , .
} // LCDByte.
LCDInitO // . ,
209

Clock = 0; Data = 0; //
// .
ClockTRIS = 0; // ,
DataTRIS = 0; // ,
// .
} // .
LCDOut(char * const LCOString) // .
{
while (LCDState); // , .
MessageOut = LCDString; // .
LCDState = 100; // .
} // LCDOut.
// :
void interrupt tmrO_int(void)
<
char temp;
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
// :
switch(LCDState) { // :
case 1: // .
if (-LCDDlay == 0)
LCDState++;
break; // 20 .
case 2: // 2.
LCDNybble(Ox003, 0);
LCDDlay = 5;
LCDState++;
case 3: // .
if (-LCDDlay ==0) '
LCDState++;
break;
case 4:
LCDNybble(Ox003, 0); // 3.
LCDState++;
break;
case 5:
LCDNybble(Ox003, 0); // 4.
LCDState++;
break;
case 6:
LCDNybble(Ox002, 0); // 5.
LCDState++;
break;
210

case 7:
LCDByte(Ox028, 0); // 6.
LCDState++;
break;
case 8:
LCDByte(Ox008, 0); // 7.
LCDState++;
break;
case 9:
LCDByte(Ox001, 0); // 8.
LCDState++;
LCDDlay = 5 ; // 5 .
break;
case 10: // .
if (--LCDDlay == 0)
LCDState++;
break;
case 11:
LCDByte(Ox006, 0); // 9.
LCDState++;
break;
case 12:
LCDByte(OxOOE, 0); // 10.
LCDState = 0; // .
break;
case 100: // MessageOut.
switch (temp = MessageOut[MessageOuti++]) {
case '\0': // ?
LCDState = 0;.
// .
MessageOuti = 0;
//
// ,
break;
case '\f': // .
LCDByte(Ox001, 0);
LCDState++;
LCDDlay = 5;
break;
case 254: // .
if ((temp =
MessageOut[MessageOuti++]) == 0)
LCDState = 0;
else {
if (temp < 4) {
LCDState++;
LCDDlay = 5;
} // endif
LCDByte(temp, 0);
>
break;
default: // .
LCD8yte(temp, 1);
} // switch,
break;
case 101: // .
211

if (-LCDDlay == 0)
LCDState--;
break;
} // switch.
} // if.
// .
) // .
// :
void main(void)
{
OPTION = OxOD1; // TMRO,
// 4.
TMRO = 0 ; , // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
LCDInitO; // , .
// .
LCDOut(Message); // .
LCDOut(Message2); // ,
while (1 == 1) { // .
// .
}
} // .
, LCDNybble , -
LCDByte .
LCDOut,
. , -
, -
. , LCDOut -
, , ,
-
,
:
Int LCDPoll () // .
{
if (LDState)
return 0; // .
else
return 1; // .
>
1,
. LCDOut -
, LCDPoll.
212

. -
, ASCIIZ, -
. -,
. \ f (forin feed)
,
.
254 ( OxOFE). -
. , ASCII-
, ( , 32 ,
, -
, -
).
- -
\ 3 7 6 ( ,
254). , , -
0x001, : \376\001.
. 4.10 .
4.10.

\376\001
\376\002
\376\010
, \376\014
, \376\016
, 0x040 \376\300

, , ,
:
Robot Moving
Forward

. ,
:
"\fRobot Moving\376\300Forward\376\014\0"

, , ,
,
, -
. . -
, ,
. Icd2 -
( , -
),
213

, -
led.
,
,
.
-
, ,
, -
. -
,
, -
.

4.18.
Star Trek, -
, , -
, .
, , -
, -
, () .


.
; .

. -
- ,
(Global Positioning System - GPS) ,
, . - -
.
-
, .
.
-
- ,

, -
. , , -
, .
, , -
- - , -

214

, ,
. , , -
.
-
.

4.19.

, , , -
. -
- .
, , -
,
, .
. 4.48. -
- -
. , , -
, , ,
.
, ,
, , -
.

. 4.48.

, -
, -
, , -
.
,

, , . 4.49.
215

. -
. -
, , , -
,
.

. .444+*-.+4+--+-
vcc : :
+

1)Ch 1: SVplt 10Qus

. 4.49.

,
20 , -
, ,
.
. -
:
while (1==1) { //
// .
if (Button == Press){ // ,
// 20 .
Debounce = 0;
while ( ( Debounce != 20msecs ) && ( Button == Press ) )
for (Debounce=0; (Button==Press) && (I<20msecs); Debounce++);
//
// .
Debounce = 0; // ,
// 20 .
while ( ( Debounce != 20msecs ) && ( Button == Release ) )
for (Debounce=0; (ButtonPress) && (K20msecs); Debounce++);
} // if.
216

// .
} // while.
, -
, . -
, -
.
( -
, - , -
),
, -
. , ,
,
, ,
.
,
, 20 ,
, -
.
:
while (1 == 1) { // .
// ,
if (ButtonPressFlag) { // .
//
// .
} // if.
// .
} I/ while.
TMRO:
void interrupt tmrO_int (void)
{
if (TOIF) { // TMRO.
TOIF =0; // .
RTC-M-; // .
//
// ,
// ,
if (Button == Press){ // .
if (ButtonReleaseCounter != 0) { // ?
ButtonPressCounter = 0;
ButtonReleaseFlag =0;
} else
if (++ButtonPressCounter >= 20) {
ButtonPressFlag =1;
ButtonPressCounter = 19;
217

> else ;
} else { // .
if (ButtonPressCounter != 0) { // ?
ButtonReleaseCounter =0;
ButtonPressFlag = 0;
} else
if (++ButtonReleaseCounter >= 20) {
ButtonReleaseFlag = 1;
ButtonReleaseCounter = 19;
} else;

> // .
ButtonReleaseFlag
(
ButtonPressCounter), ,
. ,
, ButtonReleaseFlag , -
ButtonPressFlag;
, -
.
ButtonReleaseFlag -
20 , -
ButtonReleaseCounter.
, , -
, , .
,
, ( -
, , ) ,
- -
, .
-
:
, -
-
, -
. -
, , -
.
, -
;
,
, .
,
, -
;
218

-
. -
, , .
,
(- )
, .
.
,
,
-
. , -
, , , ,
- -
.
, -
,
.
:.
-
, , .

4.20.
, -
-
, ,
-
, -
. -
, ,
, , -
. -
:
if (!Pin) //
// ,
// ,
if (ButtonPress < 20)
ButtonPress++;
else; // .
else //
// ( ),
if (ButtonPress != 0)
ButtonPress--;
else; // .
219

,
, ButtonPress,
20 ( , -
20 ), .
( -
), -
1, 0.
:
if (ButtonPress == 0)
// , .
else
if (ButtonPress == 20)
{
// , .
>
else
// .


.
-
, , . 4.50.
.
, , - , .

Vcc
Vcc
R4 470
2,2 = 0,1 R310K

N4 1r
EC rhr H p-tnb
U1 ' /7777
t

PIC16F627 V cc U2-74LS174
14 /////
Vdd RBO Vcc/ CLR
6 1,16 Q1/2C
2,4
+ 5,6
Q2/3C
7,11
Vcc ~C2 Q3/4D
?' S7>77 Q4/5D
10,13

8 9 Q5/6D
RB1 12,14
4 7 3 6Q i^
_MCLR RB2 D1
16 Gnd 5, CR1
Osc1 1N914
CTAL1
'/)//
Grid I ~"Q 15
Osc2
///// 5 1 1
Vss 1 1
Grid R21K

. 4.50.
220

, ,
, ,
.
.
, RBO
. -
. ,
"DEBOUNCING". 20 ,
, " PRESSED". -
ButtonPressed,
.
, , " DEBOUNCING"

.
' . 4.51, -
. 4.47.
VCC
/ Gnd

a old -- B B B Q D B B B B B ctjMnD
--

---

. 4.51.

, -
.
. 4.11.

4.11.

U1 11662711684
___
74LS174JK555TM9]*
CR1 9141521
221

4. / /. ()

CR2
Rl 10 ; 0,25 _MCLR

R2 1 ; 0,25
R3 10 ,
4 470 ; 0,25
1,2 0, 1



(14 ),
Hitachi 44780
XTAL1
4 ,

, ,
+5
' , . - , .

Code\Whisker\
whisker.c:
include <pic.h>

// 19 2002 - .
//
//
// ,
// 74LS174.
//
// TMRO.
//
// :
// PIC16F627/PIC16F84 4 .
// .
//
// :
// RBO - ( ""
// ( "" PORTB
// );
// RB1 - Clock ;
// RB2 - Data ;

// :
int RTC = 0; // ,
volatile char LCDDlay = 20; // ,
volatile char LCDState = 1 ; //
// .
222

static volatile bit Clock @ (unsigned)&PORTB*8+1;


static volatile bit ClockTRIS @ (unsigned)&TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB*8+2;
static volatile bit DataTRlS @ (unsigned)&TRISB*8+2;
char * MessageOut;// ,
volatile char MessageOuti = 0; // ,
// .
char Message1[2] = "\f"; // .
char Message2[12] = "\fdebouncing";
char Message3[9] = "\fPRESSED";
volatile char ButtonPress = 0; //
// .
// :
if defined (_16F84)
warning PIC16F84 selected
_CONFIG(Ox03FF1); // PIC16F84:
// ,
// PWRT ,
// ,
// .
elif defined(_l6F627)
warning PIC16F627 with external oscillator selected
__CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN ,
else
error Unsupported PICmicro HCU selected
endif
// :
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char * const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
223

if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
// :
if (!RBO) // ,
if (ButtonPress < 20)
ButtonPress++;
else;
else // .
if (ButtonPress != 0)
ButtonPress--;
else;
// ;
switch(LCDState) { // :
case 1: // .
if (--LCDDlay == 0)
LCDState++;
break; // .20 .
case 2: // -2.
LCDNybble(0x003, 0);
LCDDlay = 5;
LCDState++;
case 3: // .
if (--LCDDlay == 0)
LCDState++;
break;
case 4:
LCDNybble(Ox003, 0); // 3.
LCDState++;
break;
case 5:
LCDNybble(Ox003, 0); //- 4.
LCDState++;
break;
case 6:
LCDNybble(Ox002, 0); // 5.
LCDState++;
break;
case 7:
LCDByte(Ox028, 0); // 6.
LCDState++;
break;
case 8:
LCDByte(Ox008, a); // 7.
LCDState++;
break;
case 9:
LCDByte(Ox001, 0); // 8.
LCDState++;
LCDDlay = 5 ; // 5 .
224

break;
case 10: // .
if (-LCDDlay == 0)
LCDState++;
break;
case 11:
LCDByt'e(Ox006, 0); // 9.
LCDState++;
break;
case 12:
LCDByte(OxOOE, 0); // 10.
LCDState = 0; // .
break;
case 100: // .
switch (temp = MessageOut[MessageOuti++]) {
case "\0": // ?
LCDState = 0;
MessageOuti = 0;
break;
case "\f": // .
LCDByte(Ox001, 0);
LCDState++;
LCDDlay = 5;
break;
case 254: // ?
if ((temp = MessageOut[MessageOuti++]) == 0)
LCDState = 0;
else {
if (temp < 4) <
LCDState++;
LCDDlay = 5;
>
LCDByte(temp, 0);
}
break;
default: // .
LCDByte(temp, 1);
} // switch,
break;
case 101: // Message Delay
if (--LCDDlay == 0)
LCDState-;
break;
} // switch.
} // .
// .
} // .
// :
void main(void)

225

OPTION = OxOD1; // TMRO,


// 4.
TMRO = 0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1 ; // .
LCDInit(); // , .
// ,
while (1 == 1) { // .
// .
switch(ButtonPress) { // ?
case 0:' // .
LCDOut(Messagel);
break;
case 20: // .
LCDOut(MessageS);
break;
default: // .
LCDOut(Message2);
break;

} // .

, -
MPLAB -
.

( 3).
Debug => Asynchro-
nous Stimulus ( => ) - . 4.52. -
(. 4.53)
, Toggle (-
) RBO, . 4.54.
RBO -
, -
.
3, -
, .
, -
, , -
MPLAB. .

8-2101
226

. 4.52.

. 4.54
,
. 4.53.

4.21.
, -
- .
227

20 , -
, , ,
, , ,
..
- , -
-
.
. 4.55. -
. -
- , ,
, .
. -
-
.

. 4.55.

, -
,
1. ,
, - ,
,
.
.

, , ,
. - . .
228

(
) :
,
. , -
.
,
.
. . -
-
, -
.
, -
.
,
. , -
, , 16 ,
.
, ,
. , -
,
. -
:
, -
( ,
);
(
, );
- (
,
-).
, -
, -
(, , , -
). ,
, , ;
38 .
-
- -
-, -
.

,
229

, , ,
, . -
,
.
,
( -
) (
). -
- (. 4.56). -
,
.
! : :
' ' .,{_ ''' \ ''' i '''' t ''':__

i: ' . ' . ' . ' .


-i-

+
'/f
/". : : : :

LiJIJM 1 : W ; ** i M ! ' ! ! ' ' I ' ' i ' --


i; ; '. :

if- \ \
3)[TD]Ch 1: SVolt 50us
-4)[TD]Ch.2:. SVolt. 5pos t ; : ; :
. 4.56.

, -
.
-
. -
, -
, ,
.

4.22.
, , , , -
, , -
. , ,
, , ,
230

.
, .
,
.
, ,
,
. , -
.
38 , -
,
. , -
PIC16F84,
- .
, PICC Lite -
-
, . -
- 32
.
PICC Lite,
PIC16F627, -
. 4
- 38 :
CCPR1L = 13; // 50%.
CCP1CON = 000001111; // .
PR2 = 25; // 38
// 26 .
TMR2 = 0; //' TMR2.
T2CON = ; // TMR2,
// 1:1.
TRISB3 = 0; // RB3 ( -)
// .

. 4.57 , . 4.58
.

, ,
.
RB3 -
, ,
.
-
, -
( 38 ).
, , RC-, -
R5 .
231

. 4.57.

. 4.5S.

R4,
.
. 4.12 .
Wait-
rony ,
, .
232

4.12.

U1 116627 PIC16F84
U2 74LS 1 74 (K555JM9)"
/- 1Q18SCL
Waitrony

CR1 1N914 (52 1)"
CR2 IE-0530HP


RJ, R4 ' 10 ; 0,25
R2 1 ; 0,25
R3.R6 W ,

R5 ; 0,25
1,2 0, 1
47 , 16
(14 ),
Hitachi 44780
XTAL1
4 ,

, ,
+5
* , . , .

,
, . -
.
, ( -
, ).
, . -
, ,
,
.
, - -

, .
. , ,
, (

),
.
, :
TRISB3 = 0; // -
// ( ).
233

while (TMRO < 64);// , .


if (!RBO) // ,
Collision = 1; // ,
else

// .
Collision =0;
TRISB3 = 1 ; // -
// ( ).
- -
64 TMRO.
4 1:4 -
256 . 38 -
-. -
, , ,

.
, , -
, , -
. , -
, .
, . ,
,
- , !
,
, -
- ,
.
Code\Irdetect\
irdetect.c. - 38 . -
( - ), -
COLLISION. -
, .
R6 ,
, -
. , -
, ,
. . 4.58 , -
. ,
.
, , -
. -
.
, -
, - ( 10-12 )
,
234

,
. , -
- , -
COLLISION.
irdetect.c:
include <pic.h>
// 17 2002 - .
//
// ,
//
// 74LS174.
//
// TMRO.
//
// :
// PIC16F627 4 .
// .
//
// :
// RBO - ,
// RB1 - Clock ;
// RB2 - Data ;
// RB3 - - .
// :
i/it RTC = 0; // ,
volatile char LCDDlay = 20; // ,
volatile char LCDState = 1 ; //
// .
static volatile bit Clock (unsigned)&PORTB8+1;
static volatile bit ClockTRIS (unsigned)&TRISB*8+1;
static volatile bit Data (unsigned)&PORTB*8+2;
static volatile bit DataTRIS (unsigned)&T.RISB*8+2;
char * MessageOut; ,
volatile char MessageOuti = 0; // ,
// .
char Message1[2] = "\f"; // ,
char Message2[11] = "\fCOLLISION";
volatile char Collision = 0; // .
volatile char OldCollision = 0;
// :
(tif defined(_16F627)
warning PIC16F627 with external oscillator selected
CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
, 235

else
Serror Unsupported PICmicro MCU selected
endif
// :
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
//
// :
TRISB3 = 0; // -.
while (TMRO < 64); // 64 .
if (!RBO) // ,
Collision = 1; // ;
else //
// .
Collision = 0;
TRISB3 = 1; // -.
// :
switch(LCDState) { // :
case 1: // .
if (--LCODlay == 0)
LCDState+H-;
break; // 20 .
case 2: // 2.
LCDNybble(Ox003, 0);
LCDDlay = 5;
LCDState--;
case 3: // .
if ( LCDDlay == 0)
LCDState++;
236

break;
case 4:
LCDNybble(Ox003, 0); // 3.
LCDState++;
break;
case 5:
LCDNybble(Ox003, 0); // 4.
LCDState++;
break;
case 6:
LCDNybble(Ox002, 0); // 5.
LCDState++;
break;
case 7:
LCDByte(Ox028, 0); // 6.
LCDState++;
break;
case 8:
LCDByte(Ox008, 0); // 7.
LCDState++;
break;
case 9:
LCDByte(Ox001, 0); // 8.
LCDState++;
LCDDlay = 5 ; // 5 .
break;
case 10: // .
if (--LCDDlay == 0)
LCDState++;
break;
case 11:
LCDByte(Ox006, 0); // 9.
LCDState++;
break;
case 12:
LCDByte(OxOOE, 0); // 10.
LCDState = 0; // .
break;
case 100: // .
switch (temp = MessageOut[MessageOuti++]) {
case "\0": // ?
LCDState = 0;
MessageOuti = 0;
break;
case "\f": // .
LCDByte(Ox001, 0);
LCDState++;
LCDDlay = 5;
break;
case 254: // ?
if ((temp = MessageOut[MessageOuti++]) == 0)
LCDState = 0;
else {
if (temp < 4) {
LCDState++;
LCDDlay = 5;
. 237

LCDByte(temp, 0);
}
break;
default: // .
LCDByte(temp, 1);
} // switch,
break;
case 101: // Message Delay
if (--LCDDlay == 0)
LCDState--;
break;
} // switch.
} // if.
// .
> // .
// :
void main(void)

OPTION = OxOD1; // TMRO,


// 4.
TMRO = 0; // - THRO.
TOIE = 1; // TMRO.
GIF = 1; // .
LCDInitQ; // , .
// .
CCPR1L = 13; // - 50% .
CCP1CON = 00000001111; // .
PR2 = 26; // 38 26 .
TMR2 = 0; // TMR2.
T2CON = ; // TMR2,
// 1:1.
while (1 == 1) { . // .
// .
if (Collision != OldCollision) {
OldCollision = Collision; //
// ,
if (Collision)
LCDOut(Message2); // ,
else
LCOOut(Messagel);
while (LCDState); // .

} I/ .
, ,
.
238

4.23.
- /
. , -
,
.
, 1 9 , 3x3,
, /
- .
(0 )
- .
Sony.
Sony
; Manchester. -
, -
: , 2 4,
= 0,60 - . -
. 4.59, . 4.60
, .

__<
4 2



= 0,60
4 = 2,40
2 = 1,20

. 4.59.

. 4.60.
239

13 .
, ,
. -
, 4, ; -
. 0
2, 1 - . -
.
. 4.13 , -
Sony.

4.13.
Sony

0 ObOOllOlllOllll
1 ObOOllOlllOllll
2 ObOOllllllOllll
3 ObOlOlllllOllll
4 ObOOOlllllOllll
5 ObOllOllllOllll
.6 ObOOlOllllOllll
7 ObOlOOllllOllll
8 ObOOOOllllOllll
9 ObOlllOlllOllll
ObOlOllOllOllll
ObOOOllOllOllll
+ 1 ObOllllOllOllll
- 1 ObOOlllOllOllll
ObOOOlOOOlOllll
ObOllOlOllOllll
ObOOlOlOllOllll

50 . -
,
.
-
, - -
, . -
, ,
200 , .
,
-
.
-
,
240

, .
, -
:
void main(void) // .
{
unsigned int i;
unsigned int DataPacketStart; // .
unsigned int DataPacketEnd; // .
unsigned int DataPacket; // .
while (1 == 1) { // .
while (IRData == High); // .
DataPacketStart = THRO; // ,
while (IRData == low); // .
DataPacketEnd = TMRO - DataPacketStart; // .

if ( (DataPacketEnd > 2.2msecs) && (DataPacketEnd < 2.6msecs) ) <


// 12 .
DataPacket = i = 0; // .
DataPacketEnd = 1.8msecs;
while ( (i < 12) && (DataPacketEnd != 0) ) {
while (IRData == High); // .
DataPacketStart = TMRO; //
// ,
while (IRData == low); // .
DataPacketEnd = TMRO - DataPacketStart;
// ,
if ( (DataPacketEnd > 0.45msec) &&
(DataPacketEnd < 0.75msec) )
DataPacket = (DataPacket 1) + 1;
else
if ((DataPacketEnd > 0.95msec) &&
(DataPacketEnd < 1.35msec)
DataPacket = (DataPacket 1) + 1;
else // .
DataPacketEnd = 0; // .
i++; // - .
} // while,
if (DataPacketEnd != 0)
printf ("Data Packet = %i\n", DataPacket);
} I/ if.
} // while.
> // .
, -
. , , , -
: --
, ,
-, ,
-
.
241

,
, -
,
I! . -
, .

4.24.

, -
, -
, -
" .
, . -
,
, .
, Programming and Customizing PICmicro
Microcontrollers ( PIC-
micro),
PICmicro.
, - ,
.
,
,
.
, -
, :
Sony -
.
. -,
. - -
, -
12- . -,
.
3 -
PICmicra -
6 PIC16F84/PIC16F627 (RBO/INT), -

.
, , -
-
, . 4.61. , , -
, 0 1.
, , TMRO, -
.
242

_


LTL-


. 4.61.

-
, , :
.
, -
, ,
. 9 , -
. ,.
50 . , ,
.
-
, , , . -
-
. Code\Remote\remote.c:
((include <pic.h>
// 17 2002 - .
// 15 2002 -
// Sony.
//
// ,
//
// 74LS174.
//
// TMRO.
//
//
// :
//
// 1
// + + + + + +
// I I I I I I
// + + + + + +
//
// | 2,4 |540|660|540| 1,2 |
// .
// | 1,2 | 1,76 |
//
// | 300 | 440 |
//
243

// :
// PIC16F84/PIC16F627 4 .
// .

// :
// RBO -
// ( ):
// RB1 - Clock ;
// RB2 - Data .
// :
int RTC = 0; // ,
volatile char LCDDlay = 20; // ,
volatile char LCDState = 1; //
// .
static volatile bit Clock e (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS @ (unsigned)&TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB8+2;
static volatile bit DataTRIS @ (unsigned)&TRISB*8+2;
char MessageOut; // ,
volatile char MessageOuti = 0; // .
unsigned int Dataln; // .
unsigned char DatalnCount = 0; // .
unsigned char DataReady = 0; // .
int SaveRTC; // .
int CurrentRTC;
char Message[20] = "\f-> ObOxxxxxxxxxxxx"; // .
// :
if defined (J6F84)
warning PIC16F84 selected
_CONFIG(Ox03FF1); // PIC16F84:
// ,
// PWRT ,
// ,
// ,
eelif defined(_16F627)
warning PIC16F627 with external oscillator selected
CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN ,
else
error Unsupported PICmicro MCU selected
(tendif
// :
LCDNybble(char Nybble, char RS) // .
244

LCDByte(char Byte, char RS) // .

LCDInitQ // .

LCDOut(char const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
//
// :
CurrentRTC = (RTC & OxOFF) - ((SaveRTC 8) & OxOFF);
if (CurrentRTC < 0)
CurrentRTC = 0 - CurrentRTC;
if ((DatalnCount != 0) && (CurrentRTC > 9))
DatalnCount = 0; // .
// :

} // .
// .
if (INTF) { //
// RBO/INT. ,
if (DataReady) // ?
; // ,
else if (DatalnCount == 0) { // .
DatalnCount = 12; // ' 12 .
SaveRTC = ((RTC & OxOFF) 8) + TMRO;
// .
Dataln = 0;
} else { // .
CurrentRTC = ((RTC & OxOFF) 8) + TMRO;
// ,
if ((SaveRTC = CurrentRTC - SaveRTC) < 0)
SaveRTC = 0 - SaveRTC;
if ((SaveRTC > 250) && (SaveRTC < 350)) {
Dataln = (Dataln 1) + 1; // 1.
if (DatalnCount == 0)
DataReady = 1;
} else if ((SaveRTC > 390) && (SaveRTC < 490)) {
Dataln = Dataln 1 ; // .
245

if (--DatalnCount == 0)
DataReady = 1 ;
} else // .
DatalnCount = 0;
SaveRTC = CurrentRTC; // .

INTF = 0; // .
} //
// RBO/INT.
} // .
// :
void main(void)

int i;
OPTION = OxOD1; // TMRO,
// 4.
THRO = 0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
// .
LCDInitO; // , .
INTEDG = 1; //
// RBO/INT.
INTE = 1; //
// RBO/INT.
while (1 == 1) { // .
// .
if (DataReady) { // .
while (LCDState != 0); // .
for (i = 0; i < 12; i--) {
if (Dataln & (1 11))
Messagefi + 7] = '1';
else
Message[i + 7] = '0';
Dataln = Dataln 1 ;
} // .
LCDOut(Message); // .
DataReady = 0; //
// .
} // if.
} // while.
} // .
,
. RBO/INT ,
,
, INTF
246

. -
. , , RBO/INT.
DatalnCount -
, . , -
, .
( 12)
, . -
, 12 .
DataReady - -
, -
.
, , , .

. ,
, -
, Message , -
. , ,
.
,
,
, ,
.

4.25.

, -
. -
. .
-
, -
.

, .
, -
,
.
RBO/INT, , (),
,
. ,
38
. , -

, , , , .
247

.
-,
()
. -
,
, , -
, , ,
-
.
,
RBO/INT, -
, , , -
DatalnCount 12, 13 -
. ,
13
( ,
RBO/INT -
, ,
).
.
-
COLLISION, -
.
, -
.
, .
,
, 3 . -
2,4 , ,
. , -

. ,
, , -
, ,
, ,
.
-
. -
,
(
).
,
,
, -
. ,
248

( COLLISION,
).
,
,
. ,
50 ,
, ,
.
Code\Combine\com-
bine.c:
include <pic.h>
// 19 2002 -
// .
//
// 15 2002 -
// Sony
// .
//
//
// - 38 .
//
// ,
//
// 74LS174.

1
+ + + + +
I I I I I

2,4 |540|660|540| 1,2

I 1,2 | 1,76

| 300 | 440

// :
// PIC16F627 4 .
// .
//
// :
// RBO -
// ( );
// RB1 - Clock ;
// RB2 - Data .
// :
int RTC = 0; // .
249

volatile char LCDDlay = 20; // .


volatile char LCDState = 1; //
// .
static volatile bit Clock @ (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS @ (unsigned)4TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB8+2;
static volatile bit DataTRIS @ (unsigned)&TRISB*8+2;
char * MessageOut;// ,
volatile char MessageOuti = 0; // .
unsigned int Dataln; // ,
unsigned char DatalnCount = 0; // ,
unsigned char DataReady = 0; // ,
int SaveRTC; // ,
int CurrentRTC;
char Message[22] = "\376\0022-> ObOxxxxxxxxxxxx!";
// .
char Message1[12] = "\376\300 "; // ,
char Message2[12] = "\376\300COLLISION";
volatile char Collision = 0; // .
volatile char OldCollision = 0;
// :
if defined(_16F627)
_CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
else
(terror Unsupported PICmicro MCU selected
endif
// :
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char * const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
250

if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.

// :
if (DatalnCount != 0) <
if ((CurrentRTC = (RTC & OxOFF) -
((SaveRTC 8) & OxOFF)) < 0)
CurrentRTC = 0 - CurrentRTC;
// ?
if (CurrentRTC > 9) { // .
DatalnCount = 0; // .
INTE = 0;
// .
>
} else if ((!RBO) && (IDataReady)) <// ?
DatalnCount = 13;
//
// 12 .
SaveRTC = ((RTC & OxOFF) 8) + TMRO;
// .
INTF = 0; //
INTE = 1; //
// RBO/INT.
} else { // .
TRISB3 = 0; // -.
while (TMRO < 64); // 64 ""
// TMRO.
if (!RBO) // ,
// .
Collision**; // ,
else
Collision = 0;
TRISB3 = 1;" // -.
} // .
// :

} // .
// .
if (INTF) { //
// RBO/INT.
CurrentRTC = ((RTC & OxOFF) 8) + TMRO;
// ,
if ((SaveRTC = CurrentRTC - SaveRTC) < 0)
251

SaveRTC = 0 - SaveRTC;
if ((SaveRTC > 250) && (SaveRTC < 350)) {
Dataln = (Dataln 1) + 1; // 1.
if (--DatalnCount == 0) {
DataReady = 1 ;
INTE = 0; // , ,
} // endif
} else if ((SaveRTC > 390) && (SaveRTC < 490)) {
Dataln = Dataln 1; // .
if (--DatalnCount == 0) {
DataReady = 1;
INTE = 0; // , .
} // endif
} else if (--DatalnCount != 12) { // .
DatalnCount = 0;
INTE = 0; // , .
} // endif
SaveRTC = CurrentRTC; // .
INTF = 0; // .
} //
// RBO/INT.
I // .
// :
void main(void)
{
int i;
OPTION = 0x001; // TMRO,
// 4.
TMRO = 0; // TMRO.
TOIE = 1 ; // TMRO.
.GIE = 1; // .
// .
LCDInltO; // , .
INTEDG = 1; //
// RBO/INT.
CCPR1L = 13; // 50% .
CCP1CON = 000001111; // .
PR2 = 26; // - 38
// 26 .
TMR2 = 0; // TMR2.
T2CON = ; // TMR2,
// 1:1.
while (1 == 1) { // .
// .
if (DataReady) { // ,
while (LCDState != 0); // .
for (i = 0; i < 12; i++) {
252

if. (Dataln & (1 11))


Message[i + 8] = 'V;
else
Message[i + 8] = '0';
Dataln = Dataln 1;
} // .
LCDOut(Message); // Pass String to Output
DataReady = 0; // Reset the Data Flag

} // if.
if ((Collision == 0) && (OldCollision == 3)) <
OldCollision = Collision; //
// .
LCDOut(Messagel);
>
if ((Collision == 3) && (OldCollision ==0)) {
OldCollision = Collision; //
// .
LCDOut(Message2);
}
} // while.
} // .

4.26.
:
.
; -
, . -
: -
.
,

, , .
( -
) : , -
, , -
, ,
, , ( -
), .
(, ),
, , -
. -
- ,
-
.
, -
.
253

, , -
, ,
.
--
, Polaroid
6500. , ,
5. ,
, ,
.
, -
I , -
I . , Polaroid 6500 -
1 . ,
; , -
| , .
-
| , . -
| 1087,4 (
331,4 /); , (2,54 )
153,3 . , ,
, -
j 60,4 , . -
f ( Polaroid 6500) -
, , 2,76 , ,
18 (46 ).
Polaroid 6500 1970- .
, .
1
.
Polaroid 6500 :
, . -
15 (38 ). -
9- , -
. . 4.14.

4.14. Polaroid 6500

/
/ Gnd
2 BLNK' BLNK - 1,

3
4 INIT INIT = 7,

5 -
6 OSC 49,4
254

4.14. Polaroid 6500


()
/
7 ECHO /
;

4,7 )
8 B/NH BINH = 1 (blank inhibit),
,

9 Vcc -

-
.
BLNK BINH -
. INIT -
. INIT -
. ,
, ECHO. . 4.62 -
. ,
INIT .

. 4.62.

-
1000 -
.
, -
,
255

, .
, -
. ,
.
, Polaroid 6500 -
, 35 ( 10,7 ). -
64,4 . ,
65 , , -
.

4.27.


,
RBO/INT . -

. , -
, -
.
. 4.63,
- . 4.64, -
. 4.15.

Vcc
2,2 =

Vcc

Vcc

. 4.63.
256


Polaroid 6500




i --- I^B
i
DOQI

. 4.64.

4.15.


U1 11662711684
U2 74LS1741K555TM9)'
CR1 1N914 (521
R1 10 ; 0,25 _MCLR

R2 1 ; 0,25
R3 10 ,
R4.R5 4,7 ; 0,25
1,2 0,1
, 16 ()
'
/14 ),
Hitachi 44780
XTAL1
4 ,

Polaroid 6500
, ,
+5
' , . , .

INIT ECHO -
, R4 R5 -
4,7 . ,
257

-
, -
1000 .
-
. , , -
9- ( -
), ,
, .
Code\Ultra\ultrac:
((include <pic.h>
// 19 2002 - Polaroid 6500.
// .
//
// ,
//
// 74LS174.

// .
//
// :
// PIC16F84/PIC16F627 4 .
// .
//
// :
// RBO - ECHO Polaroid 6500
// ( " ");
// RB1 - Clock ;
// RB2 - Data ;
// RB3 - INIT Polaroid 6500.
// :
int RTC = 0; // ,
volatile char LCDDlay = 20; // ,
volatile char LCDState = 1; // .
static volatile bit Clock @ (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS @ (unsigned)&TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB*8+2;
static volatile bit DataTRIS 9 (unsigned)&TRISB*8+2;
char * MessageOut; // .
volatile char MessageOuti = 0; // .
char Message[9] = "\fxx\' xx\" // .
char Message2[9] = "\flnvalid" // .
unsigned int CheckDlay = 50; // 500
// .
unsigned int PulseStartRTC; // .
unsigned int PulseEndRTC; // .
unsigned char PulseEndTMRO; // TMRO
// .

9-2101
258

unsigned char PulseState = 0;


// - .
// 1 - .
// 2 - .
// 3 - .
unsigned long PulseTime; // .
unsigned long Pulselnches; // .
unsigned long PulseFeet; // .
// :
if defined (J6F84)
warning PIC16F84 selected
CONFIG(Ox03FF1); // PIC16F84: .
// ,
// PWRT ,
// ,
// .
elif defined(_16F627)
warning PIC16F627 with external XT oscillator selected
_CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
else
error Unsupported PICmicro MCU selected
endif
// :
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char * const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
259

//
// TMRO.
// :
if (--CheckDlay == 0) { //
// .
PulseStartRTC = RTC;
PulseState = 1; // .
RB3 = 1; // .
INTF = 0; // .
INTE = 1; //
// RBO/INT.
CheckDlay = 500; // 500 .
if (RTC > 64900) //
CheckDlay += 200; // 200 .

if ((PulseState == 1) { ((PulseStartRTC + 60) < RTC)) {


RB3 = 0; // ,
INTF = 0; // .
INTE = 0;
PulseState = 3;

// .

// :

} // .
// .
if (INTF) { //
// RBO/INT.
PulseEndTMRO = TMRO; // .
PulseEndRTC = RTC;
RB3 = 0; // INIT .
PulseState = 2;
INTF = 0; // .
INTE = 0; // RBO/INT.
} //
// RBO/INT.
} // .
// :
void main(void)

unsigned int temp;// .


OPTION = OxOD1; // TMRO,
// 4.
TMRO = 0 ; . // TMRO.
TOIE = 1 ; // TMRO.
6IE = 1; // .
260

LCDInitO; // , .
// .
RB3 = 0; // RB3
TRISB3 =0; // .
while (1 == 1) { // .
// .
switch(PulseState) { // ,
case 2: // .
PulseTime = (((long) PulseEndRTC * 256) +
(long) PulseEndTMRO) * 40;
PulseTime -= ((long) PulseStartRTC *
(256 * 40));
Pulselnches = PulseTime / 1533;
PulseFeet = Pulselnches / 12;
Pulselnches = Pulselnches % 12;
if ((temp = PulseFeet / 10) == 0)
Messaged 1] = ' ';
// 10 ,
//
// ,
else
Message[1] = temp + '';
Message[2] = (PulseFeet % 10) + '';
if ((temp = Pulselnches / 10) == 0)
Message[5] = ' ';
else
Message[5] = temp + '0';
Message[6] = (Pulselnches % 10) + '0';
LCDOut(Message);
PulseState = 0; // ,
break;
case 3: // .
LCDOut(Message2);
PulseState = 0; // ,
break;
} // switch.
} // while.
} // .
( 50 ) -
-
. , (
46 ) ( 11 ),
INVALID (). -
, -
.
-
10 1533.
153,3',
^_ 261

. , -
122; .
.

MPLAB. -
Code\Ultra\ultrasti:
! , .
!
! ,
! 51200 .
! 23148,3 ,
! 12' 7" (12 7 ).
I
! : 51200 + 23148 = 74348.
!
! ,
t
!
! 19 2002

Step RBO RB4 RB5 RB6 RB7


1 0 0 0 0 0 !
! .
15000 0 0 0 0 1
30000 0 0 0 1 1
45000 0 0 1 1 1
60000 0 1 1 1 1
74348 1 1 1 1 1 . !
! .
75000 0 1 1 1 0 !
! .
, 12 7
(3,84 ). ; -
RB3, INIT -
. , .
, INIT
51200 . 23148
,
RBO .
, RB4, RB5, RB6 RB7
, .
, (, , - ) ,
, , -
. .
1
,
( ). - . .

. - . .
262


, ,
.
, -

( RBO).
,
Debug => Simulator Stimulus => Pin Stimulus => Enable
( => => => ).
Code\Ultra ultrasti . -
Watch, P16F627.wat.
case 2 :
PulseTime = (((long) PulseEndRTC 256) + (long) PulseEndTMRO) 40;
F6, , -
F9.
, Window =>
File Registers ( => ), MPLAB
, . -
, ,
ASCII.
File Register Window ASCII Display (-
).
( F7)
,.
LCDOut(Message);

, . -
, .
, ,
, -
.
, , -
, .
, -
, -
.
, , -
.
12' 7"

File Register Window


12' 1" '

, -
.
263

( F6)
RB3 = 1;

. -
F9, ,
52037- , 51200-, . 837
5,46 (13,87 ) -
. 7 5,46, , 1,
.
, -
73248-, 75185- ,
12' 7".
-
whisker.c remote.c.
, - ,
, ,
, -
.

4.28.
-
. , ,

, -
, .
45
,
, . 4.65. -
.

. 4.65.
264

, , -
, ' -
, .
, -
.
, -
( - -
) :
. , -
, , -
, . -
.
, -
.
(
),
, -
. , ,
,
.
-
; , -
,
.

Vref vref .

I I
I I |^^-
, -
0_ -
- , -
i
,
4
^ - -
().
. 4.66. -
. 4.66.

, -
-
.
. -
Vref.
-
.
,
, ,
.
265


(. 4.67). -
, , ,
, . -
-
; .
,
, . ,
.
,
. , -
, .

Vcc

. 4.67. -

, -
Vcc -
,
= 2,2 R .

- -
, -
, -
.
,
(. 4.68).
, -
, -
Vref. ,
, ( ,
266

Vref

. 4.68.

, ), -
, - .
, ,
, , ,
-
.
, -
.
, .
, -
, , , -
. -
, .

4.29.

-
. -
; ,
.
,
( . 4.68). -
, ,
.
, , ;
, , -
. , ,
.
, , -
,
, ,
267

. 3,
PIC16F627 .
.
. 4.69.
, -
. , -
. -
RA2.

Vcc

Vcc

. 4.69.

. 4.70 . -
, -
. . 4.70 , -
. ,
,
,
.
, -
, , -
R4,
( . 4.69, -
).
268

Vdd/2

D D D D D --

DD G
---

. 4.70.

. 4.16.
.

4.16.

U1 PIC16F627
U2 74LS174IK555TM9J'
CR1 1914(521
R1 10;0,25
R2 1 ; 0,25
R3 10 ,

R4 10 ,
R5,R6 470 ; 0,25
CDSLCDS2 ,

0,1
0,01 '

/14 ),
Hitachi 44780
XTAL1
4 ,

, ,
+5
* , . - , .
269

Code\Light\lightl.c':
((include <pic.h>
// 24 2002 - , .
//
// ,
//
// 74LS174.
//
// .
//
// :
// PIC16F627 4 .
// .
//
//
// (
// . - , .):
// RA1 - 2 -
// ,
// , - ;
// RAO - 1 - Vss;
// RA2 - ,
// Vdd / 2;
// RB1 - Clock ;
// RB2 - Data .
// :
int RTC = 0; // ,
volatile char LCDDlay = 20; // ,
volatile char LCDState = 1; // .
static volatile bit Clock (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS (unsigned)&TRISB*8+1;
static volatile bit Data (unsigned)&PORTB*8+2;
static volatile bit DataTRIS (unsigned)&TRISB*8+2;
char * MessageOut; // ,
volatile char MessageOuti = 0; // ,
char Message1[3] = "\f*"; // ,
char Message2[18] = "\f "; // .
// 1 2345678901234567
// :
if defined(_16F627)
warning PIC16F627 with external XT oscillator selected
_CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,

, -
. ,
. ,
. - . .
270

// ,
// ,
// BODEN .
else
(terror Unsupported PlCmicro MCU selected
ffendif

// :
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char * const LCDString) // .

int ADCPollO // 7 CMCON


// ( 2).
{
return C20UT;

// :
void interrupt tmrO_int(void)
{
char temp; // (
// ).
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
// :
// ... ( )
} // .
// .
} // .
// :
void main(void)

OPTION = OxOD1; // TMRO,


// 4.
TMRO = 0; // TMRO.
271

TOIE = 1; // TMRO.
GIE = 1; // .
LCDInitO; // , .
// .
CMCON = 0x002; // .
// .
// CIS = 0.
// 2 (
// ).
TRISA = 0x003; // RAO RA1.
//
// ; ,
//
// RA2. - , .
VRCON = ; //
// Vref;
// Vref RA2;
// ;
// ; 12.
while (1 == 1) { // .
// .
if (lADCPollO) // 7
// CMCON?
LCDOut(Messagel); //
// .
else
LCDOut(Message2); //
// .
} // while.
} // .

. ( -
. 4.69) ,
. -
, -
, C2OUT (-
0), , Messagel
( ). , , -
, Message2 (
).
,
- , -
. .
. , -
, ,
272

- . ,
, -
.
, -
: . -
, , , . -
, ,
, , -
, . -
,
.
,
, ,
. , -
, .
1, -
,
.
, , -

.
, , -
. , ,
.
, , -
.
, -
, .
PIC16F627 , -
RC-,
R (. . 4.67). ,
.
. 4.71. -
(R5 R6) (
4). . 4.72 .
. 4.16.
, ,
- -
. - ,
-
.
1

,
. - . .
273

. 4.71. ,

. 4.72.

, -
, - .
. -
Code\Light\light2.c:
include <pic.h>
// 24 2002 - ,
// RC-.
274

// ,
//
// 74LS174.
//
// .
//
// :
// PIC16F627 4 .
// .
//
// :
// RB1 - Clock ;
// RB2 - Data ;
// RB4 - ;
// RB5 - .
// :
int RTC = 0; // ,
volatile char LCODlay = 20; // ,
volatile char LCDState = 1; // .
static volatile bit Clock @ (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS e (unsigned)&TRISB*8+1;
static volatile bit Data @ (unsigned)&PORTB*8+2;
static volatile bit DataTRIS @ (unsigned)&TRISB*8+2;
char * MessageOut; // .
volatile char MessageOuti = 0; // .
char MessageL[19] = "\376\200 "; //
// .
// 1 2 34567890123456789
char MessageR[19] = "\376\300 *"; //
// .
volatile char ADCState = 0; //
// .
volatile char ADCDlay = 1; // 1
// .
volatile char LeftADC = 0; // .
volatile char RightADC = 0; // .
// :
if defined(_16F627)
warning PIC16F627 with external XT oscillator selected
CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
else
error Unsupported Plunicro MCU selected
endif
// :
LCDNybble(char Nybble, char RS) // .
275

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char * const LCDString) // .

while (LCDState); // .
MessageOut = LCDString; // .
LCDState = 100; // .

// :
void interrupt tmrO_int(void)

char temp; .
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
// -
// TMRO.
// :

// :
.if (!LCDState) { // .
switch (ADCState) {
case 0: // ,
if (ADCDlay == 0)
ADCState++;
break;
case 1: //
// RC- (1 ).
TRISB4 = 0;
TRISB5 = 0;
RB4 = 1;
RB5 = 1;
ADCState++; //
// 1 .
break;
case 2:
TRISB4 = 1; //
// RC-.
temp = PORTB; //
// .
RBIF = 0;
RBIE = 1;
276

ADCState++;
break;
case 3:
LeftADC = OxOFF;
temp = PORTB;
RBIF = 0; //
RBIE = 0; //
// .
ADCState++;
break;
case 4:
TRISB5 = 1 ; //
// RC-.
temp = PORTB;
RBIF = 0; //
R8IE = 1; // .
ADCState++;
break;
case 5:
RightADC = OxOFF;
temp = PORTB;
RBIF = 0; //
RBIE = 0; //
// .
ADCDlay = 10;
ADCState = 0;
break;
} // switch.
} // if.
} // .
// .
if (RBIF) { // .
switch(ADCState) {
case 3: // .
LeftADC = TMRO; // .
ADCState++;
break;
case 5: // .
RightADC = TMRO; // .
ADCDlay = 10;
ADCState = 0;
break;
} // endswitch
temp = PORTB;
RBIF = 0; //
RBIE = 0; // .
} // .
}, // .
// : ' ,
void main(void)
277

unsigned int i, j;
unsigned int tempLeft, tempRignt;
OPTION = OxOD1; // TMRO,
// 4.
THRO = 0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
LCDInitO; // ,
// ,
while (1 == 1) { // .
// .
while (ADCState != 2); //
// ,
while (ADCState); //
// .
tempLeft = LeftADC; tempRight = RightADC;
//
// .
j = (tempLeft / 8) + 1; //
// ,
for (i = 2; i < 18; i++ )
if ((i - 2) <= j) // .
MessageL[i] = '*'; .,
else // .
MessageL[i] = ' ';
j = (tempRight / 8) + 1; //
// ,
for (i = 2; i < 18; i++ )
if ((i - 2) <= j) // .
HessageR[i] = '*';
else // .
MessageR[i] = ' ';
LCDOut(MessageL); //
// .
LCDOut(MessageR); //
// .
} // while.
} // .
-
, PORTB.
-
PICmicro, .
,
278

-
. , -
, - :
PORTB -
, ;
PORTB -
(-
, -
).
;
:
Variable = PORTB; //
// .
RBIF = 0 ; // .
RBIE = 0; // ( )
// .
,
, .
- , ,
R5 R6,
.
-
. RC- ,

RB4 RB5.
.
, ,
, , -
. , -

.
.
-
, -
,
,
.
-
6 , 330 .
.
279

4.30.

. -
, -
, . -
-
( , ,
). , -
, ,
.
, ( -
) -
. -
(. 4.73).

90 180 360
/4 /2

. 4.73.

( ), -
, -
. ,
x(t) = A sin(27it / ) = A sin(27cft),
- , - , f = 1/ - , t - .
,
. (360), -
. , .

90 ( /2):
x(t) = A sin(27tft) = A cos(27ift - /2).
280

j = 2; -
. , 9, ,

j = 0 / 180,
: = 3,14159265359. , 45 - /4 = 0,7854 , -
(360) - 2 = 6,2832 .
, ,
. -
. ,
. . 4.74 -
, , 1 -
, . -
, -
. -
.



()

1-
1 \ -\


1
. 4.74.

,
, -
.
. ,

, (
, - ),
. . 4.74 -
: ( , -
), , , ( ), (
, 0) ,
, . , ,
. 4.73 4.74, , -
. - . .
281

.. -
,

2 . . 2-irit,^ , 2 . . . . 2
:1 = I x(t) cos dt; b: = | x(t)sm dt,
-' TJ

. - , - ;
, -
. :

2-Trit . . . .
:COS hb:Sin .

._. I
, -
, , -

1
-l)7Tt
x(t)=AV
v
' ' ; j sm-

.
, , -
.
: -
, .
, ,
(). -
() . 4.75. ,
.
-
. ,
6 . , ,
3 , ,/2 =1,414 . , -
( ) - ,
1/1,414 = 0,707 -
.
-
, . -
- . 4.76.
R -
. R1 R2 -
. -
.
282


()
.

. 4.75. -

f = 1/(2RC)
k = R2 / R1

777.

. 4.76.

,
. , :
, , -
, ,
, !
. , ,
,
. , -
- (, ),
, .
. , -
(),
. ,
( ).
283

-
, , , , ,
. -
.
,
,
,
, . -
,
.
, , -
. -
, ( )
,
.
, -
.
, -
. -
,
.

. . -
-
, - (, -
TMR1). -
.

4.31.
.
.
,
!.
. 4.77.
, -
TMR1 ( RB6) PIC16F627.

(, , ,
, ), - -
. , -
.
. 4.17 .
284

Vcc Vcc

|
R1
I J R2
2,3 M
,1
II II vcc
/__

1 I j
H 0,1 \ R3
R4470
2
t
.
^^^^ 12
5 I23 * ^^^
611
3
' R5 13 ^\
"^>
I J ^ 470 I ^~^\
2 J J-| /////
0,1 ~~ 11 I
1 1
.. R7220 1 ~
R92 3M
^ M2,3M R8 M
R 8
2 0
h '
1
/4 J-C4
"" 0,1
S7/77

. 4.77.

4.17. , . 4.77


LM34211402 )"

R1 10 ; 0,25
R2, R3, R6, R9 2,3 ; 0,25
R4,R5 470 , 0,25
R7,R8 220 , 0,25
1 -4 0,1

PIC16F627
,
, +5
* 6 , . , .

LM324 ,
. -
(, 17741). -

, .
. 4.78 (
D'oh!). , -
, -
.
TMR1 20 ,
, - . ,
285

. 4.78.

-
. -
PIC16F627, PIC16F84 .
Code\Sound\sound.c:
include <pic.h>
// 27 2002 -
// .
//
// , ,
// .
// TMR1
// ( RB6/T1CKI ).
// 20 ,
// . 5 ,
// .
//
// ,
//
// 74LS174.
//
// .
//
// :
// PIC16F627 4 .
// .
//
// :
// RB1 - Clock ;
// RB2 - Data .
// :
int RTC = 0; // .
286

volatile char LCDDlay = 20; // .


volatile char LCDState = 1; // .
static volatile bit Clock 9 (unsigned)&PORTB*8+1;
static volatile bit ClockTRIS 9 (unsigned)&TRISB*8+1;
static volatile bit Data (unsigned)&PORTB8+2;
static volatile bit DataTRIS 9 (unsigned)&TRISB*8+2;
char * MessageOut; // .
volatile char MessageOuti = 0; // .
char Message1[18] = "\376\200sound - OxOxxxx";
// .
// 1 2 3456789012345678
char Message2[18] = "\376\200 ";
// , .
char soundCounter = 20; // 20 .
int OldTMRt = 0; // .
int CurrentTHRI; // .
volatile char soundState = 0; // ?
// - ;
// 1 - , ;
// 2 .- .
// :
if defined(_16F627)
warning PIC16F627 with external XT oscillator selected
CONFIG(Ox03F61); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
else
error Unsupported PICmicro MCU selected
ffendif
// :
char GetHex(char Value) // Value
{ // .
char returnValue;
if (Value > 9) 1
returnValue = Value + 'A - 10;
else
returnValue = Value + '0';
return returnValue;
} // GetHex
Dlay(int msecs) // msecs .
287

volatile int variableDlay;


variableDlay = RTC + msecs + 1 ; // ,
while (variableDlay != RTC);
} // Dlay
LCDNybble(char Nybble, char RS) // .

LCDByte(char Byte, char RS) // .

LCDInitO // .

LCDOut(char const LCDString) // .

// :
void interrupt tmrO_int(void)

char temp;
int TMRIValue;
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
// :
if (soundState == 0) // ,
if (--soundCounter == 0) { // ?
soundCounter = 20; // .
TMRIValue = (TMR1H * 0x0100) + TMR1L;
if (TMRIValue >= (OldTMRI + 2))
soundState = 1;
// .
OldTMRI = TMRIValue;
// .
} else;
else if (soundState == 1) // ?
if (--soundCounter == 0) { // ?
soundCounter = 20; // .
TMRIValue = (TMR1H 0x0100) + TMR1L;
if (TMRIValue < (OldTMRI + 2))
soundState = 2;
// .
OldTMRI = TMRIValue;
// .
} else;
288

// :

} // .
// .
} // .
// :
void main(void)

OPTION = OxOD1; // TMRO,


// 4.
TMRO =0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
LCDInitO; // , .
// .
TMR1H = TMR1L = 0; // TMR1.
T1CON = 0x003; // 1:1;
// T10SCEN ( ) ;
// _T1SYNC (
// );
// TMR1CS - ;
// THR10N - TMR1 .
while (1 == 1) { // .
// ,
while (soundState != 2); // .
CurrentTMRI = (TMR1H 0x0100) + THR1L;
Message1[13] = GetHex((CurrentTMR1 & OxOFOOO) 12);
Message1[14] = GetHex((CurrentTMRI & OxOFOO) 8);
Message1[15] = GetHex((CurrentTMRI & OxOFO) 4);
Message1[16] = GetHex(CurrentTMR1 & OxOF);
LCDOut(Messagel); // "Sound"
// ( ).
Dlay(1000); // 1 .
LCDOut(MessageZ); // .
soundState = 0; // . .
} // while.
} // .
. , -
R1, , -
, 150-200 , . 4.78.
289

4.32.
, -
, -
, , .
(), -
, - , -
,
.
-
, . ,
-
, -
. ,
-

- ,
.
(

\4
, ), --
, . 4.79.
-
, -
. 4.79.
. 1 4,
-
. , 1 4, -
2 3,
-
; , -
. , -
:
/ .
, ,
- -
().
(. . 4.33), , ,
.
, . 4.79, .
, -
. 293D (. 4.80).
,
3,6,11 14. 2,
7,10 15. 1 9 ,
( -).

10-2101
290

Vs -
Vss +5 -
15 , Vss - -
14
;
4,5 36 .
, -
Gnd Gnd
, 500 .
293D
,
Vs -

( ,
. 4.80. 293D -
),
293D
.
- -
293D . 4.81.

Vcc

0,1
///// /zzr

. 4.81.

-
- -
, . -
.
0,1 , -
5 2 .
291

, 293D -
,
( ) 0,7 . -
, , -
1,4-1,5 , Vss.
, , , -
. -
293D 1 , ,
.

-
, , .
-
, -
. -
293D.

4.33. TAMIYA

. -
, -
, . , ,
- , . -
-
Tamiya1.
, ( ) -
. -
, -
, .
. . . v . 4.82
Tamiya,

-
. (,
, -
); -
Wall-Hugging Mouse 70068.
-
. 4.82. , -
( ,
Tamiya ).

,
www.tamiya.ru. - .
292

,
.
. -
, - . -

1.
,
, . ,
, .
,
,
- .
, :
1. .
2. 9- .
3. ( ) ,
.
4. ,
.

, .
-
. .
, ,
, .
. 4.83.
. 4.84. , , -
. . 4.18 .
9- (
) . ,
( CR3
5 7), -
- , ,
. .
, 7 (1000 ) -
CR3 (. . 4.83).
, 9- 1,5--
, L293D - -
, .

1
. , ,
( ), ,
- - . - .
293

Vcc

Vcc

R3470

. 4.S3.








j
-
L293D


PIC16F627

. 4.84.

4.18.


UJ PIC16F627
U2 78105
IKP142EH5AI"
294

4.18. ()


U3.U4 /- 1018SCL ( )
U5 L293D
CR1
CR2
CR3 1N914 ,
200
Kl, R4, R5 10 ; 0,25
R2, R3, R8, R9 470 ; 0,25
R6,R7 100 ; 0,25
CDS1, CDS2 ,

1,6 0, 1
-5 ; 16
7 ; 16
8,9 0,01
XTAL1
4 ,

Tamiya, ,
, 9
* , . - , .

; ,
.
,
.
,
. ,
, .
, .
, -
, , -
. , ,
- ,
!
,
, -
. -
: -
, ,
( - ).
295

, -
.
,
, -
-. . 4.83 -
, .
Code\Wallhug\wallhug.c:
include <pic.h>
// 28 2002 - Tamiya.
//
// (- 38 ).
//
//
// Sony.
//
// .
//
// :
//
// 1
// + + + + + +
// I I I I I I
//
//
// | 2,4 |540|660|540| 1,2 |
//
// | 1,2 | 1,76 |
//
// I 300 I 440 I
//
//
// :
// PIC16F627 4 .
// .
//
// :
// RAO -
// ( );
// RA4 -
// ;
// RBO -
// Sony
// ( );
// RB1 - ( "-");
// RB2 - ( "+");
// R83 - ;
// RB4 - ;
// RB5 - ;
// RB6 - ( "-");
// RB7 - ( "+");'
II-
296

// :
int RTC = 0; // .
define remoteO Ox06EF //
define remote"! OxOFEF // .
define remote2 Ox07EF
define remotes OxOBEF
define remote4 OxOSEF
define remoteS OxODEF
define remote6 OxOSEF
define remote? Ox09EF
define remoteS OxOIEF
define remote9 OxOEEF
define remoteVolUp OxOB6F
define remoteVolDown Ox036F
define remoteCnanllp OxOF6F
define remoteChanDown Ox076F
define remotePrevChan Ox022F
define remoteMute OxOD6F
define remotePower Ox056F
unsigned int Dataln; // .
unsigned int DataTime = 0;
unsigned char DatalnCount = 0; // .
unsigned int CurrentRTC;
volatile char LeftCollision = 0; // ?
volatile char RightCollision = 0; // ?
volatile char ADCState = 0; //
// .
volatile char ADCDlay = 1; // 50
// .
volatile unsigned char LeftADC = OxOFF;
// .
volatile unsigned char RightADC = OxOFF;
// .
define goStop 0x030 // !
define goForward 0x072 // !
define goReverse OxOB4 // !
define turnLeft 0x074 // , !
// ( ).
define turnRight OxOB2 // , !
// ( ).
// :
// RB4/RB5 - .
define LeftForward 1 // , !
define LeftStop 0 // , !
define, LeftReverse -1 // , !
define RightForward 1 // , !
define RightStop 0 // , !
define RightReverse -1 // , !
unsigned char inotorState = goStop; // .
unsigned char PWMDuty = 15;
unsigned char PWMCycle = 0;
unsigned char OpnCount,= 1;
char ExecuteFlag = 0; // .
297

// :
if defined(J6F627) .
((warning PIC16F627 with external XT oscillator selected
CONFIG(Ox03F21); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
// ,
// ,
// BODEN .
else
error Unsupported PICraicro MCU selected
flendif
// :
void interrupt tmrO_int(void)

char temp;
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
RTC++; // .
//
// TMRO.
// :
PORTB = temp = (PORTB & 0x039) | 0x030;
//
// :
if ((!RBO) && (DatalnCount == 0)) { // ?
DatalnCount = 13; // 12
// .
I'NTF = 0; //
INTE = 1 ; // .
} else if (DatalnCount == 0) { // .
TRISB3 = 0; // -.
while (TMRO < 64); // 64 .
if (!RBO) // -
// ,
if (LeftCollision < 3) //
// .
LeftCollision++;
else;
else
LeftCollision = 0;
if (IRAQ) // -
// .
if(RightCollision < 3) //
// .
298

LeftCollisiont
. else;
else
RightCollision = 0;
TRISB3 = 1;

// -
// .
if (PWMDuty == 0) // ?

else if (PWMDuty == 29) // ?


PORTB = temp | motorState;
else // ?
if (PWMCycle <= PWMDuty)
PORTB = temp | motorState;
else;
if (++PWMCycle == 30)
PWMCycle = 0;
// :
if ((lExecuteFlag) && (--OpnCount == 0)) {
// .
OpnCount = 1;
PORTB = (PORTB & 0x039) | (motorState = goStop);
if (LeftADC < RigntADC)
RA4 = 0; // -
// ,
else
RA4 = 1; // -
// .

// :
if (OataTime) {
if (DatalnCount == 0) { // .
DatalnCount = 12; // 12 .
Dataln = 0;
} else { // .
Dataln = Dataln 1;
if ((DataTime > 225) && (DataTime < 375)) {
// 1.
Dataln++;
if (--DatalnCount == 0) {
OpnCount = 200; // ,
if (Dataln == remote2) {
motorState = goForward;
} else if (Dataln == remotet) {
motorState = turnLeft;
} else if (Dataln == remote6) (
motorState = turnRight;
} else if (Dataln == remoteS) {
motorState = goReverse;
299

} else
if (Dataln == remoteVolUp) {
if (PWMDuty < 29)
PWMDuty++;
else;
} else
if (Dataln == remoteVolDown) {
if (PWMDuty '!= 0)
PWMDuty--;
. else;
} else
if (Dataln == remotePower) {
ExecuteFlag = 1;
motorState = goStop;
OpnCount = 1 ; // .
} else {
ExecuteFlag = 0;
motorState = goStop;
OpnCount = 1; // .

} else if ((DataTime > 375) &&


(DataTime < 500)) { // 0.
if (--DatalnCount == 0) {
OpnCount = 200; // ,
if (Dataln == remote2) {
motorState = goForward;
} else if (Dataln == remote4) {
motorState = turnLeft;
} else if (Dataln == remote6) {
motorState = turnRight;
} else if (Dataln == remoteS) {
motorState = goReverse;
} else
if (Dataln == remoteVolUp) {
if (PWMDuty < 29)
PWMDuty++;
else;
} else
if (Dataln == remoteVolDown) {
if (PWMDuty != 0)
PWMDuty-;
else; .
} else
if (Dataln == remotePower) {
ExecuteFlag = 1;
motorState = goStop;
OpnCount = 1; // .
} else {
ExecuteFlag = 0;
motorState = goStop;
OpnCount = 1; // .

} else if (--DatalnCount != 12) // .


DatalnCount = 0;
300

DataTime = 0; // .

// :
CurrentRTC += 0x0100;
// :
if ((DatalnCount) && (CurrentRTC > 0x00900))
DatalnCount = 0; // . .
// :
if (!DatalnCount) { // ,
if (ADCState == 0) { // ,
if (--ADCDlay == 0)
ADCState++;
} else if (ADCState == 1) {
// RC- (1 ).
PORTS = PORTS 0x030;
TRISB4 = 0;
TRISB5 = 0;
ADCState++; //
// 1 .
} else if (ADCState == 2) {
TRISB4 = 1; // .
temp = PORTB;
RBIF = 0; //
RBIE = 1; // .
ADCState--;
} else if (ADCState == 3) {
LeftADC = OxOFF;
temp = PORTB;
RBIF = 0; //
RBIE = 0; // .
ADCState++;
} else if (ADCState == 4) {
TRISB5 = 1; // .
temp = PORTB;
RBIF = 0; //
RBIE = 1; // .
ADCState++;
} else if (ADCState == 5) {
RightADC = OxOFF;
temp = PORTB;
RBIF = 0; //
RBIE = 0; // .
ADCDlay = 50;
ADCState = 0;

} // .
// .
if (INTF) { //
// RBO/INT.
DataTime = CurrentRTC + TMRO;// .
301

CurrentRTC = OxOFFFF - TMRO; // .


INTF = 0; // .
} // RBO/INT.
if (RBIF) { //
// PORTB.
if (ADCState == 3) {
LeftADC = TMRO; // .
ADCState++;
} else {
RightADC = TMRO; // .
ADCDlay = 50; // 50 .
ADCState = 0;

temp = PORTB;
RBIF = 0; //
RBIE = 0; // PORTB.
} //
// PORTB.
} // .
// " :
void Dlay(int msecs) // msecs .

int valueDlay;
valueDlay = RTC + msecs + 1; // ,
while (valueDlay != RTC); // .
} // Dlay.
void LEDOutput(int state ) // .

if (state)
RA4 = 0; // .
else
RA4 = 1; // .
} // LEDOutput.
int GetLeftLightO // .
{
return LeftADC;
>
int GetRightLightQ // .
{
return RightADC;
}
int GetLeftWhiskerO // .

if (LeftCollision == 3)
return 1; // ,
else
302

return 0; // .
}
int GetRightWhisker() // .
<
if (RightCollision == 3)
return 1; // ,
else
return 0; // .
}
void LeftMotor(int Movement, int Speed) // .
{
switch (Movement) {
case 1: // .
motorState = (motorState & OxOF9) + 2;
break;
case 0: // .
motorState = motorState & OxOF9;
break;
case -1: // .
motorState = (motorState & OxOF9) + 4;
break;

PWMDuty = Speed;
}
void RightMotor(int Movement, int Speed)// .
{
switch (Movement) {
case 1: // .
motorState = (motorState & Ox03F) + 0x040;
break;
case 0: // .
motorState = motorState & OxOSF;
break;
case -1: // .
motorState = (motorState & Ox03F) + 0x080;
break;
>
PWMDuty = Speed; '
}
// :
void main(void)

OPTION = OxODt; // TMRO,


// 1:4.
TMRO = 0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
303

// .
INTEDG = 1; //
// RBO/INT.
CCPR1L = 13; // - 50% .
CCP1CON = 000001111; // .
PR2 = 26; // 38
// 26 .
TMR2 = 0; // TMR2.
T2CON = ; // TMR2,
// 1:1.
CHCON = 0x007; // PORTA.
PORTA = 0x010; // RA4 -
// ( ).
TRISA = OxOEF;
PORTB = 0x000;
TRISB = 0x039; // RB7/RB6 RB2/RB1 - .
while (1 == 1) { // .
if (ExecuteFlag)
//
// .
} else {
//
// .

} // while.
} // .
,
:
int GetLeftWhiskerO; //
// .
int GetRightWhiskerO; //
// .
// .
int GetLeftLightO; // ,
int GetRightLightO; // .
//
// RC-.
void LeftMotor(int Movement [ , int Speed ] ); //
// .
void RightMotor(int Movement [ , int Speed ] ); //
// .
// (Speed)
// , .
void LED(iut State); // / .
304

void LCDOutput(char * Message); // .


void Dlaydnt msecs); // .
-
2 , 4 6 -
, 8 - ( ), 5 - (
).
,
, . -
-,
, (50%).
100%, -
. , .
,
-
. ( 5) -
. -
,
- ,
, -
, .
, , -
, - .
, ,
, -
.
, ,
,
.
.
, -
,
60 ,
. -
- RC- . -
10 .
6 ,
.
, , -
1,5 , 9-

. ,
L293D .
, -
, , L293D -
.
305

4.34.
- , ,
.
(-
) ().
, -
.
, ,
. -,

, -, -
-
PIC16F627.
-
. .
.
(, !), -
, , -
. -
,
(. 4.85). -
-
.
,
.
; , , -
, , .
, .
-
,


' ( 10)


1 (0)

1 (25)

. 4.85.
306

. -
, .
, ,
V: -

V = 2rcrN / (),
- ; - ;
N - , .
, 3 ,
30 , 10 -

V = 2 3,14 3 10 / (30 1 ) = 6,28 /.
, . -
15 /, , 1 /, - -
, .
, -
, ,
.
Tamiya,
. -
-
( -
),
, , , -
- .
, -
, ,
. , ,
:
.
,
, -
-
, (
, , -
).
, , .
-, ( )
. , -
, . ,
, - -
, , , .
307

-, . ,
.
-
---
(). -
( )
. , -
: ,
( -
- );
, ,
-
( , - -
, ); -
,
(
).

u = k v + kn + kda,
v, n - , -
, a k , kd - , -
,
.
( ) -
, , -
, -
.
k -
. , -
.
,
. , -
-
.
PIC16F627
- -
TMRO, -
. , -
,
. ,
. -

, -.
308

, , -
,
INS (Inertial Navigation
System). , -
, -
.

. , ,
, .
, -
.
,
.
, (, )
(xl, yl) = (0, 0), , -
(2, 2) = (3, 4).
, . -

tgo-Ay/Ax-(y2-yl)/(x2-xl).

tga = Ay / Ax = 4 / 3 = 1,333...
:
a = arctg Ay / .
arctg (4/3) = 53,13 = 0,927 .
, , ,

, .
, . -
,
, , -
. . 4.86 , , -
. -
.
, , ,
, , .
,
.
. 4.87. ;
, ,
309

. 4.86.

. 4.87.

. X , -
( - , - ) ,
, , - Y. -
. 4.87 . ,
,
X = R sinct; X / R = sina.
R - ( , -
); a - .

Y = (R + Z)sina; Y / (R + Z) = sina,
Z - .
, , -
, ,
X / R - Y / ( R + Z).
310

, -
:
R = XZ / (Y - X).
X, Y Z R, ,
, :
= arcsin(X / R). .
, , X = 2 , Y = 2,1 , Z = 4 ,
R = X Z / ( Y - X ) = 2 x 4 / (2,1 - 2) = 8 / 0,1 = 80 ;
= arcsin(X / R) = arcsin(2 / 80) = arcsinO,025 = 0,025 = 1,43.
,
, .

, Z/2 . -
, , R + Z/2 = 82 . ,

2 = (R + Z / 2) since = 82 sinO,025 = 2,05 ;
2 = (R + Z / 2) (cosa - 1) * 0.
, (0; 2,05).
, ,
. , . -
, , ,
, , -
,
. , -
, , -
.
-
, , -
, -
, .

4.35.

.
,
, . -
(R/C servo) ,
^__ 311

0 90 ( - 0
180). ( ), , -
, ,
. +5 .
- -
: ,
. . '
,
- . -
1 2 , 20 (. 4.88).

I
I
I
I
I
^
I

^ 1
I
-f
^ 1 I I
I
2 ' .

. 4.88. -

-
. - -
, -
:
InterruptO { // .
int i = 0;
BitOutput( Servo, 1 ) // .
for ( i = 0, i < (1 msec + ServoDlay); i++ );
BitOutput( Servo, 2 );
for ( ; i < 2 msec; i++ ); // 2 .
// .
-
( Servo -
ServoDlay). -
, ServoDlay
,
.

, ,
312

,
, -
. .
, -
256 . -
; -
. 4.19.
4.19.
,
1 1,00
2 1,25
3 1,50
4 175
5 2,00

, -
, , -
, ,
, , -
, 90.
.
.

4.36.
-
. , -
. -

, -
. ,
.
,
, -
.
8x3,75 (203x95 ).
-
( ),
.
.
. 4.89. -
. 4.90, . 4.20.
313


\
\

/ \
/ ""
/

. 4,89.

4,8 Vc Vcc vcc


-"'
+
2 -
| 47
/77 *, SDJ^ M TTCJ-r- C3
' ' |
Vcc U1 /////
PIC16F627 R2470
g

L Vdd RB3
14
6
4 RBO
Vcc
_L |0,01
1
^ _MCLR
R
@CDS1 Gnd
Vcc Vcc
4 }
RB2 8 SW-2 |
RA1

L
4 . R510K H , J +
*@>CDS2 _Lb
7
vcc C4 ^=
Osc1 - j t '
J 4-| RB2
S7/77 \ 1 _ R8 10 R J 1+
1 15 Osc2 R
| SW3 ^^ -1^
///// /75571
IFC5 '
5 RB4 10
Vss
RB5 1 1 ^//
Gnd
S7s77

, 4.90.

4.20.


Ul PIC16F627
U3 PIC- 1 0 1 8SCL Waitrony
/ )
CR 1
R1, , 5, R6, R8 10 ; 0,25
314

4.20. ()


R2 470 ; 0,25
R4 100 , 0,25
R7 10 ()
CDS1,CDS2 ,

1 0, 1
2 47; 16
-5 ; 16
SW1
SW2, SW3
XTALI
4 ,

,
, ,
, , 1,2

:
1. ,
.
2. .
3. ,
(-
-
).
4. , -
.
5. .
6. , -
.
, , -
.
( ) ,
, ,
(, Internet),
, , -
.
. -
.
, (
, ) ,
315

. -
, ,
, . ,
, -
. .

.
-
( 2 3 ,
5-7,5 )
,
, -
-

. -
( ) , . 4.91.
,
, ,
(. 4.91).
,
. , -
.
-
.
,
- .
, .
. 4.89 ,
, - , .
,
.

, , , -
, -
, , -
.
, -
. . 4.89,
( - ).
1,2 , -
4,8 , -
.
.
470 .
.
316

.
, 10
.
,
.
-
Sony. , , -
Tamiya.

. , (-
R7 . 4.90),
, .
, -
PIC16F627. -
Code\Servo\servo2.c:
ttinclude <pic.h>
// 28 2002 - .
// 23 2002 - .
//
// TMRO,
// 512 .
//
// :
// PIC16F627 4 .
// .
//
// :
// RA1 - 1 (
// );
// RA2 -
// ( );
// RBO -
// Sony ( );
static volatile bit IRDetect @ (unsigned)&PORTB*8+0;
// RB1 - ;
static volatile bit RightWhiskerPin (unsigned)&PORTB*8+1;
// RB2 - ;
static volatile bit LeftWhiskerPin (unsigned)&PORT8*8+2;
// RB3 - ;
static volatile bit LED (unsigned)4PORTB*8+3;
static volatile bit LEDTRIS (unsigned)&TRISB*8+3;
// RB4 - ;
static volatile bit leftServo (unsigned)&PORTB*8+4;
static volatile bit leftServoTRIS (unsigned)&TRISB8+4;
// RB5 - ,
static volatile bit rightServo (unsigned)&PORTB8+5;
317

static volatile bit rightServoTRIS @ (unsigned)&TRISB*8+5;


// :
unsigned int RTC = 0; // ,
unsigned char RTCOlay = 2; // 1 (
// 512 ).
// :
define LeftForward 38 // .
define LeftStop 37
define LeftReverse 36
define RightForward 36 // .
define RightStop 37
define RightReverse 38
char ServoDlay = 1; //
// ( 20 ).
char leftSpeed = LeftStop; // .
char rightSpeed = RightStop; // .
// :
define remoteO Ox06EF // 0-9.
define remote"! OxOFEF
define remote2 OxOJEF
define remoteS OxOBEF
define remote4 OxOSEF
define remoteS OxODEF
define remote6 OxOSEF
define remote7 Ox09EF
define remoteS OxOIEF
define remote9 OxOEEF
define remoteVolUp OxOB6F // "".
define reraoteVolDown Ox036F // "".
define remoteChanUp OxOF6F // " +1".
define remoteChanDown Ox076F // " -1".
define remotePrevChan Ox022F // " ,".
define remoteMute OxOD6F // " ".
define remotePower Ox056F // "".
unsigned int Dataln; // .
unsigned char DatalnCount = 0; // .
unsigned int DataTime = 0;
unsigned int CurrentRTC = 0;
int OpnCount = 1; // ,
//' .
volatile char LeftWhisker = 0; // .
volatile char RightWhisker = 0; // .
char ExecuteFlag = 0; // .
// :
if defined(_16F627)
warning PIC16F627 with external XT oscillator selected
_CONFIG(Ox03F21); // PIC16F627:
// XT,
// RA6/RA7 -,
// ,
// PWRT ,
318

// ,
// ,
// BODEN ,
else
(terror Unsupported PICmicro MCU selected
tfendif
// :
void interrupt tmrO_int(void)
{ ' '
if (TOIF) { // TMRO.
TOIF = 0; // TMRO.
if (--ServoDlay == 0) {
ServoDlay = 40; // 20 .
leftServo = 1; //
rightServo = 1; //
// .
else {
if (leftSpeed >= ServoDlay)
leftServo = 0; //
// ' .
if (rightSpeed >= ServoDlay)
rightServo = 0;//
// .

//
// ( ).
if (DataTime) {
if (DatalnCount == 0) { // .
DatalnCount = 12; // 12 .
Dataln = 0;
> else { // .
Dataln = Dataln 1;
if ((DataTime > 450) && (DataTime < 750)) {
// 1.
Dataln++;
if (--DatalnCount == 0) {
OpnCount = 400; // .
leftSpeed = LeftForward;
rightSpeed = RightForward;
if (Dataln == remote2)

else if (Dataln == remote4)


leftSpeed = LeftReverse;
else if (Dataln == remote6)
rightSpeed = RightReverse;
else if (Dataln == remoteS) {
leftSpeed = LeftReverse;
rightSpeed = RightReverse;
} else
319

if (Dataln == remotePower) {
ExecuteFlag = 1;
leftSpeed = LeftStop;
rightSpeed = RightStop;
OpnCount = 1; // .
} else { // .
ExecuteFlag = 0;
leftSpeed = LeftStop;
rightSpeed = RightStop;
OpnCount = 1; // .

} else if ((DataTime > 750) &&


(DataTime < 1000)) {
// .
if (-DatalnCount == 0) {
OpnCount = 400; // .
leftSpeed = LeftForward;
rightSpeed = RightForward;
if (Dataln == remote2)

else if (Dataln == remote4)


leftSpeed = LeftReverse;
else if (Dataln == remote6)
rightSpeed = RightReverse;
else if (Dataln == remote8) {
leftSpeed = LeftReverse;
rightSpeed = RightReverse;
} else
if (Dataln == remotePower) {
ExecuteFlag = 1;
leftSpeed = LeftStop;
rightSpeed = RightStop;
OpnCount = 1 ; // .
} else { // .
ExecuteFlag = 0;
leftSpeed = LeftStop;
rightSpeed = RightStop;
OpnCount = 1 ; // .

} else // .
DatalnCount = 0;
}
DataTime = 0;

CurrentRTC += 0x0100; // .
// :
if ((DatalnCount) && (CurrentRTC > 0x01200))
DatalnCount = 0;
// .
//
// ( 1 ):
if (--RTCDlay == 0) { ' '
320

RTCDlay = 2; // - .
RTC++; // .
// :
if (!LeftWhiskerPin) // .
if (LeftWhisker < 20) //
LeftWhisker++; // .
else; // 20 .
else // .
if (LeftWhisker != 0) //
LeftWhisker; // .
else; // 20 .
// :
if (!RightWhiskerPin) // .
if (RightWhisker < 20) //
RightWhisker++; // .
else; // 20 .
else // .
if (RightWhisker != 0) //
RightWhisker; // .
else; // 20 .
// :
if (OExecuteFlag) && (-OprfCount == 0)) {
OpnCount = 1;
leftSpeed = LeftStop;
rightSpeed = RightStop;
if (C20UT)
LED = 0; // .
else
LED = 1; // .

} // .
// - .
if (INTF) { //
// RBO/INT.
DataTime = CurrentRTC + TMRO;// .
CurrentRT-C = OxOFFFF - THRO; // .
INTF = 0; // .
} // .
// .
// :
void Dlay(int msecs) // msecs .

int valueDlay;
valueDlay = RTC + msecs + 1; // ,
while (valueDlay != RTC); // .
} // Dlay.
void LEDOutput(int state ) // .
-321

if (state)
LED = 0; // ,
else
LED = 1; // .
} // LEDOutput.
int GetLeftLightO - // .
{
if (C20UT)
return 0x080; // ,
else
return OxOFF;
} I/ GetLeftLight.
int GetRightLightO
<
*
if (IC20UT)
return 0x080; // ,
else
return OxOFF;
} // GetRightLight.
int GetLeftWhiskerO // .
<
if (LeftWhisker == 20)
return 1; // ,
else
return 0;
} // GetLeftWhisker.
int GetRightWhiskerO // .
{
if (RightWhisker == 20)
return 1; // ,
else
return 0;
} // GetRightWhisker.
void LeftMotor(int Movement) // .
{
leftSpeed = Movement;
} // LeftMotor.
void RightMotor(int Movement) // .
{
rightSpeed = Movement;
} // rightMotor.
// ;

112101
322

void main(void)
{
OPTION = OxODO; // TMRO,
// 1:2.
TMRO = 0; // TMRO.
TOIE = 1; // TMRO.
GIE = 1; // .
// .
INTEDG = 1; //
// RBO/INT.
INTF = 0; // .
INTE = 1; //
// RBO/INT.
CMCON = 0x002; // :
// ;
// CIS = 0;
// 2 (
// ).
TRISA = 0x007; // RAO RA1.
VRCON = ; //
// :
//
// RA2,
// ,
// 12.
LED = 1; // .,
LEDTRIS = 0; // .
leftServo = rightServo = 0; //
// .
leftServoTRIS = rightServoTRIS = 0 ; .
// :
while (1 -= 1) { // .
if (ExecuteFlag) {
// , .
} else { '
// .

} // while.
} // .
. -,
. -
, -
.
, .
-, R7, -
.
323

- , -
, -
. , (-
, ),
.
, ,
, , -
.
5


( ) -
, .
() ,
,
.
.
, , ,
. , , -
.
, .
,
-
-
. ,
, , -
, , , -
.
,

,
. , -
(, ), ,
, -
,
.
.
, -
, -
. ,
.
( )

.
325
5.1.
(, Real Time Operating System -
RTOS) , -
(tasks - ), , ,

.
(, ), -
. -
,
, -
- . () -
,
, -
.
- -
. ,
PICmicro .
-
, .
, ,
: - , -
-
.
, ,
, .
() -
, -
; ,
.

, , , - , -
( ),
. -
, , -
.
, (kernel) . -
, -
, . -
: 1) -
(Basic Input/Output System - BIOS), -
, ; 2) -
, .
326

, -

.
, ,
, ,
,
. ,
, ,
( ),
.
( ) .
. -
, .
, ,
.
.
, , -
- ,
(, -
). -
,
. ,
-
.
, -
-
, .

. -
. , -
.
,
, .
,
() -
, ,
,
. , -
, . -
,
. ,
, . -

, .
327

, -
. ,
- ,
, , - ,
. , - -
( )
, .

, ( -
- ).
.
-
, .

,
,
, .
, -
,
,
( ).
, -
, -
. -
, ,
.
- - ,
. ,
.
, - , -
,
,
TMRO.
, , , -
, .
, ( -
) , -
.
-
, , , ,
.
- : -
, ,
, .
328

, -
. ,
, . -
,
, , ,
. -
.

- . (
-) . -
, .
, , . (
, -), -
, ,
. , -
, , . -
,
.
,
,
-
. -
-
, , , .

, ,
, , -
' , .
. 5.1 ;
. -
,
.
, ,
.
, . -
, , .
, . 5.1 -
. ,
, , -
.
, (

, ).
329

5. 1. OCPB


StartTask {)
(Address , Priority
[ , TaskName] )
End () -

Next ( ) ~
,

Send (Task, "
Message)

Check ( ) ,
( /

Wait () ,
,


Read (Message*) ,
( )

Ack (Message*) ( }

Get (Semaphored) , ;

Poll (Semaphore*) ( ,
)
Free (Semaphore*) ( , ,


)
Dlay (msecs)


. -
- AllTask. . --
, (). -
StartTask (. . 5.1):
void AllTaskO // .
{
StartTask(Task1, 1); // Taskl.
While(1 == 1); // .

Taskl,
1.
330

, AllTask 0, -
, - , -
.

:
: (), -
( ) (-
).
,
, , -
.
( ) , -
-
. , -
.
- ( ) .
-
, ;
, -
.
, ;
:
, . -
:
. -
End ( ) .

5.2. ,


, .
, -
, -
.
, , ,
-
, ,
,
.
, -
, ,
331

. : -
, -
( ), - -
, - , -
( ) .
, ,
,
.
,
, , -
, , - -
.
. 5.1, - , -
. -
. -
. , , , ,
, .
:
void biologicO // "" (Roach)

int left, right; // .


int msgnum; // .
msg message; // .
while (1 == 1) < // .
if (Poll(control_sem) == free) { // ,
message = biologic_task;
Send("bump", message);// bump - ,
// ,
msgnum = WaltO;
message = Read (msgnum);
Ack(msgnum); // ,
if (message != no_collision) { // .
message = motor_stop; // .
SendC'motor", message);
} else < // .
message = biologic_task;
Send("light", message); //
message = get_left_light_sensor; //
SendC'light", message); // .
msgnum = WaitO;
left = Read(msgnum);
Ack('msgnum);
message = biologic_task;
SendC'light", message); //
message = get_right_light_sensor; //
SendC'light", message); // .
msgnum = WaitO;
right = Read(msgnum);
Ack(msgnum);
332

// "" :
if (right >= left)
. message = motor_left;
else
message = motor_right;
Send("motor", message);
>
}
Dlay(100); // 100
// .
} // while.
} // .
, , ,
, . , -
, , .
, (
if), .
-
control_sem - -
.
:
void bump() // .
{
int left, right; // .
int msgnum; // .
msg message; // .
msg Sender; // - .
left = 0; right = 0; // ,
while (1 == 1) { // .
if (leftsensor == collision) // ,
if (left < 5)
left++; // ,
else ;
else // ,
if (left > 0)
left--; // .
if (rightsensor == collision) // ,
if (right < 5)
right++; // ,
else ;
else // ,
if (right > 0) .
right--; // ,
msgnum = Check(); // ?
if (msgnum != nojnessage) ( // , .
Sender = Read(msgnum); //
Ack(msgnum); . // ,
if (Left == 5)
if (Right == 5)
333

message = "Both"; // ,
else
message = "Left"; // ,
else if (Right ==5)
message = "Right" // ,
else if ((Right != 0) | (Left != 0))
message = "Indeterminate" // ,
else // .
message = "no_collision"; // .
Send(Sender, message); // .
}
Dlay(10); // .
} // while.
}
( -
, - ,
; -
). ,
, .
, ,
; Send.
: , -
- .
-
50 , ( -
"Indeterminate").
,
, .
, -
-.
- , ,
, .
.
100 ,
. -
motor__running , (-
), , ,
, , (-
, -
,
). :
void motor() // .
{
int 'i;
int msgnum; // .
msg message; // .
i=0; // .
334

while (1 == 1) {
if (~i == 0) { // 100 , ,
motors = stop;
i = 1;
Free(motor_sem) ;

msgnum = Check(); // ?
if (msgnum != no_message) { // .
message = Read(msgnum) ; //
Ack(msgnum); // ,
motors = message;
if (message == stop) <
i = 1; // .
Free(motor_sem); // .
} else { // .
i = 10;
Get(motor_sem); // .

>
DlaydO); // .
// while.

.
, , -
. :
void light() // .

int msgnum; // .
msg message; // .
msg Sender; // - .
while (1 == 1) { // .
msgnum = Wait() // .
Sender = Read(msgnum); // .
Ack(msgnum); // .
msgnum = WaitO // .
message = Read(msgnum); // .
Ack(msgnum); // ,
if (Poll(motor_sem) != Free) {
// :
message = motor_stop;
SendC'motor", message);
>
if (message == get_left_light_sensor)
message = LeftLightLevel;
else
message = RightLightLevel;
Send(Sender, message) ;
335

// while.

; -
.
-
, Taskl:
void Taskl() // .

Start(biologic, 2, "biologic"); // .
Start(motor, 3, "motor"); // .
Start(bump, 3, "bump"); // .
Start(light, 3, "light"); //
// .
EndO; // .

.
, . ,
,
, .
, -
, -
.
: - , -
, -
. :
void controlO // .

Get(control_sem); // ( ).
msg message; // ,
while (1 == 1) { // .
if- (RemoteControl = ButtonPress) { // .
switch(Button) { // ?
case Forward: // ""
// ( ),
if (Poll(control_sem) == Free)
Get(control_sem);
Send(motor, Forward);
break;
case Reverse: // ""
// ( ),
if (Poll(control_sem) == Free)
Get(control sem);
Send(motor, Reverse),;
break;
case TurnLeft: // "".
it (Poll(control_sem) == Free)
Get(control_sem);
Send (motor, TurnLeft);
336

break;
case TurnRight: // "",
if (Poll(control_sem) == Free)
Get(control_sem);
Send(motor, TurnRight);
break;
Case Stop: // "",
if (Poll(control_sem) == Free)
Get(control_sem);
Break;
Case Start: // "".
Free(control_sem);
break;
} // witch.
} // if.
Dlay(10); // .
} // while.
}
, :
void Task1() // .
. {
Start(control, 1, "control");
Start(biologic, 2, "biologic");
Start(motor, 3, "motor");
Start(bump, 3, "bump");
Start(light, 3, "light");
End();
>

,
: -.
-
.
, -
, .
-
. -
, ,
, .
, , -
.

5.3.

(), .

337

, -
.
-
(. 5.1),
.


'
|

J
< >

. 5.1.

( . 5.1 -
) -
. -
Addr
(). ,
-
. , ( -
); .
switch,

.
. -
, , :
main() // .
int State = 1; // .
while(1 == 1) // .
switch (State) // : .
case 1: // 2 .
Move(Forward);
Dlay(2000); // 2 (
// ),
if (Collision == "No") // .
State = 5; // ,
else // , .
State = 10; // .
break;
case 5 // (0,75 ).
Move(TurnLeft);
Dlay(750);
if (Collision == "No") // .
State = 1 ; // .
else // , .
338

State = 10; // .
break;
case 10: // , (1).
Move(Reverse) ;
Dlay(1000) ;
State = 15; // .
break;
case 15: // (0,5 ).
Move(TurnRight);
Dlay(SOO);
State = 1; // .
break;
} // switch.
} // while.
} // .
-
, Dlay , -
.
: -
,
( State ).
, , -
. ,
, ,

.
.
-
50 , , -
( -
),
. -
, .
main() // , 2.
{
int State = 1; // .
int DlayCount = 0; // .
while (1 == 1) { // .
switch(State) {
case 1: // (2 )
Move(Forward);
DlayCount = 40; // 40
// 50 .
State = 2; //
// ( ),
break;
case 2: // (2 ).
if (Collision == "No") ' // .
339

if ( DlayCount)
State = 2; // 0,
// ,
else
State = 5;
else // .
State = 10;
break;
case 5: // (0,75 ).
Move(TurnLeft);
DlayCount = 15; // 750 .
State = 6; // ,
break;
case 6: // (0,75 ),
if (Collision == "No")
if (--DiayCount)
State = 6;
else
State = 1; I
else
State = 10;
break;
case 10; // ( 1,).
Move(Reverse);
Dlay(1000) ;
State = 15;
break;
case 15: // (0,5 ).
Move(TurnRight);
Dlay(SOO);
State = 1 ;
break;
} // switch.
Dlay(50); // 50 .
} // while.
} // .
10 15 , -
. ,
, , - .
-
.

, .
.
- -
- ,
. , -
, , ,
.
340


. --

.

5.4. ,


, , -
,
.
, , -
( 0,75 ),
. - , -
( ), 0,5 -
, , -
.
-.
(
) :
while (1 == 1) {
CollisionFlag = 0; // .
LeftMotor(leftForward); // .
RightMotor(RightForward); // .
Dlay = RTC + 2000; . // 2 .
while (Dlay != RTC)
if (GetLeftWhiskerO) // ?
CollisionFlag = 1;
else if (GetRightWhiskerO) // ?
CollisionFlag = 2;
if (ICollisionFlag) {
// , , .
LeftMotor(LeftForward); // .
RightMotor(RightReverse); // .
Dlay = RTC + 750; // 0,75 .
while (Dlay != RTC)
if (GetLeftWhiskerO)
// ?
CollisionFlag = 1;
else if (GetRightWhiskerO)
// ?
CollisionFlag =2;
} // if.
if (CollisionFlag == 1) { // .
341
LeftMotor(LeftReverse); // .
RightMotor(RightReverse); // .
Dlay = RTC + 500; // 0,5 .
while (Olay != RTC); // .
LeftMotor(LeftForward); // .
RightMotor(RightReverse); // .
Dlay = RTC + 500; // 0,5 .
while (Olay != RTC);
} // if.
if (CollisionFlag == 2){ // .
LeftMotor(LeftReverse); // .
RightMotor(RightReverse); // .
Dlay = RTC + 500; // 0,5 .
while (Dlay != RTC);
LeftMotor(LeftReverse); // .
RightMotor(Right Forward); // .
Dlay = RTC + 500; // 0,5 .
while (Dlay != RTC);
} // if.
} // while.
, .
, , -
. , -
. - -
.
, - :
while (1 == 1) { // .
switch (State) {
case 1: // 2 .
State++; // 2.
StateDlay = RTC + 2000; // 2 .
LeftMotor(LeftForward); // .
RightMotor(RightForward); // ,
break;
case 2: // 2.
if (GetLeftWhiskerO) // .
State = 10;
else
if (GetRightWhiskerQ) // .
State = 20;
else if (StateDlay == RTC)
State++; // ,
break;
case 3: // (0,75 ).
State++;
StateDlay = RTC + 750;
LeftMotor(LeftForward); // .
RightMotor(RightReverse); // ,
break;
342

case 4: // 0,75 .
if (GetLeftWhiskerO)
State = 10;
else if (GetRightWhiskerO)
State = 20;
else if (StateDlay == RTC)
State = 1 ;
break;
case 10: // .
State++;
StateDlay = RTC + 500;
;
LeftMotor(LeftReverse);
RightMotor(RightReverse);
break;
case 11: // 0,5 .
if (StateDlay == RTC)
State++;
break; ' .
case 12: // (0,5 ).
State++;
StateDlay = RTC + 500;
LeftMotor(LeftForward);
RightMotor(RightReverse);
break;
case 13: // 0,5 .
if (StateDlay == RTC)
State = 1 ;
break;
case 20: // .
State++;
StateDlay = RTC + 500;
LeftMotor(LeftReverse);
RightMotor(RightReverse);
break;
case 21: // 0,5 .
if (StateDlay == RTC)
State++;
break;
case 22: // (0,5 ).
State++;
StateDlay = RTC + 500;
LeftMotor(LeftReverse);
RightMotor(RightForward);
break;
case 23: // 0,5 .
if (StateOlay == RTC)
State = 1;
break;
} // switch.
} // while.
343

- .
. ,
, ,
-
.
. -
Code\Statemc\wallhug.c
Tamiya,
Code\Statemc\servoc -
.
, ,
. -
Lef tMotor RightMotor. -
( -
- ),
.
--
. , -

. , -
.

5.5.
, , - -
. , , -
, :
GetToyBehaviorQ // , ...
{ '
printf("Mawa, ! ?!\");
Response = Input.Data; // .
while. ((Response != "") && (Response != ", ")) {
// .
Position(LieDown); // ,
Crying(Start); // .
printf("Hy, --\");
if (Input.Pending) {
// , :
Response = Input.Data; // .
if (Response ! = " , !"){
// .
printf("fl !")
Response = "";
344

} // if.
) // if.
} // while. '
Position(Stand); // .
Crying(Stop); // .
} // .
, -
, -
, ,
. -
, -
: -
, ( ,
, -
), -
.
,
-
. , ,
,
- .
, , - -
, -
, , -
, .
, -
, -
, , -

.
, , , ,
, - -
, .
, ,
( ) -
. ,
8- : -128 -
, 0 - , +127 - .
: distance () - vector ( ) -
. -
( int). -

345

struct motor {
int left; // .
int right; // .

,
, -
. , , - (-
) .
, , ,
, - .
,
.
, ,
:
motor directionBehavior(motor Data)
{ // ( ).
int dir; // .
Data.left = Data.right = 0;
dir = direction(); // .
if (dir > 0) // .
if (dir < tuneAngle) { // .
Data.left = -slowTurn;
Data.right = slowTurn;
} else if (dir < turnAngle) {
Data.left = -mediumTurn;
Data.right = mediumTurn;
} else { // .
Data.left = -fastTurn;
Data.right = fastTurn;

else if (dir < 0) // ,


if (dir > -tuneAngle) { // .
Data.left = slowTurn;
Data.right = -slowTurn;
} else if (dir > -turnAngle) {
Data.left = mediumTurn;
Data.right = -mediumTurn;
} else { // .
Data.left = fastTurn;
Data.right = -fastTurn;

return Data; // - .
} // .
, -
, . ,
346

, , .
, . -
, .
, -
:
motor closeBehavior(motor Data)
{ // ( ).
int dist; // .
dist = distanceO; // .
Data.left = Data.right = 0;
if (dist > closeClosest)
if (dist > closeFurthest)
Data.left = Data.right = forwardFull;
else
Data.left = Data.right =
( forwardFull (dist - closeClosest) ) /
(closeFurthest - closeClosest);
return Data;
} // .
, . -
, .
, -
, - . , -
, , .
-
, ( -
).
. , -
, -
PICmicro .
, , -
:
motor awayBehavior(motor Data)
{ // ( ).
int dist;
dist = distanceO; // .
Data.left = Data.right = 0;
if (dist < awayFurthest)
if (dist < awayClosest)
Data.left = Data.right = reverseFull; // ,
else
Data.left = Data, right =
(reverseFull * (awayFurthest - dist)) / (
(awayFurthest - awayClosest);
return Data;
} // .
347

:
void main(void) // .

motor directionData; // .
motor closeData;
motor awayData;
motor CombinedData; // ' .
while (1 == 1) { // .
pause(RunDlay); //
// .
directionData = directionBehavior(directionData);
closeData = closeBehavior(closeData);
awayData = awayBehavior(awayData);
// , :
CombinedData.left = directionData.left +
closeData.left + awayData.left;
CombinedData.right = directionData.right +
closeData.right + awayData. right;
WheelCommand(CombinedData); // .
pause(LoopDelay); //
// .
} // while.
} // .
. 5.2
.

5.2.


tuneAngle 5 ,

turnAngle 20'
slowTurn 5
medi umTurn /5
fast Turn 40
closeClosest 36 ^
closeFurthest 48 ,

forwardFull 50
awayClosest 36 ,


a way Furthest 48 ,


reverseFull -50
348

,
.
. ,
47 (119 ) ,
15 . -
, . 5.3.
5.3. ,

directionBehavior cloaeBebavior awayBebavior Combined


Left ^15 7s ~4 ~2~6
Right /5 45 ^4 5d

( - Left) -
( - Right), -
, . ,
, ,
. ,
- fuzzy-1. -
, --
.
,
. , ,
.

5.6.
, ,
. , ( ),
, ,
. -
,
, ,
,
.
; -
, -
.

: , -
,
1
Fuzzy- (, fuzzy - ) ,
, , .. - . .
349

, -
, .
, -

, , , -
. ,
.
-
. , -
, .
.
, . -
, , :
. , -
- .
, , .
,
, -
.
( ) -
, ,
. -
. ,
50% 56%
1.
, ,
, -
. , -
, , -
. ,
, - -
, ( ,
, ).
-
.
() -
1912 . , -
, (10-15 ). -
( )
. , -
,
. , -
, . -
- . - . .
350

( ), -
, ?
, , , -
?
, -
, ,
-
.
. ,
, , , -
, , -
, . -
, (
) ,
. , -
- ,

, -
1.
,
. -
- -
, , , ,
,
.
, ,
, , , ,
( ) ,
, -
. , ,
, -
, .
-
,
, , -
, - .

40- XX , .
, , , ,
(),
,
. - . .
351

, -
.
,
(AND, OR, XOR ..).
, -
, , -
. -
- .
-
. , ,
, .
, -
: -
, -
, , -
2.
, - ,

. . 5.2 ,

.

. 5.2.

:
= f (),
f - ,
.

2
DARPA Neural Network Study, 1988. - AFCEA International Press. - P. 60.
352

, ,
, -
, -
,
, , -
.
, -
. -
, ,
. ( -
) , -
,
. -
, -
.
, -
.
,
, . ,
, , -
.

, ,
- . ,
. 5.2 ,
, , -
.
, ,
, -
-, -
. ,
.
, , -
. ,
: , -
. ,
,
, , -
.
-
. , ,
, -
353

,
. () -
, , -
, ,
.
? -
,
-
. , ,
. -
, -
, .

12-2101

, , -
. , -
.
, -
.
,
.
, , -
, . :
, , . -
, : << -
, -
, ,
.
, , -
. , , -
- , ,
. , -
.
, .
, -

. -
,
. ,
, , , -
, , , .
?
. , ,
, .
, . .
, , -
. ,
355

, , -
, ,
.
4 ; -
, -
.
-
.
,
, -
,
... ,
.
, . , -
, ,
, ,
, , . -
-
, , .
- . -
, ,
. , -
, -
.
, .
, . -
,
, . -
, , -
, , -
.

6.1.
: ! -
, , .
, .
, - ! -
, .
. -
-,
, ( -
),
, .
356

, (-
, ). ,

. , -
.
, , - -
. , -
,
:
;
TMRO;
TMRO (
);
- TMR2.
? -
?
-
? , ,
, , ,
.
, ,
.
, ,
.
: - .
: . , -
, ,
,
, .
.
Internet -
, ,
, , -
, , .
. : ,
, . -
, . , ,
. ,
Internet . -
,
, ,
,
- , .
357

, -
. . ,
,
. , ,
.
. -
:
?
?
?
?
?
?
?
-
?
?
() ?
?
?
,?
.
( ),
, - -
, . -
, , ,
- - .

. :
;
(, );
( -
);
;
, ;
.
, .

.
, , , , -
. -
, -
,
358

. , -
,
, .
, -
. ,
, . -
, , ,
. , ,
. -
,
,
.
, -
. , , , ,
, ,
. -
.
, -

(, , -
- , ,
,
). -
!

6.2.
,
, .
, -
, -
- -.
, , -
; -


.
,
(,
).
, -
, -
, -
, ,
359

- , -
,
. , -

.
, ,
.
-
,
, , ..
( -
). , -
- .
,
:
-
. , -
;
;
(, -
, );

.

6.3.

,
, '
.
?
?
?
?
?
( ,
)?
?
,
, . ,
El Cheapo -
-, , -

360

. , : -
, ,
p-n- 2N3906.
,
, . -
, Internet -
, -
.
, -
, . , -
:
. , ,
.
, -

. :
1N4001, 1N4192 (1N915);
2N3904/2N3906, 547/557;
IRF510/IRF9510;
ECS/Panasonic;
Watrony;
74LS;
78(L)xx;
(7)555.

- , , -
. , -
, -
.
- .
-
, -
.
. ,
,
- 5 ,
. .
(
), . , -
, ,

. -
- -
, .
361

-
.
, ,
-
:
;
;
;
;
.
, ,
, , -
.

;
.
, -
-
. - -
.
, , ,
4,
. -
, , -
,
.
-
, ,
.

6.4.
,
, , ,
. -
:
( --
) (4,75 5,25 );

;
;
.
362

, , -
, -
.

, ,
, -
(5%).
. ,
, , ,
.
- -
, , -
, -
,
.

. - -
,
.

, . -
, -
: -
.
,
. -
, ,
, -
, .

, -
- .
, -
, ,
-
.
.
- . ,
. -
ASCII. -
, , / ,

HTML PDF Adobe.
363

6.5.
(debug), -

, -
(failure analysis). ,
: , , -
!
, , .
, -
:
, ;
;
.
-
, , , -
.
, ,
.
.
, , ,
. -
.
, , -
, ,
. , -
, -
(,
).
. ,
! ,
. ,
, -
.
: -
, -
. ,
, ,

. ,
.
,
,
364

. , -
, .
-
. -
. -
, ,
, ..
, . -
- ,
.
, -
, , , -
.
,
,
.
, . -
,
, -
.
, .
, , -
, -
.
. ,
, -
,
. -
, .

6.6.
, , , -
. ,
, .
, , -
, . , -
, , -.
, -
- (, Internet).
,
365

, -
, . '
, -
- ,
, - .
-
. -
, 4, -
,
.
, -

25% , , -
75% .
- -
.

. , -
,
, .
, -
, . ,
-
, , .

,
.
- ,
.
,
.
, ,
. -
, -
,
. ,
- .
: ,
, . -
, ,
.
1


.
,
.
- -
-, .
- , -
,
.
- : 1 = 1 / 1 . . .
- ,
.
- . . .
- , -
( ) -
.
- ,
, ,
.
, - (ADC, Analog-to-Digital Con-
verter) - , -
. . .
- ,
( ).
. n-p- , p-n- .
- , /
.
(ICP, In-Circuit Programming) -
.
- , -
8.
- ,
.
- : 1 = 1 "1.
1 367

- -
. -
.
(GUI, Graphic User Interface) - -
, -
, , .
- ,
4 2
2. , 37 = 32 + 4 + 1 = 2 + 2 + 2 = 10101.
- , -
. . .
- ,
10.
- ,
-
.
(LCD, Liquid Crystal Display) - ,
( ).
- ,
.
- , -
( -
).
(IR, infrared) - , 760 -
, .
. . .
- , -
. -
.
- ,
.
- ,
( , -
).
(CMOS) - , -
- - .
- (
), .
- , -
.
- ,
.
(linker) - , -
/ -
.
368

- . -
. ,
?, . ;
,
. (-
).

. -
-
().
- -
.
- , .
- - ,
, -
. . .
- - ,
,
. . .
- : 1 = 1 1 . . .
- .
( ) - , -
.
- ,
.
(, ground) - , -
.
- ,
().
, -
().
(label) - ,
.
- ,
. . .
(fuzzy logic) - , , -
, , , , .
- ( );
.
() - , -
.
() .
1 369

, -
, ,
.
(debugger) - , -
.
- , 0 -
( - ) 1
( ).
- , , ,
,
.
- ; , -
. .
- - , -
: , -
.
- ,

, .
- , 1 -
( ) 0 -
( ).
- , -
(,
).
- -
.
- -
.
() -
.
(PC, Program Counter) - -
, .
, (-
) . -
.
- .
(LED, Light-Emitted Diode) - ,
( ).
- , -
. -
- (.).
- ,
.
370

, -
(EPROM, Erased Programmable Read Only Memory) -
, .
- . LIFO.
-
. ,
, ;
.
- , -
().
- ,
.
(pointer) - , .
- , -
.
, - (DAC, Digital-to-Analog Conver-
ter) - ,
. . .
- ,
. , -
0 1.
. -
: 1 = 1 ~'.
- ,
16.
0 9 F.
, - -
, .
- .
- , -
. .
- , -
.
AND () - , 1,
1.
ANSI, American National Standard Institute -
.
ASCII, American Standard Character Interchange Interface -
, -
.
ASCIIZ - ASCII, .
1 371

BCD, Binary Code Decimal (- ) - -


, -
.
BOR, Brown-Out Reset - ; ,
, -
.
, Capture/Compare/Pulse Width Modulation (PWM) - ,
- ().
CMOS, Complementary Metal-Oxide Semiconductor - -
-- () .
DIP, Dual In-line Package -
.
EPROM, Erasable Programmable Read Only Memory - -
, (.).
FIFO, First In - First Out ( - ) - ,
, -
, .
Flash - (.) .
I2C - .
ISP, In-System Programming - . .
LCD - . .
LED - . .
LIFO, Last In - First Out ( - ) - -
, , ,
, .
MCU - .
NOT (HE, ) - (
), .
OR () - , 0,
0.
, One-Time Programmable - ,
.
POP - .
PUSH - .
PWM, Pulse Width Modulation - . .
RTOS, Real Time Operating System - . .
WDT, WatchDog Timer - . .
XOR ( ) - (
), 0, -
.
ZIF, Zero Insertion Force - ; -
/.
2


. 2.1 .
2.1.

.. 1,4959787x10"
( )
2,99792458x1 /
2,7182818285
3,1415926535898 ( }
!

8,854 1878210-' /

0
1,256637x1 0-6 /
9 9,80665/?
6,626 176x1 0-34 /
k 1,380662x1 0-23 /
m
. 0,9 10953x1 0-30
m
n
1,674954x1 0-27
m
,
27
1,672648x1 0-
8,314/(1
V
s
331,45/ 20
1480/ 20


. 2.2 , -
. ,
.
2.2.

,
392
- G# 415,3
2 373

2.2. ()
,
440
493,9
523,3
- # 554,4
D 587,3
- D# 622,3
659,3
F 698,5
- F# 740,0
G 784,0
- G# 830,6
880,0
- # 932,3
987,8



. 2.3 , .

2.3.
, 720? 1336 1477
697
770
852
941


:
V - ;
I - ;
R - ;
- ;
L - .


374


R,,,, = i / ( ( i / R i ) + (i

,
^ = (Rl x R2) / (Rl + R2).


C^-i/Kl/CiHCl



Ru = Rl x R3 / R2
( ) .

j = R1xR3/R2

. 2. .


VI. t - RC.

I
t - RC.
- Rl + R2 + ...


t - L / R.

3ap
,
V(t)-V 0 (l-e-
(Rl x R2) / (Rl + R2).


V(t)


1 + 2 + ... .

k = N,/N2,
N, N2 -
)
: R3 / R2 -/k, '
) .

= R1xR3/R2
= /


. /12.1. PV - nRT.
2 375

LC-
t = RC.

RC-
t = RC.

RL-
t = L / R.

L (1 - -</<).

V(t) = V0e-'"

/
k = N,/N2,
N, N2 - ; k
.
U2 = U,/k,

1,-i.k.


= / .


PV = nRT.
376


A AND 1 = A OR 0 =
A AND 0 = 0; A O R 1 = 1;
-' NOT (NOT (A)) =
A AND NOT(A) 0; A OR NOT (A) = 1;
A AND A = AORA = A


A AND = AND A A OR = OR A


(A AND ) AND = A AND ( AND ) - A AND AND ;
(A OR ) OR = A OR ( OR ) - A OR OR .


A AND ( OR ) - (A AND ) OR (A AND );.
A OR ( AND ) = (A OR ) AND (A OR ).

( )
NOT (A OR ) = NOT (A) AND NOT ();
NOT (A AND ) - NOT (A) OR NOT ().
. ,
- .



1 = 2,54
1 = 1,609
1 = 29,57
1 = 3,78
1 . = 29,9213 . . = 14,696 . = 101,325
2 377

10 000 000 000 1


1 = 3600
1 = 8760


= 1000
= 1000
= 1000
= 1000
1 = 100
1 = 1000

ASCII
. 2.4 ASCII- .

2.4. ASCII
64
3-0 000 001 010 Oil 100 101 770 111
0000 NUL OLE 0 @ P
P
0001 SOH DC/ 1 1 A 0 q
0010 STX DC2 2 R b
DC3 # 3 S S

0100 EVT DC4 $ 4 D d t


0101 ENO NAK % 5 E e u
SYN & 6 F V f V

0111 BEL ETB 7 G w 9 w


1000 BS CAN I 8 H X h X

1001 EM 1 9 1 Y /
1010 LF SUB ' * J z i z

1011 VT ESC + ; [ k {
1100 FF FS < I \ 1 1
1101 CR CS - -
M ] m ;
1110 SO RS > N " n -
1111 SI US / ? DEL
3


. 3.1 ,
.
. 1.

- -
,
,
Microchip 6 512 - 1 25-41 Microchip ICSP
1125 1 ( ) .
4
PIC16C505 12 51 2 72 Microchip ICSP
MPLAB .
4
PIC16HV540 12 51 2 25 Microchip
MPLAB
11662 13 512 -2 80-96 Microchip ICSP
MPLAB
PICI6F628 16 2 224 Microchip ICSP 4
MPLAB
PIC16F84(AI 13 1 68 Microchip ICSP Flash-
MPLAB
PIC16C71x 13 512 -2 36-128 Microchip ICSP
MPLAB
PICJ6F87x 22,33 8 368 Microchip ICSP , Flash-,
MPLAB (ICDJ
PIC17C4x 33 8 232-454 Microchip 8/16-
MPLAB
PIC18Fxx2 23-68 16 768-3840 Microchip ICSP , Flash-,
MPLAB (/

3
Parallax 8 256 14 Parallax Flash- , PBASIC
BASIC stampw
Stamp 1
BASIC 16 +2 I/O 2 26 Parallax RS-232 Flash- , PBASIC
Stamp 2 stampw
BASIC 16+2 I/O 16 26 + 63 Parallax RS-232 PBASIC
Stamp 2e stampw
BASIC 16+2 I/O 16 26 + 63 Parallax RS-232 PBASIC/

37S
Stamp 2sx stampw
380
. 1. ()

- -


,
,
BASIC 16/30 16 26+63 Parallax stampw RS-232 PBASIC
Stamp 2p + I/O
_____
Motorola 13-51 0-32 .
6808

Motorola 13-50 0-32 64 -2 .
681 1

Handy 20 32 32 RS-232
(
681 1)
OOPIC2 40 95 172 OOPic I2C
Atmel 15 1 64 AYR Studio -
AT90S1200
(AYR)
AT90S8515 32 8 12 AYR Studio Flash-
IAVRI
AT90S8535 32 8 512 AYR Studio Flash-
IAVRI
Intel 87C51 32 4 128 18051 ,
. ,
8- '
87C52 32 8 256 /8052 ,
,
8-
Atmel 15 1-4 128 8051
AT89Cx051 USART
(80511
Kg Systems 38 128 128 ASIC-Tiger -, I2C,
BAS/C-Tiger , .

PC/104 , -,
Flash,
4

PICC Lite


. 4.1 , -
.

4. /.

PICC Lite MPASM


2 ' '
8 \ 0' '
10 D ' '
. ' '
16 ' '


:
1. :
// .
2. :
/* . /


:
[] [* []] [= ]',
, , .
. 4.2 .
382

4.2. 1 Lite
,
bit 1
char 8
unsigned char 8
short 16
unsigned short 16
int 16
unsigned int 16
long 32
unsigned long 32
float 24
double 24 ( }
( 32
-D32J


(unsigned long) StringAddr = 0x012345678;
:
[] [= {!, 2, . . . } ]

-
ASCIIZ:
char [] = " ";
NUL 0x00 -
, , -
.

, :
b = String[n]; // n- .
* ():
char String = " ";

PIC16F84 -
Ox4F,
0x08 OxOCF; . -
PIC16F627 ,
; .
PICC Lite, ,
& , .
PICC Lite
:
static unsigned char @ ',
4 383


static bit @ (unsigned) 8 + ;
pic.h, -
.
, (, -
) -
, volatile, :
volatile unsigned @ ;
const, :
const int Label = ',
Label 1 ,
.

const char * ptr;

ptr . ,
- .
,
char const ptr;

, .
PIC16F627 -
, -
bankl, .
PIC16F84.


:
struct | union {
type ;
type 2;
... ^ '
} [];

->. -
:
struct <
int dividend; ' // .
int remainder; // .
} div_result result; , // .
:
result -> dividend = x / ;
result -> remainder = x % ;
384

:
struct {
unsigned : 3; // .
PageSel : 2; // .
OffSel : 3; // .
} PCLATH 9 OxOOA;


:
void main(void) {
// .
> // .
:
( [ 1 ! [, 2 ?,...] ] ) <
... // .
return value; // .
} // .

interrupt:
void interrupt (void) {


. PICC Lite -
:
[(..] \ [ [ (.. ] \ ] [)..] ]
:
- ',

: i f , while, do, for,


switch.
if:
if ( )
[ ]; | { ; ...}
[ else [ ]; | { ; ... } ]
while:
while ( ) [ ]; | { ; ... }
4 385

for :
for ( [ ', // .
[ [, ]]; // .
[ [, ,...]]) // .
\ { ; ... } // .
break.
continue , -
, .
for, while do/while.
( , ):
do ; [ { ; ... } while ( );

:
switch( ) {
case !: I ; ... ] [ break; ]
case 2: [ ; ... ] [ break; ]

default: [ ; ... ]
>

goto

( -
). :
: ;


return:
return ;


. 4.3 (), . 4.4 - (-
), . 4.5 - .

4.3.


( 1)

( 1)

13-2101
386

4.4.

1
&& (AND/
& (AND)
11 (OR)
1 (OR)

(XOR)
+
-
*
/
%
==
!=
<
>
<=
>=

4.5.

ASCII
\ OxOOD (CR)
\ 0x0 (LF)
\f JFFJ
\ 0x008 (BS)
\t 0x009 ()
\v (VT)
\ 0x007 (BEL)
\' 0x027 (')
\" 0x022 ("}
\\ (\/
\ddd -
\xddd OxOdd
4 387


, -
, :
auto if
bank"! int
break interrupt
case persistent
char return
const signed
continue static
default struct
do switch
else union
extern unsigned
fastcall void
for volatile
goto while


. 4.6 -
.

4.6.
ASCII
\ OxOOD (CRJ
\ (LF)
\f (FF)
\ 0x008 IBS)
\t 0x009 (HTJ
\v (VT)
\ 0x007 (BEL)
V 0x027 /
\" 0x022 (")
\\ 05 1\1
\ddd -
\xddd OxOdd
388


. 4.7 .
# .
4.7.



asm #endasm
assert ,
define (/,
[()]

#include "" <> .
,
,
PATH, ,
, INCLUDE
terror

if , ,
elif, else, #endif. , Selif, #else endif

ifdef
def ine, , elif, else
endif,
ifndef.
def ine, , elif,
else endif,
elif #else if
if
else #if elif
endif #if, #elif, else,
#ifdef ifndef
line
number
pragma interrupt_level I
. ,

pragma j i s JIS )
#pragma nojis JIS
pragma printf_check ,
print f
pragma psect ,
=
pragma regused
,

undef
warning
4 389


. 4.8 , -
PICC Lite.

4.8.


-processor ( 1684, 16F84, 16F84A
J6F627)
-- -
- - American Automation
-ASMLIST .LST
-BIN
-
-
-D24 , 24-
-D32 ( IEEE 754), 32-
- ( ^define)
- (/
-
-+
-FAKELOCAL MPLAB
-FDOUBLE 32-

-
-HELP
-ICD
-1
- INTEL Intel ( )
^ ,
-L- -,
- MAP
- Motorola S 1/S9
- ( 31 /
-NORT

-0
-
-
-PRE
-PROTO
-PSECTMAP
-Q (
)
390

4.8. ()

-
-
-
-S
-SIGNED_CHAR
( )
-STRICT ANSI.

- Tektronix
-0
-UBROF UBROF
-V ,

-Wnncno
_V
- ( 3)

PICC Lite
. 4.9 PICC Lite.
4.9. PICC Lite

int abs(int) stdlib.h
double acos (double) math.h ( }
double asin (double) math.h ( ]
double atari (double) math.h ( )
double atan2 math.h ( )
(double, double)
double atof (const char *) math.h ASCII
int atoi ( const char *) stdlib.h ASCII
int atol ( const char *) stdlib.h ASCII
double ceil (double) math.h
( )
char *cgets(char *) con/o.h
double cos (double) math.h / )
double cosh (double) math.h
void cputs(char *) conio.h
void eeprom_write (unsigned pic!684.h
char, unsigned char)
unsigned char eeprom_read pic!684.h
(unsigned char)
4 391

4. 9. PICC Lite (}


double exp (double) math.h
double fabs (double) math.h
double floor (double) math.h
( )
double frexp (double, int *) math.h
char getch(void) conio.h
. ,

char getche(void) conio.h
(
)
void init_uart (void) conio.h UART
Bit isalnum(char) ctype.h TRUE,
-
Bit isalpha(char) ctype.h TRUE,
bit iscntrl (char) ctype.h TRUE,
/0x000 - OxOlF O'xOTF)
bit isdigit (char) ctype.h TRUE,
bit isgraph(char) ctype.h TRUE, ,
(
0x021 -OxOVEJ
bit islower (char) ctype.h TRUE,

bit ispunct (char) ctype.h TRUE,

bit isprint (char) ctype.h TRUE,
/020-07;
bit isspace (char) ctype.h TRUE,
0x09 -OxOD
bit i supper (char) ctype.h TRUE,

bit isxdigit (char) ctype.h TRUE, -

char kbhit (void) conio.h
double Idexp (double, int) math.h
double log (double) math.h
double loglO (double) math.h
const void* memchr( const string. h
void *, int, unsigned int)
int memcmp (const void*, string. h
const void *, unsigned int)
void *memcpy(void *, string. h
const void *, unsigned int)
void *memmove (void *, const string, h (
void *, unsigned int)
)
void *memset (void *, string. h
int, unsigned int)
392

4.9. PICC Lite ()



double modf math.h
(double, double *)
double pow math.h
(double, double)
int printf stdio.h .
(const char : %d, %i
( ); % ( );
%, % (
' ); % ( );
% ( ASCII); %s /
ASCIIZ); %f ( ); %#, %#
( , #
); %g, %G (
,
SB ); % ();
%% ( %)
void putch(char) conio.h
int rand(void) stdlib.h - . srand
double sin(double) math.h ( )
double sinh(double) math.h
double sqrt(double) math.h
void srand(void) stdlib.h
. rand
char* strcat string.h ASCIIZ
(char *, const char
const char* strchr string.h ASCIIZ
(const char *, int)
int strcmp(const char *, string.h ASCIIZ
const char *)
char *strcpy string.h ASCIIZ
(char *,const char *)
unsigned int strcspn string.h ,
(const char *, const char *) ,
char *strdup (const char *) string.h
int stricmp(const char string.h ( )
const char *)
const char *stristr string.h
(const char *, const char*) ( )
char *strncat (char *, string.h
const char *, unsigned int) ASCIIZ
int strncmp(const char *, string.h
const char *, unsigned int) ASCIIZ
int strnicmp(const char *, string.h
const char *, unsigned int) ASCIIZ ( )
unsigned int strlen string.h
(const char *)
char *strncpy(char *, string.h
const char *, unsigned int)
const char* strpbrk string.h
(const char *, const char *
4 393

4.9. PICC Lite ()


const char* strrchr string.h
( const char *, int) ASCIIZ
unsigned int strspn string, h
(const char *, const char *)
const char *strstr string.h
const char *) (const char * ,
const char *)
double tan (double) math.h ( !
double tanh (double) math.h
char tolower (char) ctype.h
char toupper (char) ctype.h
unsigned int xtoi stdlib.h ASCII
(const char *)
5


myke@passport.ca -
Internet (www.myke.com).

Microchip
Microchip Technology, Inc.
www.microchip.com
PDF
MPLAB.

Hi-Tech Software
Hi-Tech Software
www.htsoft.com

( -
PICC Lite).

PICmicro
Custom Computer Services, Inc.
www.ccsinfo.com
ccs@ccsinfo.com

PicBasic PicBasic Pro


MicroEngineering Labs, Inc.
www.melabs.com
info@melabs.com
5 395

5
Knudsen Data
www.bknd.com
sales@bknd.com

Seattle Robotics Society


www.seattlerobotics.org
Internet.

Silicon Valley HomeBrew Robotics Club


www.wildrice.com/HBRobotics/HBRCBuildersBook.html
.
.

robots.net
http://robots.net
. , .

The Robot Menu


www.robotics.com/robomenu/index.html
.

Robotics FAQ List


www.frc.ri.cmu.edu/robotics-faq
, .

Innovatus
www.innovatus.com

.
396

RoboClub
www.roboclub.ru
( ). , ,
, ; , , , ,
, , , , , ,
, , , , ,
, , , , , -
. Internet
http://links.roboclub.ru.

Internet-
www.applmat.ru/pages/i-robotics/rus/rhome.html
Internet- -
. . . -
( , )
INTAS . -
Internet - -01 (PUMA
560).


Circuit Cellar Ink: www.circellar.com
Microcontroller Journal: www.mcjournal.com
Nuts and Volts: www.nutsvolts.com
Everyday Practical Electronics: www.epemag.wimborne.CQuk


OOO -
sales@microchip.ru
www.microchip.ru. www.imicro.ru
./: (095) 963-96-01
www.microchip.ru
PICmicro PDF .

- (-)
www.cec-mc.ru. www.gaw.ru
.: (095) 973-18-55, 942-34-16
: (095) 973-18-64

5 397

sales@chip-dip.ru
www.chip-dip.ru
, . , . 39
.: (095) 284-56-78, 281-99-17
:(095)971-31-45

npo@symmetron.ru
www.symmetron.ru
, . 8 , . 8
.: (095) 214-25-55, 212-33-08
-, . , . 7
.: (812) 278-84-84, 444-02-68
Internet
www.catalog.gaw.ru. www.einforu. www.efind.ru. www.chipinfo.ru.
398


1. . . 2- . - .: -
, 2001.
2. . PIC-. .: ,
2002.
3. . PIC-. . - .:
, 2002.
4. . . - .: , 1984.
5. . . . --
. - .: , 1988.
6. . . - .: , 1979.
7. . . . - .: , 1979. . ,
8. . ., . ., . . -
.
. .: ,
1991.
9. . : 3 . /
. . . , . . . - .: , 1988.
10. . . . - .: -
, 1991.
11. . ., . . . - .: , 1984.
12. . . . .: , 1985.
13. . ., . ., . . -
IBM PC. . . -
..: , 1997.
14. . . / -
. - .: , 2002.

336 252, 255


352
363 279
344 263

57 245
57 41
40 265
20, 46, 264 322
281
324
281

90
34, 195
114

376
266

264
() 66
22
376
57, 120 376
358 376
47 373

() 56
91
191

279 305
280 272
252
92 195
136 190
400

41
37, 43
348 350
361 19

88

145
373
26, 56

Manchester 238
NRZ 56 48
117 352
265 38
37, 46 305
40 372
38, 50
132 325
325
19 91
18 325
363
195 62
348
30

87 26
28
28
280 26, 337
324 - 307
18 36
18
Tamiya 291 343
364 - 32
136 33
29
- 178
278
13 305
13 33

- 289 248
374 326
372 9
364 El Cheapo 38
401

324
51 221
162 305

289, 295
310 182
166 330
283 87
28 281

CCP1CON 108
EECON 103 81
INTCON 90, 94
OPTION 101 168
STATUS 97 \ 168
87 328
90 311
69 322
52 310
375 351
51
25 INS 308
25, 83
328
62
253
24

350
122

87,122
171

295, 343
246
191
150
310, 316
252

306
279, 285
114
344
47
263, 269, 273
343 65
252, 257 114

238, 242, 248
33
204 PWRT 82
97
234 82
402

376
212
361 119

357
RC 272, 375
46
RL 375
289
375
92
281
349

32, 52
44, 107-109, 168, 178, 289
238, 340

10
10 52
142
10
148
10

281, 288

ANSI 148
67, 261 ANSI 46
56, 60, 84 API 26
282 ASCII 37, 196, 377
372 ASCIIZ 159, 212

281, 283
281 BOD 81
282 BRG 112
281 Brown-out detection 81
282
282
281 CAN 34
281 CCP 107
Clock Stimulus 68
INXM8 38 CMOS 56
PDF 362 CP 88
59 38 CPP 101, 108 .
62 CTS 145
403

D MPLAB-ICD Debugger 53
Multimastering 163
DCD 145
DCE 143 N
DIP 138
DRAM 28 NRZ 34, 114, 143
DSR 145 NTSC 34
DTE 143
DTR 145
DTP 27
E
EEPROM 27 P
EPROM 26
PBasic 46
F PC 76
Flash 27 PDF 362
PIC 58
G PICC Lite 10
GPR 87 PICmicro 58
GPS 213 PIE1 95
GUI 162 PIR1 95
PISTARTPlus 63
PROM 26
Handshaking 145 PROMATE 64
HI-TECH 10 PWM 107, 109, 178
1
R
I2C 33, 34, 162
ICE 64, 142 RAM 26, 28
ICSP 57, 120 Register Stimulus 69
IDE 10, 28, 53 Rl 145
Interrupt handler 29 ROM 26
IRF 31 RPN 48
RS-232 34, 143
L RS-485 34
RTOS 10, 130, 325
LCD 34
RTS 145
Linker 38
LVP 88 s
M SCL 163
Microwire 34 . . SDA 163
MPLAB 10 Simulator 51
404

SPI 34
SRAM 28
Stimulus 65 USART 65, 112
Stimulus file 66 USB 34
w
Warnings 51
TOIE 95 WDT 87
TMRO 95, 98
TRIS 77, 91 Z
TTY 148 ZIF 128, 139