Ahmadabuomar
- 20th December 2009, 17:59
HI EVERY ONE
i m trying to control a robotic arm with wireless serial communication between two PICs. the sender pic takes and input from a joustick potintiometers and send instructios to the receiving pic. there should be 7 bytes to send using serin command. a preamble byte $55 and 6 control bytes.
i established the serial communication between the two pic successfully. and i tested the received data with lcd. everything works great.
the problem is, when i wrote a PWM routine in the receiving pic, i used TMR0 interrupts. now when i try to reveive data and do PWM. the pic doesnt work.
i tried to figure out whats wrong but i failed
can u help me?
here are the codes. i didnt add potentiometers reading to sender pic. i just tried to test it with numbers.
INCLUDE "MODEDEFS.BAS"
S1 VAR BYTE
S3 VAR BYTE
S4 VAR BYTE
S6 VAR BYTE
S7 VAR BYTE
DC VAR BYTE
DC1 VAR BYTE
DC2 VAR BYTE
CNT VAR BYTE
S1 = 255
S3 = 3
S4 = 44
S6 = 10
S7 = 20
DC = 77
TRISB = 0
PAUSE 500
MAIN:
PORTB.0 = 1
PAUSE 1000
PORTB.0 = 0
PAUSE 1000
PORTB.0 = 1
PAUSE 1000
PORTB.0 = 0
PAUSE 1000
DATASEND:
SEROUT 7,T2400,[$55,S1,S3,S4,S6,S7,DC]
PAUSEUS 2
GOTO DATASEND
the receiver pic code is here
'************************************************* ***************
'* Name : W_ROB_REC.PBP *
'* Author : [AHMAD ABU OMAR] *
'* Notice : Copyright (c) 2009 [AHMAD ABU OMAR] *
'* : All Rights Reserved *
'* Date : 16/12/2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
'************************************************* ***************
'* DIFINTIONS
'************************************************* ***************
define osc 48
INCLUDE "MODEDEFS.BAS"
'************************************************* ***************
'* VARIABLES
'************************************************* ***************
S1 VAR BYTE ' first servo motor position
S2 VAR BYTE
S3 VAR BYTE
S4 VAR BYTE
S5 VAR BYTE
S6 VAR BYTE
S7 VAR BYTE
DC VAR BYTE
DC1 VAR BYTE ' right DC motor of mobile base
DC2 VAR BYTE ' left DC motor of mobile base
OLD VAR BYTE ' a counter variable
dc1 = 0
DC2 = 0
S1 = 1
S2 = 255
S3 = 1
S4 = 1
S5 = 255
S6 = 1
S7 = 1
'************************************************* ***************
'* MAIN PROGRAM START
'************************************************* ***************
INTCON2 = $F5 ' DISBALE PORTB PULL-UPS, SET TRM0 INTERRUPT TO HIGH PERIORITY
INTCON3 = $C0 ' DISABLE EXTERNAL INTERRUPTS PERIORITY
RCON.7 = 0 ' DISABLE PERIORITY LEVELS ON INTERRUPTS
PIE1 = 0 ' DISABLE ALL PREPHIRAL INTERRUPTS
PIE2 = 0
PIR1 = 0
PIR2 = 0
ADCON1 = 15 ' ALL DIGITAL I/O
TRISA = 0
TRISB = %10000000 ' RB7 is input, used to reveive serial data
TRISC = 0
LATA = 0
LATB = 0
LATC = 0
INTCON = %00100000 ' ENABLE TIMER0 INTERRUPTS
T0CON = %00000101 ' SET PRESCALAR 64 FOR TMR0, APROX 5us PER INCREMENT
' AND TMR0 WORKING IN 16 BIT MODE
TMR0L = $60 ' SET A BALANCE FOR 20ms PERIOD BEFORE INTERRUPT
TMR0H = $F0
ON INTERRUPT GOTO PW
INTCON = %10100000
T0CON.7 = 1
MAIN:
WHILE 1
PAUSEUS 1
GOSUB RECEIVE
WEND
'************************************************* ***************
'* PW: INTERRUPT SERVICE ROUTINE
'************************************************* ***************
DISABLE
PW:
PORTB =%01111111
OLD = 0
TMR0L = 0
PAUSEUS 800
s2 = 255 - s1
s5 = 255 - s4
FOR OLD = 0 TO 255
IF S1<= 0 THEN PORTB.0 = 0:S1 = 1
IF S2<= 0 THEN PORTB.1 = 0:S2 = 1
IF S3<= 0 THEN PORTB.2 = 0:S3 = 1
IF S4<= 0 THEN PORTB.3 = 0:S4 = 1
IF S5<= 0 THEN PORTB.4 = 0:S5 = 1
IF S6<= 0 THEN PORTB.5 = 0:S6 = 1
IF S7<= 0 THEN PORTB.6 = 0:S7 = 1
S1 = S1 - 1
S2 = S2 - 1
S3 = S3 - 1
S4 = S4 - 1
S5 = S5 - 1
S6 = S6 - 1
S7 = S7 - 1
WHILE TMR0L = OLD
WEND
NEXT OLD
TMR0L = $EF ' SET A BALANCE FOR 18ms PERIOD BEFORE INTERRUPT
TMR0H = $F1
INTCON = %10100000
T0CON.7 = 1 ' TIMER0 ON
RESUME
ENABLE
'************************************************* ***************
'* SUBROUTINE RECEIVE
'************************************************* ***************
RECEIVE:
serIN PORTB.7,T2400,[$55],S1,S3,S4,S6,S7,DC
PAUSEUS 1
RETURN
i m using PIC 16f628a on sending end and 18f2550 on the reciving end
crystals used on both sides are 4 MHz
i m trying to control a robotic arm with wireless serial communication between two PICs. the sender pic takes and input from a joustick potintiometers and send instructios to the receiving pic. there should be 7 bytes to send using serin command. a preamble byte $55 and 6 control bytes.
i established the serial communication between the two pic successfully. and i tested the received data with lcd. everything works great.
the problem is, when i wrote a PWM routine in the receiving pic, i used TMR0 interrupts. now when i try to reveive data and do PWM. the pic doesnt work.
i tried to figure out whats wrong but i failed
can u help me?
here are the codes. i didnt add potentiometers reading to sender pic. i just tried to test it with numbers.
INCLUDE "MODEDEFS.BAS"
S1 VAR BYTE
S3 VAR BYTE
S4 VAR BYTE
S6 VAR BYTE
S7 VAR BYTE
DC VAR BYTE
DC1 VAR BYTE
DC2 VAR BYTE
CNT VAR BYTE
S1 = 255
S3 = 3
S4 = 44
S6 = 10
S7 = 20
DC = 77
TRISB = 0
PAUSE 500
MAIN:
PORTB.0 = 1
PAUSE 1000
PORTB.0 = 0
PAUSE 1000
PORTB.0 = 1
PAUSE 1000
PORTB.0 = 0
PAUSE 1000
DATASEND:
SEROUT 7,T2400,[$55,S1,S3,S4,S6,S7,DC]
PAUSEUS 2
GOTO DATASEND
the receiver pic code is here
'************************************************* ***************
'* Name : W_ROB_REC.PBP *
'* Author : [AHMAD ABU OMAR] *
'* Notice : Copyright (c) 2009 [AHMAD ABU OMAR] *
'* : All Rights Reserved *
'* Date : 16/12/2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
'************************************************* ***************
'* DIFINTIONS
'************************************************* ***************
define osc 48
INCLUDE "MODEDEFS.BAS"
'************************************************* ***************
'* VARIABLES
'************************************************* ***************
S1 VAR BYTE ' first servo motor position
S2 VAR BYTE
S3 VAR BYTE
S4 VAR BYTE
S5 VAR BYTE
S6 VAR BYTE
S7 VAR BYTE
DC VAR BYTE
DC1 VAR BYTE ' right DC motor of mobile base
DC2 VAR BYTE ' left DC motor of mobile base
OLD VAR BYTE ' a counter variable
dc1 = 0
DC2 = 0
S1 = 1
S2 = 255
S3 = 1
S4 = 1
S5 = 255
S6 = 1
S7 = 1
'************************************************* ***************
'* MAIN PROGRAM START
'************************************************* ***************
INTCON2 = $F5 ' DISBALE PORTB PULL-UPS, SET TRM0 INTERRUPT TO HIGH PERIORITY
INTCON3 = $C0 ' DISABLE EXTERNAL INTERRUPTS PERIORITY
RCON.7 = 0 ' DISABLE PERIORITY LEVELS ON INTERRUPTS
PIE1 = 0 ' DISABLE ALL PREPHIRAL INTERRUPTS
PIE2 = 0
PIR1 = 0
PIR2 = 0
ADCON1 = 15 ' ALL DIGITAL I/O
TRISA = 0
TRISB = %10000000 ' RB7 is input, used to reveive serial data
TRISC = 0
LATA = 0
LATB = 0
LATC = 0
INTCON = %00100000 ' ENABLE TIMER0 INTERRUPTS
T0CON = %00000101 ' SET PRESCALAR 64 FOR TMR0, APROX 5us PER INCREMENT
' AND TMR0 WORKING IN 16 BIT MODE
TMR0L = $60 ' SET A BALANCE FOR 20ms PERIOD BEFORE INTERRUPT
TMR0H = $F0
ON INTERRUPT GOTO PW
INTCON = %10100000
T0CON.7 = 1
MAIN:
WHILE 1
PAUSEUS 1
GOSUB RECEIVE
WEND
'************************************************* ***************
'* PW: INTERRUPT SERVICE ROUTINE
'************************************************* ***************
DISABLE
PW:
PORTB =%01111111
OLD = 0
TMR0L = 0
PAUSEUS 800
s2 = 255 - s1
s5 = 255 - s4
FOR OLD = 0 TO 255
IF S1<= 0 THEN PORTB.0 = 0:S1 = 1
IF S2<= 0 THEN PORTB.1 = 0:S2 = 1
IF S3<= 0 THEN PORTB.2 = 0:S3 = 1
IF S4<= 0 THEN PORTB.3 = 0:S4 = 1
IF S5<= 0 THEN PORTB.4 = 0:S5 = 1
IF S6<= 0 THEN PORTB.5 = 0:S6 = 1
IF S7<= 0 THEN PORTB.6 = 0:S7 = 1
S1 = S1 - 1
S2 = S2 - 1
S3 = S3 - 1
S4 = S4 - 1
S5 = S5 - 1
S6 = S6 - 1
S7 = S7 - 1
WHILE TMR0L = OLD
WEND
NEXT OLD
TMR0L = $EF ' SET A BALANCE FOR 18ms PERIOD BEFORE INTERRUPT
TMR0H = $F1
INTCON = %10100000
T0CON.7 = 1 ' TIMER0 ON
RESUME
ENABLE
'************************************************* ***************
'* SUBROUTINE RECEIVE
'************************************************* ***************
RECEIVE:
serIN PORTB.7,T2400,[$55],S1,S3,S4,S6,S7,DC
PAUSEUS 1
RETURN
i m using PIC 16f628a on sending end and 18f2550 on the reciving end
crystals used on both sides are 4 MHz