O
oTaRu
Guest
Hi, ako ay kasalukuyang gumagamit ng PIC16F877 upang makontrol L293D para sa motor.Ang isyu ay ako ay hindi nagawang mai-set ang oras control upang ihinto ang motor kapag ang panahon ay ...Kahit gaano kalaki ang halaga sa aking C programming.Ito ay pa rin tumigil sa mas mababa kaysa 1sec oras.Mangyari lamang na payo.Salamat!
Sa ibaba ay ang aking coding:
# ifndef __CPU_16F877__
# error "Ang program na ito ay ginawa para sa PIC16F877 controller"
# endif
# isama ang "io16f877.h" / / ang kahulugan ng hardware magrehistro file.
int timer_value = 0xEA60; / / decimal 60000.
magpawalang-bisa DelayUs (int count)
(
int i;
int j;
para sa (i = 0; i <count; i )
(
para sa (j = 0; j <500000000; j );
/ / Ito para sa loop ay 5 NOPs & wastes 1 sa amin para sa aming mga PIC orasan dalas ng 20MHz.
)
)
magpawalang-bisa initialize_IO_ports (walang laman)
(
/ / i-set ang digital IO port bilang bawat kinakailangan.
TRISB = 0x01; / / Porta bilang input.
TRISD = 0x00; / / portD bilang output.
/ / i-clear ang output port sa simula.
PORTD = 0x00; / / malinaw portD.
)magpawalang-bisa initialize_timer1 (walang laman)
(
TMR1CS = 0;
/ / Set prescalar halaga ng 1:8 ibig sabihin timer1 count = 8x200ns = 1600nS.
T1CKPS1 = 1;
T1CKPS0 = 1;
/ / Sumangguni sa datasheet para sa mga organisasyon ng interrupts.
GIE = 1; / / global makatakip-enable.
PEIE = 1; / / paligid makatakip-enable.
TMR1IE = 1; / / paganahin ang timer1 matigil.
)/ / Ang function na naglo-load timer_value sa timer1,
at nagbibigay-daan ito.
magpawalang-bisa load_timer1 (int timer_value)
(
TMR1ON = 0; / / huwag paganahin timer1 bago loading ang halaga.
TMR1IF = 0; / / timer1 bandila nalilimas.
TMR1H = (0xFFFF-timer_value)>> 8; / / load timer1 mataas magrehistro.
TMR1L = 0xFFFF-timer_value; / / load timer1 mababa magrehistro.
TMR1ON = 1; / / paganahin ang timer1.
)
int pangunahing ()
(
int motor_switch = 0;
int i;
RB0 = motor_switch;
initialize_IO_ports ();
initialize_timer1 ();
load_timer1 (timer_value);
kung (RB0 == 1)
(
RD0 = 1;
para sa (i = 10; i> 0; ako -)
(
DelayUs (10000);
)
)
kung hindi
RD0 = 0;
)
/ * dulo ng programa * /
Sa ibaba ay ang aking coding:
# ifndef __CPU_16F877__
# error "Ang program na ito ay ginawa para sa PIC16F877 controller"
# endif
# isama ang "io16f877.h" / / ang kahulugan ng hardware magrehistro file.
int timer_value = 0xEA60; / / decimal 60000.
magpawalang-bisa DelayUs (int count)
(
int i;
int j;
para sa (i = 0; i <count; i )
(
para sa (j = 0; j <500000000; j );
/ / Ito para sa loop ay 5 NOPs & wastes 1 sa amin para sa aming mga PIC orasan dalas ng 20MHz.
)
)
magpawalang-bisa initialize_IO_ports (walang laman)
(
/ / i-set ang digital IO port bilang bawat kinakailangan.
TRISB = 0x01; / / Porta bilang input.
TRISD = 0x00; / / portD bilang output.
/ / i-clear ang output port sa simula.
PORTD = 0x00; / / malinaw portD.
)magpawalang-bisa initialize_timer1 (walang laman)
(
TMR1CS = 0;
/ / Set prescalar halaga ng 1:8 ibig sabihin timer1 count = 8x200ns = 1600nS.
T1CKPS1 = 1;
T1CKPS0 = 1;
/ / Sumangguni sa datasheet para sa mga organisasyon ng interrupts.
GIE = 1; / / global makatakip-enable.
PEIE = 1; / / paligid makatakip-enable.
TMR1IE = 1; / / paganahin ang timer1 matigil.
)/ / Ang function na naglo-load timer_value sa timer1,
at nagbibigay-daan ito.
magpawalang-bisa load_timer1 (int timer_value)
(
TMR1ON = 0; / / huwag paganahin timer1 bago loading ang halaga.
TMR1IF = 0; / / timer1 bandila nalilimas.
TMR1H = (0xFFFF-timer_value)>> 8; / / load timer1 mataas magrehistro.
TMR1L = 0xFFFF-timer_value; / / load timer1 mababa magrehistro.
TMR1ON = 1; / / paganahin ang timer1.
)
int pangunahing ()
(
int motor_switch = 0;
int i;
RB0 = motor_switch;
initialize_IO_ports ();
initialize_timer1 ();
load_timer1 (timer_value);
kung (RB0 == 1)
(
RD0 = 1;
para sa (i = 10; i> 0; ako -)
(
DelayUs (10000);
)
)
kung hindi
RD0 = 0;
)
/ * dulo ng programa * /