라인을위한 프로그래밍에서 MPLAB 도움말>에 다음과 같은

S

suelooi

Guest
안녕하세요 ....난 모터 로봇을 함께 스테퍼의 모바일 코드를위한 LabVIEW 제어에있어이 ...

저는 다음 줄을 로봇을위한 3 센서를 추가할 오전 ...PIC가의 메신저를 사용하고 RB0입니다 PIC16F877A 및 핀에 연결하는 센서, RB4 RB5 및 ....해줄 사람이 프로그램을 수정에 도움 나한테 그래??긴급 pls 도움의 필요합니다 ...

이 코드는 ...

//************************************************ ****************
/ / * *
/ / * *
/ / * *
/ / * *
/ / * 참고 사항 :이 MiniRobot 컨트롤의 RS232를입니다 *
/ / *가 : 스테퍼 컨트롤을 통해 시계 / 방향 / 사용 *
/ / * : 데이터 제어 직렬 전송으로 3 바이트 *
//************************************************ ****************

/ *
시리얼 통신 구현으로 길이가 3 바이트.
제어 / 데이터 1 / 데이터 2.
데이터를 최대로 구성되어 있습니다 15bit (32767) 정보.나도 MSB가 설정되어야한다.
MSB가 2의 데이터 디코딩입니다 tranfered로 바이트 제어.
당 비트 바이트 제어입니다
MSB가 7 = 항상 1 (제어 바이트 감지)
= 비트 1 비트 주소 6
비트 0 = 5 비트 주소
4 비트 = MSB가 바이트의 data2
비트 3 = 왼쪽 모터 사용
비트 2 = 오른쪽 모터 사용
비트 1 = 왼쪽 모터 방향 (1 전진 / 0 역방향)
비트 0 = 오른쪽 모터 방향 (1 전진 / 0 역방향)

왼쪽 오른쪽 오른쪽 왼쪽
활성화 활성화 직접 직접
0 0 0 0 = 0 브레이크
0 0 0 1 = 1 정지
0 0 1 0 = 2 중지
0 0 1 1 = 3 중지
0 1 0 0 = 4 리버스 왼쪽
0 1 0 1 = 5 전방 왼쪽
0 1 1 0 = 6 후진 왼쪽
0 1 1 1 = 7 전방 왼쪽
1 0 0 0 = 8를 마우스 오른쪽 리버스
1 0 0 1 = 9 일 오른쪽 포워드
1 0 1 0 = 10 오른쪽 리버스
1 0 1 1 = 11 오른쪽 포워드
1 1 0 0 = 12 역방향
1 1 0 1 = 13 시계 바늘 횐전과 반대
1 1 1 0 = 14 시계 방향
1 1 1 1 = 15 전달
* /

#은 <pic.h> 포함

# 주파수를 정의 XTAL 20000000 / / Oscilator

고정 비트 LeftPulse @ (서명) & PORTC * 8 0;
정적 비트 LeftDirection @ (서명) & PORTC * 8 1;
고정 비트 LeftEnable @ (서명) & PORTC * 8 2;
고정 비트 RightPulse @ (서명) & PORTC * 8 3;
정적 비트 RightDirection @ (서명) & PORTC * 8 4;
고정 비트 RightEnable @ (서명) & PORTC * 8 5;
정적 비트 @ LowPowerLED (서명) & PORTB * 8 1;

/ / 스토리지 varibles 일반
서명되지 않은 번째 문자 Clk_Period; / / 타이머 2 기간
서명되지 않은 int TMR2_Overflow_Counter; / / 500hz 시계
서명되지 않은 int Stepping_Rate; / / 100 = 200Hz
서명되지 않은 정수 Total_Steps; / / 입력 데이터 (단계를 달성하기 위해)
int의 Min_Pulse_Rate = 50; / / 100 = 200Hz
서명되지 않은 int의 Next_step; / / 플래그와 stepps의 카운터
메기 Next_Command; / / 명령 문자열
서명되지 않은 int Motor_data, 입력 데이터에 대한 모터 / /
메기 Next_Direction;의 다음 여행 방향 / /
Left_M_State 번째 문자가; / / 현재 활성화 모터 왼쪽 주
Right_M_State 번째 문자가; / / 현재 활성화 모터 권리 상태
메기 주소; / / 마이크로 주소
int 속도]를 [11; / / 고속 데이터
/ / 정보 통신 다음
휘발성 번째 문자 Comm_Data_Rec;에 대한 통신 자료 플래그 / / 접수
메기 Command_Str; / / 첫 번째 데이터 바이트
Comm_Str1 번째 문자; / / 2 바이트
메기 Comm_Str2; / / 3 바이트
data_Out 번째 문자는, / /는 출력 데이터 통신
메기 Rec_state = 0;에 입력 문자열 위치 / /
int 온도;에 대한 tempory 데이터 / / varible
int ADC_Data; / / 배터리의 상태가 아직 없습니다 inplemented

(무효 SetUpPic을 무효); / / 포트 설정 등
주소 설정 기본 무효 Set_base_address을 (무효); / /
) 무효 Run_Motor을 (메기 C; / / 실행 (1) / 정지 (0) 스테핑
(무효 Decode_Input_Data을 무효); / / 새로운 위치로 설정 데이터
Set_Motor_State 번째 문자는 (무효); / / 모터 각 방향 설정을 /를 활성화 상태
무효의 Send_Message은 (메기 명령, 서명되지 않은 Msg_Data int); / / 출력을 보낼
) 무효 Emergency_Stop을 (메기 이유; / / 중지 운동 및 보고서 오류

/ / 메인 프로그램 시작
) 무효 메인 (무효
(
SetUpPic ();
Set_base_address (); / / 설정된 기본 주소
LeftEnable = 0;
RightEnable = 0; / 모터를 해제 /
LeftPulse = 1; RightPulse = 1; 클럭 펄스에서 시작 / / (높이)
RightDirection = 1; LeftDirection = 1; / / 기본적으로 전달하실이다
Next_step = 0; / / 플래그 스테핑면
주소 = 2; / / 877 2 주소를 가지고
속도 [0] = 0; 속도 [1] = 140; 속도 [2] = 130; 속도 [3] = 120; 속도 [4] = 110;
속도 [5] = 100; 속도 [6] = 90; 속도 [7] = 80; 속도 [8] = 70; 속도 [9] = 60; 속도 [10] = 50;
작업 1) / / 루프에 대한 계속 메인 (하면서
(
/ /면 (! Sys_Ok) / / 긴급 정지 스위치 점검
/ / Emergency_Stop (3); / / 중지 운동 및 보고서 오류
데이터를 / 가지고 새로운면 (/ Comm_Data_Rec)
(
Decode_Input_Data (); / / 디코딩 새 데이터
Comm_Data_Rec = 0; / / 재설정 플래그
Stepping_Rate = 속도 [Motor_data]은; / / 배열에서 속도를 얻을
바퀴 돌았어 경우 (Stepping_Rate <= Min_Pulse_Rate) / / 빠른
Stepping_Rate = Min_Pulse_Rate;
Run_Motor (1);
) / 데이터를 새로운 / 끝
/ /) 월말 동안 루프
/ 끝의 메인 /)

주소 / 세트베이스 무효 Set_base_address을 (무효) /
(
/ / 정적 비트 Addy_0 @ (서명) & PORTB * 8 1; / /베이스 주소 bit0
/ / 정적 비트 Addy_1 @ (서명) & PORTB * 8 2; / /베이스 주소 bit1
/ / 주소 = (Addy_1 * 2) Addy_0를 ;
주소 = 2; / / 873 1을 사용하고 2 877A * 용의
)

스테핑 / 그만 (0) 무효 Run_Motor을 (메기 실행) / / 실행 (1)
(
정지도 포함하고 통신을하는 경우 (실행) / / 명령 실행 노트.
(
TMR2_Overflow_Counter = 0; / / 실행 옆의 세트
Next_step은 = Set_Motor_State (); / / 활성화 및 모터의 방향을 설정
)
또 / / 정지
(
Next_step = 0; / / 해제하는 최초의 스텝
/ / LeftEnable = 0; RightEnable = 0; / / 컨트롤러를 모터 기능 끄기
/ / LeftPulse = 1; 1; / / 클럭 펄스에서 시작 = RightPulse (높이)
)
)

메기 Set_Motor_State (무효)
(
메기 Run_Stop = 0;
LeftEnable = 0;
RightEnable = 0; / / 컨트롤러를 확보가 꺼져 있습니다
스위치 (Next_Command)
(
사례 0-3 :
LeftDirection = 1; RightDirection = 1; / / 기본적으로 전달하실이다
Left_M_State = 0; Right_M_State = 0; / / 모터를 보장가 OFF 위치
LeftEnable = 0;
RightEnable = 0; / / 모터를 해제
휴식;
경우 4 :
LeftDirection = 1; RightDirection = 1; / / 후진 왼쪽
Left_M_State = 1; Right_M_State = 0; / / 오른쪽 모터에 오직
Run_Stop = 1;
휴식;
사건 5 :
LeftDirection = 0; RightDirection = 0; / / 전달 왼쪽
Left_M_State = 1; Right_M_State = 0; / / 오른쪽 모터에 오직
Run_Stop = 1;
휴식;
사례 6 :
LeftDirection = 0; RightDirection = 1; / / 후진 왼쪽
Left_M_State = 0; Right_M_State = 1; / / 오른쪽 모터에 오직
Run_Stop = 1;
휴식;
사례 7 :
LeftDirection = 1; RightDirection = 1; / / 전달 왼쪽
Left_M_State = 0; Right_M_State = 1; / / 오른쪽 모터에 오직
Run_Stop = 1;
휴식;
사례 8 :
LeftDirection = 1; RightDirection = 1; / / 오른쪽으로 역방향
Left_M_State = 0; Right_M_State = 1; / / 왼쪽 모터에 오직
Run_Stop = 1;
휴식;
사건 9 :
LeftDirection = 1; RightDirection = 0; / / 오른쪽 포워드
Left_M_State = 1; Right_M_State = 0; / / 왼쪽 모터에 오직
Run_Stop = 1;
휴식;
사건 10 :
LeftDirection = 0; RightDirection = 1; / / 오른쪽으로 역방향
Left_M_State = 1; Right_M_State = 0; / / 왼쪽 모터에 오직
Run_Stop = 1;
휴식;
사건 11 :
LeftDirection = 0; RightDirection = 0; / / 오른쪽 포워드
Left_M_State = 0; Right_M_State = 1; / / 오른쪽 모터에 오직
Run_Stop = 1;
휴식;
사건 12 :
LeftDirection = 1; RightDirection = 1; / / 후진
Left_M_State = 1; Right_M_State = 1; / / 양쪽 모터가 ON 위치
Run_Stop = 1;
휴식;
사건 13 :
LeftDirection = 0; RightDirection = 1; / / 시계 바늘 횐전과 반대
Left_M_State = 1; Right_M_State = 1; / / 양쪽 모터가 ON 위치
Run_Stop = 1;
휴식;
사건 14 :
LeftDirection = 1; RightDirection = 0; / / 시계 방향
Left_M_State = 1; Right_M_State = 1; / / 양쪽 모터가 ON 위치
Run_Stop = 1;
휴식;
사건 15 :
LeftDirection = 0; RightDirection = 0; / / 포워드
Left_M_State = 1; Right_M_State = 1; / / 양쪽 모터가 ON 위치
Run_Stop = 1;
휴식;
) / / 끝 스위치

Run_Stop를 반환합니다;

) / / 끝 Set_Motor_State (무효)

/ / 별도의 3Byte 통신 데이터
데이터 / 별도의 새로운 무효 Decode_Input_Data을 (무효) /
(
Next_Command = (Command_Str & 0b00001111); / / 모터 사용 / 방향 데이터
byte1 경우 (Command_Str & 0b00010000 bit4 테스트 데이터를위한 MSB가 /) /
Comm_Str2은 = Comm_Str2 0b10000000, / /은 MSB가 추가
Motor_data은 = (Comm_Str1 * 256) Comm_Str2; / / 데이터를 결합
)

무효의 Send_Message은 (메기 명령, 서명되지 않은 Msg_Data int) / / 출력을 보낼
(
Out_Str1 번째 문자;
메기 Out_Str2;
명령 = 명령 128, / /은 MSB가를 설정
Out_Str1 = Msg_Data;
Out_Str2 = Msg_Data>> 8;
설정한 경우 & 0b10000000) / / 체크 Out_Str1 (MSB가
(
명령 = 명령 16, / / 4 비트를 바이트 명령 추가 MSB가에게
Out_Str1 = Out_Str1 & 0b01111111;
)
설정한 경우 (Out_Str2 & 0b10000000) 체크 / / MSB가
Out_Str2 = Out_Str2 및 0b01111111; / / MSB가를 제거
빈 동안 (! TRMT은) (/ 버퍼 기다려 / 때까지
)
TXREG = 명령; / / 문자 쓰기 명령
빈 동안 (! TRMT은) (/ 버퍼 기다려 / 때까지
)
TXREG = Out_Str2가; / 데이터를 위 / 쓰기
빈 동안 (! TRMT은) (/ 버퍼 기다려 / 때까지
)
TXREG은 = Out_Str1; / / 데이터를 기록할 낮은
)

/ / 긴급 정지
/ / 이유 (단지 한도 (3)) inplemented
오류 무효 Emergency_Stop을 (메기 이유) / / 중지 운동 및 리포트
(
온도 = Next_step가; / / 위치를 저장 선물
Next_step = 0; / / 재설정
Run_Motor (0); / / steppers 그만
Send_Message은 (이유, 온도); / / 출력을 보낼
)
) 무효 SetUpPic을 (무효
(
/ / 포트 핀 방향
TRISB = 0b00001111; / / 세트 RB4 - 7 출력과 RB0 - 3 입력 단자에
TRISC = 0b10000000; / / 출력 C0 - 5, 6-7 통신

/ / 통신 포트 9600에서 설정
BRGH = 1; / * 높은 전송 속도를 * /
SPBRG = 129; / * 전송 속도 9600 @ 20MHz로 * /

SYNC = 0; / * 비동기 * /
SPEN = 1; / *를 핀을 번호 * 사용 직렬 포트 /
CREN = 1; / *은 *을 사용 리셉션 운영 /
SREN = 0; / * 아무런 영향을 미치지 *를 /
TXIE = 0; / * 해제 TX는 *를 인터럽트 /
RCIE = 1; / *를 인터럽트 번호 * rx의 활성화 /
TX9 = 0; / * 8 비트 전송 * /
RX9 = 0; / * 8 비트 수신 * /
TXEN = 1; / *은 *을 사용 송신기 /

ADCON0은 = 0xC1; / osc를 RC 제품 / ADC를 사용.채널 0
ADCON1은 = 0b00001110; / / 왼쪽 정렬 아날로그, ch0
/ / 설정 타이머 2
Clk_Period = 0xF9;
PR2 = Clk_Period가; / / 0xF9 = 설정된 타이머를 2 기간 = Clk_Period
TMR2ON = 1; 켭니다에 타이머 / /
/ / 설정하는 INTERUPTS
/ / INTCON 비트 = GIE, PEIE, T0IE, INTE, RBIE, T0IF, INTF, RBIF
OPTION을 = 0;
TMR2IE = 1; / / TMR2 활성화를 방해
/ / INTEDG = 0; / / 전도 가장자리) 트리거 PortB.0을 (범퍼
PEIE = 1; / / 사용 주변 Inerrupt
GIE = 1; / / 사용 글로벌 Inerrupt
)

#에서 Pragma 0 interrupt_level
정적 무효 인터럽트 ISR이 (무효)
(
인터럽트 경우 (TMR2IF) / / 타이머 2
(
스테핑 / 할있는 경우 (/) Next_step
(

(해당되는 경우 TMR2_Overflow_Counter == 0) / /주기의 시작합니까
(
LeftPulse = 0; RightPulse = 0; / / 펄스를 시작 다음
LeftEnable = Left_M_State;
RightEnable = Right_M_State가; / / 컨트롤러를 활성화
)

길이면 (TMR2_Overflow_Counter == 10) / / 클럭
(
LeftPulse = 1; RightPulse = 1; / / 모터 단계는 지금
)
길이면 (TMR2_Overflow_Counter == 20) / / 사용 펄스
(
/ / LeftEnable = 0;
/ / RightEnable = 0; / / 컨트롤러를 해제
)

TMR2_Overflow_Counter ; / / 증가 오버플로우 카운터
단계면 (TMR2_Overflow_Counter> = Stepping_Rate) / 다음에 / 준비
(
TMR2_Overflow_Counter = 0; / / 카운터 재설정
/ 끝의 시작 /) 펄스
) / / 다음 단계를 종료
TMR2IF = 0; / / 타이머 2 리셋 플래그 (50uS)
) / / 끝 TM2IF
데이터면 (RCIF) (/ / 수신의 RS232를
바이트면> = 128) / / 테스트를위한 RCREG (명령
(
Command_Str = RCREG;
Command_Str = ((Command_Str & 0b01100000)>> 5)가, / / 주소를
마이크로 경우 (Command_Str == 주소)에 대해이 데이터 / /
Rec_state = 0; 옆에있는 상태로 이동 / /
/ 아니이 다른 기본 /
Rec_state은 = 3; / / 다음 명령을 무시하고
주소면 0) / / 수표에 대한 모든 == (Command_Str
Rec_state = 0;
)
스위치 (Rec_state) (
사건은 0 : / / 메시지의 시작 부분에 헤더를 감지
데이터면 (RCREG>은 = 128) / / 명령에 대한 MSB가 세트
(
Command_Str = RCREG;
Rec_state = 1; 옆에있는 상태로 이동 / /
)
휴식;
경우 1 :
Comm_Str1 = RCREG; / / 2 바이트
Rec_state = 2; 옆에있는 상태로 이동 / /
휴식;
경우 2 :
Comm_Str2 = RCREG; / / 3 바이트
Rec_state = 0; / / 메시지가 다음 재설정을위한
Comm_Data_Rec = 1; / / 플래그 새 데이터 메시지
휴식;
경우 3 : / / 문자열 명령을 기다릴 때까지 다음
휴식;
)
RCIF = 0;
) / / 엔드 통신
)

 

Welcome to EDABoard.com

Sponsor

Back
Top