|
|
View previous topic :: View next topic |
Author |
Message |
ishan
Joined: 11 Jun 2011 Posts: 3 Location: India
|
Decode PWM data Signal [solved] |
Posted: Sat Jun 11, 2011 8:56 am |
|
|
I am writing a program to decode communication between Ultrasonic Parking Sensor and its display.
The data is PWM encoded with a 600 us (0) signal and 1200us (1) signal Ref.
http://www.mp3car.com/hardware-development/121995-custom-usb-parking-sensor-interface-formally-pdc-usb.html
I have written the following code and interrupts are being triggered. However I have realised that some bits are being skipped (bunch of 2 or 3). I guess the problem is in the way I have set up the interrupts and maybe the printf statement.
Request help.
Code: |
#include <18F4550.H>
#fuses HSPLL, PLL5, CPUDIV1, NOWDT, PUT, BROWNOUT, NOLVP
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int bit_val;short flag;
long rise,fall,pulse_width;
#int_ccp2
void isr()
{
rise = CCP_1;
fall = CCP_2;
pulse_width = fall - rise;
bit_val=3;
if (pulse_width <=3600 && pulse_width >=3598) {
bit_val=0;
}
if (pulse_width <=7200 && pulse_width >=7197) {
bit_val=1;
}
}
void main()
{
printf("\n\rPulse Width:\n\r");
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
while(TRUE) {
if (bit_val<=1){
//printf("\n\r%lu us ", pulse_width );
printf("%u", bit_val);
bit_val=4;
}
}
}
|
Following is the sample data that I have got using the above program
Code: | 111100000000011111111011010010111011110001000110100100001001
101011001110000111101111000000011100001000001111111101100001
111101111000100011000011000011111011000111100000000011111111
011110000000001111111011010010000100110101100110100100101001
101011001110000100000111111110111000010000011111111011000011
010011111011000110000110101001101011101111000000000111111110
111100000000011111111011010010010100110101100110100100001001
101011001110000100000111111110111000010000011111111011000011
000100110101110110000110101001101011001111000000000111111110
111100000000011111111011010010010100110101100110100100101011
101011001110000100000111111110111000010000011111111011000011
010101110101100110000110001001101011001111000000000111111101
111000000000111111110110100100001001101011001101001001010011
010110011100001000001111111101110000100000111111110110000110
101001101011001100001101010011010111011110000000001111111101
111000000000111111110110100100101011101011001101001000010011
010110011100001000001111111101110000100000111111110110000110
001001101011101100001101010011010110011110000000001111111101
111000000000111111110110100100101001101011001101001000010011
010110011100001000001111111101110000100000111111110110000110
101011101011001100001100010011010110011110000000001111111101
111000000000111111101101001000010011010110011010010010100110
101110111000010000011111111011100001000001111111101100001101
010011010110011000011010100110101110111100000000011111111011
110000000001111111101101001001010011010111011010010000100110
101110111000010000011111111011100001000001111111101100001100
010011010111011000011010100110101100111100000000011111111011
110000000001111111101101001001010011010111011010010000100110
101100111000010000011111111011100001000001111111101100001100
010011010110011000011010100110101110111100000000011111111011
110000000001111111011010010000100110101100110100100101001101
011001110000100000111111110111000010000011111111011000011010
100110101110110000110001001101011001111000000000111111101111
000000000111111110110100100001001101011001101001001010011010
110011100001000001111111101110000100000111111110110000110101
001101011001100001101010011010111011110000000001111111101111
000000000111111110110100100101001101011001101001000010011010
110011100001000001111111101110000100000111111110110000110001
001101011101100001101010011010111011110000000001111111101111
000000000111111101101001001010011010110011010010000100110101
100111000010000011111111011100001000001111111101100001100010
011010111011000011010100110101110111100000000011111111011110
000000001111111011010010000100110101100110100100101011101011
001110000100000111111110111000010000011111111011000011010100
1101011101100001100 |
The data format is as follows
Total data packet of each sensor consists of 24 bits (3bytes x8)
The first byte is the sensor address and consists of 2 nibbles which are complementary of each other (1111 0000).
The second byte is the complement of third byte. and third byte contains the distance data
Except for the initial packet all sensor data is transmitted twice . So the sensor transmission is ABBCCDDAABBCCDD....with ABCD respectively being sensor names.
I will highlight the problem of missing bits in above data output. Lets consider first 24 bits
Sample data : 111100000000011111111011
11110000 - Sensor A Address
00000111 - Complement of 3rd byte
11111011 - Now you can see that there are 02 bits missing both of them 0's. Ideally the packet should have been 11111000 instead of 11111011
Help! |
|
|
ishan
Joined: 11 Jun 2011 Posts: 3 Location: India
|
Stupid Oversight: Serial Baud Rate |
Posted: Sat Jun 11, 2011 11:42 am |
|
|
Solution could not have been more simpler...
Increased the serial baudrate to 19200 and the missing bits became visible..
Will post the whole code shortly
Thanks |
|
|
ishan
Joined: 11 Jun 2011 Posts: 3 Location: India
|
Opensource Code for PDC USB - Usb Ultrasonic Parking Sensor |
Posted: Sun Jun 26, 2011 12:58 am |
|
|
As I mentioned in the above post..
Detailed Code for PDC USB Car is available at
http://ishankarve.blogspot.com/2011/06/decoding-ultrasonic-parking-sensor.html
Code as follows
Code: | /*
Copyright 2011 Ishan Anant Karve, India. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
THIS SOFTWARE IS PROVIDED BY ISHAN ANANT KARVE ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the
authors and should not be interpreted as representing official policies, either expressed
*/
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#DEFINE USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8 //allocate 8 bytes in the hardware for transmission
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8 //allocate 8 bytes in the hardware for reception
#define RAND_MAX 200
#define SEN_A 0b11110000 //SENSOR A Address
#define SEN_B 0b11010010 //SENSOR B Address
#define SEN_C 0b11100001 //SENSOR C Address
#define SEN_D 0b11000011 //SENSOR D Address
//change USB descriptors for custom use
#include <stdlib.h> //required for rand() function
#include <pic18_usb.h> //Microchip 18Fxx5x hardware layer for usb.c
#include <usb_desc_hid.h> //USB Configuration and Device descriptors for this UBS device
#include <usb.c> //handles usb setup tokens and get descriptor reports
short tx_flag;
int bit_val;int count;
short sensor_ready; //flags for correspond to 03 bytes of each sensor data
int sensor,Dist_A,Dist_B,Dist_C,Dist_D, nibble_byte,dist_byte;
short BUZZER;
long rise,fall,pulse_width;int16 temp;
#int_ccp2
void isr()
{
rise = CCP_1;
fall = CCP_2;
pulse_width = fall - rise;
bit_val=2;
if (pulse_width <=3600 && pulse_width >=3598) {
bit_val=0; count++;shift_left(&temp,1,bit_val);
}
if (pulse_width <=7200 && pulse_width >=7197) {
bit_val=1; count++;shift_left(&temp,1,bit_val);
}
if (temp==SEN_A){sensor=1;sensor_ready=1;count=0;nibble_byte=0;dist_byte=0;temp=0;} //distance DIST_A purposely not set to zero
if (temp==SEN_B){sensor=2;sensor_ready=1;count=0;nibble_byte=0;dist_byte=0;temp=0;}
if (temp==SEN_C){sensor=3;sensor_ready=1;count=0;nibble_byte=0;dist_byte=0;temp=0;}
if (temp==SEN_D){sensor=4;sensor_ready=1;count=0;nibble_byte=0;dist_byte=0;temp=0;}
}
void main() {
int8 out_data[20];
int8 in_data[2];
int8 send_timer=0;
count=0;temp=0;bit_val=2;tx_flag=0;
sensor=0;sensor_ready=0;count=0;nibble_byte=0;dist_byte=0;Dist_A=0;Dist_B=0;Dist_C=0;Dist_D=0;
//SETUP INTERRUPTS
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
delay_ms(1000);
printf("\r\n\nParking Sensor");
usb_init_cs();
while (TRUE) {
usb_task();
if (sensor_ready && count==16){
nibble_byte=make8(temp,0); dist_byte=~nibble_byte;
switch (sensor) {
case 1:Dist_A=dist_byte; //Set data for Sensor A
break;
case 2:Dist_B=dist_byte; //Set data for Sensor B
break;
case 3:Dist_C=dist_byte; //Set data for Sensor C
break;
case 4:Dist_D=dist_byte; //Set data for Sensor D
break;
}
//printf("%u --> %u\n\r"sensor,dist_byte); //for debug purposes
//reset all variables
sensor=0;sensor_ready=0;count=0;nibble_byte=0;dist_byte=0;temp=0;
}
if (usb_enumerated()) {
if (!send_timer) {
send_timer=250;
out_data[0]=Dist_A;
out_data[1]=Dist_B;
out_data[2]=Dist_C;
out_data[3]=Dist_D;
out_data[4]=0;
if (tx_flag){tx_flag=0;
if (usb_put_packet(1, out_data,5, USB_DTS_TOGGLE)){
//printf("\r\n<-- Sending 2 bytes: 0x%X 0x%X 0x%X 0x%X 0x%X", out_data[0], out_data[1], out_data[2], out_data[3], out_data[4]);
//printf("\r\n<-- Sending 2 bytes: %u %u %u %u %u", out_data[0], out_data[1], out_data[2], out_data[3], out_data[4]);// for debug purposes
}
}
}
if (usb_kbhit(1)) {
usb_get_packet(1, in_data, 2);
{
//printf("\r\n--> Received data: 0x%X 0x%X",in_data[0],in_data[1]);//for debug purposes
}
if (in_data[0]==0x20) {tx_flag=1;}
}
send_timer--;
delay_ms(1);
}
}
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|