Pomoc s programováním MPLAB pro linky po

S

suelooi

Guest
Ahoj ....Dostal jsem tento kód LabView pro ovládání mobilního robota s krokovými motory ...

Jsem přidáním 3 čidla na robot pro linky po ...IM PIC pomocí je PIC16F877A a senzory jsou napojeny na piny RB0, RB4 a RB5 ....Může mi někdo pomoct při změně programu?Naléhavě potřebují pomoc pls ...

To je kód ...

//************************************************ ****************
/ / * *
/ / * *
/ / * *
/ / * *
/ / * Poznámka: Jedná se o RS232 kontrolu MiniRobot *
/ / *: Stepper ovládání je přes Hodiny / Režie / Zapnout *
/ / *: Data odesílána jako 3 byte sériového ovládání *
//************************************************ ****************

/ *
Sériový COMMS provedené má tři byte.
Ovládání / Data 1 / Data 2.
Data se skládá z 15bit (32767) info max.Ani MSB musí být nastaveno.
MSB dat 2 je tranfered na kontrolní byte pro dekódování.
Ovládací Byte za bit je
MSB 7 = vždy 1 (kontrola byte detekce)
bit 6 = 1 bit adresy
bit 5 = bit 0 z adresy
bit 4 = MSB z Data2 byte
bit 3 = Levý Motor Povoleno
bit 2 = Právo Motor Povoleno
bit 1 = levice Motor Směr (1 vpřed / 0 reverzní)
bit 0 = Právo Motor Směr (1 vpřed / 0 reverzní)

Left Right Left Right
Povolit Povolit Přímé Přímé
0 0 0 0 = 0 brzdy
0 0 0 1 = 1 Stop
0 0 1 0 = 2 Stop
0 0 1 1 = 3 Stop
0 1 0 0 = 4 Levá vzad
0 1 0 1 = 5 Levá vpřed
0 1 1 0 = 6 Levé zpětné
0 1 1 1 = 7 Levá vpřed
1 0 0 0 = 8 Právo Reverzní
1 0 0 1 = 9 Právo vpřed
1 0 1 0 = 10 Právo Reverzní
1 0 1 1 = 11 Právo vpřed
1 1 0 0 = 12 reverzní
1 1 0 1 = 13 proti směru hodinových ručiček
1 1 1 0 = 14 ve směru hodinových ručiček
1 1 1 1 = 15 vpřed
* /

# Include <pic.h>

# Define XTAL 20000000 / / oscilátor frekvence

statické bit LeftPulse @ (unsigned) & PORTC * 8 0;
statické bit LeftDirection @ (unsigned) & PORTC * 8 1;
statické bit LeftEnable @ (unsigned) & PORTC * 8 2;
statické bit RightPulse @ (unsigned) & PORTC * 8 3;
statické bit RightDirection @ (unsigned) & PORTC * 8 4;
statické bit RightEnable @ (unsigned) & PORTC * 8 5;
statické bit LowPowerLED @ (unsigned) & PORTB * 8 1;

/ / Storage pro všeobecné varibles
unsigned char Clk_Period; / / časovač 2 Doba
unsigned int TMR2_Overflow_Counter; / / 500Hz hodiny
unsigned int Stepping_Rate; / / 100 = 200Hz
unsigned int Total_Steps; / / input data (opatření k jejich dosažení)
int Min_Pulse_Rate = 50; / / 100 = 200Hz
unsigned int Next_step, / / vlajky a počítadlo stepps
char Next_Command; / / příkazový řetězec
unsigned int Motor_data; / / Vstupní data pro motory
char Next_Direction; / / směr další cesty
char Left_M_State; / / současné době umožňuje stav levého motoru
char Right_M_State; / / současné době umožňují právo státu motor
char světa; / / micro adresu
int rychlostí [11], / / data o rychlosti
/ / Komunikace info další
volatile char Comm_Data_Rec, / / vlajky pro COMMS údaje získané
char Command_Str; / / první data byte
char Comm_Str1; / / 2. byte
char Comm_Str2; / / 3. byte
char data_Out; / / COMMS výstup dat
char Rec_state = 0, / / pozice ve vstupním řetězci
int temp, / / pro dočasné data varible
int ADC_Data; / / stavu baterie není uplatňování těchto sankcí dosud

neplatné SetUpPic (void) / / Nastavení portů atd.
neplatné Set_base_address (void) / / nastavení základní adresy
neplatné Run_Motor (char c) / / Spustit (1) / Stop (0) posílení
neplatné Decode_Input_Data (void); / / set nových údajů o poloze
char Set_Motor_State (void); / / set Režie / Povolit státem pro každý motor
neplatné Send_Message (char příkaz, unsigned int Msg_Data); / / vysílat výstupní
neplatné Emergency_Stop (char Reason), / / Stop pohybu a zpráva chybu

/ / Začátek hlavního programu
void main (void)
(
SetUpPic ();
Set_base_address (); / / nastavení základní adresy
LeftEnable = 0;
RightEnable = 0; / / vypnout motory
LeftPulse = 1; RightPulse = 1; / / hodiny puls na start (vysoká)
RightDirection = 1; LeftDirection = 1; / / default je foward
Next_step = 0, / / vlajky, pokud posílení
Adresa = 2; / / 877 má adresu 2
Rychlosti [0] = 0; rychlostí [1] = 140; rychlostí [2] = 130; rychlostí [3] = 120; rychlostí [4] = 110;
Rychlosti [5] = 100; rychlostí [6] = 90; rychlostí [7] = 80; rychlostí [8] = 70; rychlostí [9] = 60; rychlostí [10] = 50;
while (1) / / Hlavní smyčka pro pokračuje provoz
(
/ / If (! Sys_Ok) / / spínače výstražných světel kontrolu
/ / Emergency_Stop (3), / / Stop pohybu a zpráva chybu
if (Comm_Data_Rec) / / mít nová data
(
Decode_Input_Data (); / / dekódovat nové údaje
Comm_Data_Rec = 0, / / reset vlajky
Stepping_Rate = rychlostí [Motor_data]; / / získání rychlosti z pole
if (Stepping_Rate <= Min_Pulse_Rate) / / nejrychlejší ot. / min
Stepping_Rate = Min_Pulse_Rate;
Run_Motor (1);
) / / Konec nové údaje
) / / Konec cyklu while
) / / Konec hlavní

neplatné Set_base_address (void) / / Nastavení základní adresa
(
/ / Statické bit Addy_0 @ (unsigned) & PORTB * 8 1, / / base adresu bit0
/ / Statické bit Addy_1 @ (unsigned) & PORTB * 8 2; / / base adresu bit1
/ / Adresa = (Addy_1 * 2) Addy_0;
Adresa = 2; / / použití 1 pro 873 a 2 pro * 877A
)

neplatné Run_Motor (char Run) / / Spustit (1) / Stop (0) posílení
(
if (Run) / / poznámka spustit příkaz také COMMS stop.
(
TMR2_Overflow_Counter = 0; / / nastavení pro další spuštění
Next_step = Set_Motor_State (); / / povolit a nastavit směr motorů
)
else / / stop
(
Next_step = 0; / / vypnout posílení první
/ / LeftEnable = 0; RightEnable = 0; / / vypnout motor regulátor
/ / LeftPulse = 1; RightPulse = 1; / / hodiny puls na start (vysoká)
)
)

char Set_Motor_State (void)
(
char Run_Stop = 0;
LeftEnable = 0;
RightEnable = 0, / / zajistí řadiče jsou pryč
switch (Next_Command)
(
případě, 0-3:
LeftDirection = 1; RightDirection = 1; / / default je foward
Left_M_State = 0; Right_M_State = 0, / / zajistí motory jsou OFF
LeftEnable = 0;
RightEnable = 0; / / vypnout motor
break;
Případ 4:
LeftDirection = 1; RightDirection = 1; / / Levý vzad
Left_M_State = 1; Right_M_State = 0; / / vpravo motor je pouze na
Run_Stop = 1;
break;
Případ 5:
LeftDirection = 0; RightDirection = 0; / / Levý vpřed
Left_M_State = 1; Right_M_State = 0; / / vpravo motor je pouze na
Run_Stop = 1;
break;
Případ 6:
LeftDirection = 0; RightDirection = 1; / / Levý vzad
Left_M_State = 0; Right_M_State = 1; / / vpravo motor je pouze na
Run_Stop = 1;
break;
Případ 7:
LeftDirection = 1; RightDirection = 1; / / Levý vpřed
Left_M_State = 0; Right_M_State = 1; / / vpravo motor je pouze na
Run_Stop = 1;
break;
Případ 8:
LeftDirection = 1; RightDirection = 1; / / Právo vzad
Left_M_State = 0; Right_M_State = 1; / / levý motor je pouze na
Run_Stop = 1;
break;
Případ 9:
LeftDirection = 1; RightDirection = 0; / / Právo vpřed
Left_M_State = 1; Right_M_State = 0; / / levý motor je pouze na
Run_Stop = 1;
break;
případ 10:
LeftDirection = 0; RightDirection = 1; / / Právo vzad
Left_M_State = 1; Right_M_State = 0; / / levý motor je pouze na
Run_Stop = 1;
break;
případ 11:
LeftDirection = 0; RightDirection = 0; / / Právo vpřed
Left_M_State = 0; Right_M_State = 1; / / vpravo motor je pouze na
Run_Stop = 1;
break;
Případ 12:
LeftDirection = 1; RightDirection = 1; / / vzad
Left_M_State = 1; Right_M_State = 1; / / Oba motory jsou ON
Run_Stop = 1;
break;
Případ 13:
LeftDirection = 0; RightDirection = 1, / / proti směru hodinových ručiček
Left_M_State = 1; Right_M_State = 1; / / Oba motory jsou ON
Run_Stop = 1;
break;
Případ 14:
LeftDirection = 1; RightDirection = 0, / / ve směru hodinových ručiček
Left_M_State = 1; Right_M_State = 1; / / Oba motory jsou ON
Run_Stop = 1;
break;
Případ 15:
LeftDirection = 0; RightDirection = 0; / / Forward
Left_M_State = 1; Right_M_State = 1; / / Oba motory jsou ON
Run_Stop = 1;
break;
) / / Koncový spínač

návrat Run_Stop;

) / / Konec Set_Motor_State (void)

/ / Samostatném 3Byte výboru Data
neplatné Decode_Input_Data (void) / / nový samostatný data
(
Next_Command = (Command_Str & 0b00001111); / / Motor zapnout / Režie data
if (Command_Str & 0b00010000) / / test bit4 data pro MSB byte1
Comm_Str2 = Comm_Str2 0b10000000; / / Přidat MSB
Motor_data = (Comm_Str1 * 256) Comm_Str2; / / kombinovat data
)

neplatné Send_Message (char příkaz, unsigned int Msg_Data) / / vysílat výstupní
(
char Out_Str1;
char Out_Str2;
command = příkaz 128; / / nastavení MSB
Out_Str1 = Msg_Data;
Out_Str2 = Msg_Data>> 8;
if (Out_Str1 & 0b10000000) / / zkontrolujte nastavení MSB
(
command = příkaz 16, / / Přidat MSB do příkazového byte bit 4
Out_Str1 = Out_Str1 & 0b01111111;
)
if (Out_Str2 & 0b10000000) / / zkontrolujte nastavení MSB
Out_Str2 = Out_Str2 & 0b01111111; / / odstranit MSB
while (! TRMT) (/ / počkat, až buffer prázdný
)
TXREG = příkaz; / / zápis příkazu znak
while (! TRMT) (/ / počkat, až buffer prázdný
)
TXREG = Out_Str2; / / write horní data
while (! TRMT) (/ / počkat, až buffer prázdný
)
TXREG = Out_Str1; / / write nižší data
)

/ / Nouzové zastavení
/ / Reason (pouze limit (3) uplatňování těchto sankcí)
neplatné Emergency_Stop (char Důvod) / / Stop pohybu a zpráva chybu
(
temp = Next_step; / / uložení tohoto postavení
Next_step = 0, / / reset
Run_Motor (0); / / stop krokových
Send_Message (Reason, temp); / / vysílat výstupní
)
neplatné SetUpPic (void)
(
/ / Port pin směry
TRISB = 0b00001111; / / set RB4-7 a výstup RB0-3 na vstupy
TRISC = 0b10000000; / / výstup C0-5, 6-7 COMMS

/ / Výboru Port stanovena na 9600
BRGH = 1; / * vysoká přenosová rychlost * /
SPBRG = 129 / * přenosová rychlost 9600 @ 20MHz * /

SYNC = 0; / * asynchronní * /
SPEN = 1; / * umožňuje sériový port kolíky * /
CREN = 1; / * umožňuje příjem * /
SREN = 0; / * žádný vliv * /
TXIE = 0; / * zakázat tx přerušení * /
RCIE = 1; / * aby RX přerušení * /
TX9 = 0; / * 8 bit přenos * /
RX9 = 0; / * 8 bit příjem * /
TXEN = 1; / * aby vysílač * /

ADCON0 = 0xC1, / / enable ADC, RC OSC.channel 0
ADCON1 = 0b00001110; / / zarovnávají doleva, analog ch0,
/ / Nastavení časovač 2
Clk_Period = 0xF9;
PR2 = Clk_Period; / / nastavení časovač 2 období = Clk_Period = 0xF9
TMR2ON = 1; / / Zapnout časovač
/ / SET UP INTERUPTS
/ / INTCON bitů = GIE, PEIE, T0IE, INTE, RBIE, T0IF, INTF, RBIF
OPTION = 0;
TMR2IE = 1; / / TMR2 přerušení umožňují
/ / INTEDG = 0; / / sestupná hrana spouští PortB.0 (Bumper)
PEIE = 1; / / Zapne periferní Inerrupt
GIE = 1; / / Zapne globální Inerrupt
)

# Pragma interrupt_level 0
static void přerušení ISR (void)
(
if (TMR2IF) / / časovač 2 přerušení
(
if (Next_step) / / dělat v případě, posílení
(

if (TMR2_Overflow_Counter == 0) / / dělat na začátku cyklu
(
LeftPulse = 0; RightPulse = 0; / / start další impuls
LeftEnable = Left_M_State;
RightEnable = Right_M_State, / / aby správce
)

if (TMR2_Overflow_Counter == 10) / / Hodiny délka
(
LeftPulse = 1; RightPulse = 1; / / motor krok nyní
)
if (TMR2_Overflow_Counter == 20) / / Zapne délka pulsu
(
/ / LeftEnable = 0;
/ / RightEnable = 0; / / vypnout regulátor
)

TMR2_Overflow_Counter ; / / přírůstek přetečení počítadlo
if (TMR2_Overflow_Counter> = Stepping_Rate) / / připraven na další krok
(
TMR2_Overflow_Counter = 0, / / reset počítadlo
) / / Konec start impulsu
) / / Konec další krok
TMR2IF = 0, / / reset časovač 2 vlajka (50uS)
) / / Konec TM2IF
if (RCIF) (/ / Received data RS232
if (RCREG> = 128) / / test na příkaz byte
(
Command_Str = RCREG;
Command_Str = ((Command_Str & 0b01100000)>> 5); / / získat adresu
if (Command_Str == Adresa) / / data pro tento mikro
Rec_state = 0; / / přechod na další stav
else / / nejsou pro tuto základnu
Rec_state = 3; / / ignore na další povel
if (Command_Str == 0) / / kontrolu všech adresu
Rec_state = 0;
)
switch (Rec_state) (
case 0: / / detekovat header na začátku zprávy
if (RCREG> = 128) / / MSB nastavení pro příkaz data
(
Command_Str = RCREG;
Rec_state = 1; / / přechod na další stav
)
break;
Případ 1:
Comm_Str1 = RCREG; / / 2. byte
Rec_state = 2; / / přechod na další stav
break;
Případ 2:
Comm_Str2 = RCREG; / / 3. byte
Rec_state = 0, / / reset na další zprávu
Comm_Data_Rec = 1, / / vlajky novou datovou zprávu
break;
case 3: / / počkat do příštího příkazový řetězec
break;
)
RCIF = 0;
) / / Konec COMMS
)

 

Welcome to EDABoard.com

Sponsor

Back
Top