View previous topic :: View next topic |
Author |
Message |
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
INT RB0 or CCP in capture mode |
Posted: Thu Feb 10, 2011 8:03 am |
|
|
Hello Guys!
I'm working on a project, and I'm in trouble what to use.
I have to measure the incoming signal frequency (square wave), and depending on it, I have to add a calculated delay, and then activate an output. I have to add this delay immediately after the signal, and must not to lose any of the signals...also I have to send the frequency value to rs232 once or twice per second. The frequency range is 50..300Hz.
I don't know what to do... capture the signal on RB0 and then in the isr make the delay, or measure with CCP, and then in the main.
Or make it without interrupt handler just in the main?
Thanks a lot! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 10, 2011 1:40 pm |
|
|
Tell us what the project is about. Tell us what device is giving these
signals to the PIC. Tell us what device the PIC must control. |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Mon Feb 21, 2011 3:54 pm |
|
|
I want to make a cdi ignition, with programmable advance for my scooter...
Yes, I know that there are some on the internet yet, but I want to build my own, I also need it for graduate work in the school.
So the signal comes from an inductive pickup - 2-3V sinus signal, and pic must control a thyristor.
Thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 22, 2011 3:05 pm |
|
|
I have not done this type of project. But I think you need to make an
external circuit that cleans up the incoming waveform. Maybe use an RC
low-pass filter to remove noise. Then run it through a Schmitt Trigger
level converter chip, to change the logic levels to 5v CMOS levels.
I'm assuming the signal doesn't go below ground. If it does, you will
need additional circuits.
Then you can run the signal into the External Interrupt pin on the PIC.
Then inside the #int_ext routine, you could enable a hardware timer, such
as Timer0. This would set the delay time. Also enable the Timer0
interrupt. Then, when the Timer0 interrupt occurs, you can set your
"advance" signal to a high level. Then set Timer0 again, to control
the duration of the "advance" signal.
These are just some rough ideas.
For the frequency of the incoming waveform, you can also connect the
signal to the CCP input on your PIC and use the tachometer code which
can be found on this forum (use the search page). |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Sun Mar 20, 2011 7:25 pm |
|
|
Thank you PCMProgrammer!
I made it, and it works!
Now I have another problem. I want to send an int16 array[40] on the uart from the PC to the pic, and I dont know how to transfer it.
Thanks! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 21, 2011 1:31 pm |
|
|
What device are you sending the data to ? What format does this device
need for the data ? ASCII bytes ? or binary bytes ? Does it need the
data to be a packet, with a specific protocol for the packet ? |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Tue Mar 22, 2011 1:48 pm |
|
|
The device is 16F628a. I want to transfer a lookup table for the pic. I need to store it in the program memory, because the data memory is out of space. The pic is connected with the hardware usart to the PC with a USB-TTL converter...
I read in the manual that I need to use write_program_eeprom() function, but did not found example for it.
Also did not found example to transfer the array.
Thanks |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Tue Mar 22, 2011 2:57 pm |
|
|
I'd be looking at trimming your code to gain the 80 or so bytes you need for the lookup table.
That PIC has 2KB of program space, should be lots for a CDI system with RS232 communications.It's really 'tons of space' to guys like me who only had 8KB for entire remote SCAD systems that did a heckuva lot more work !
Next bet, upgrade the PIC to say a 16F648a....
But I'm sure you can trim the fat and get it all under the hood ! |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Tue Mar 22, 2011 4:25 pm |
|
|
Yes, you are right.
But I need 2 of the lookup tables, thats about 160bytes of data, too many for the data memory. The program memory has a lot of free space, and thats why i want to store there the data, just dont know how to do that:) |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Sun Mar 27, 2011 4:06 pm |
|
|
I tried to transfer the lookup table from the PC to the pic. It is an int16 array[28] with numbers from 0-35000. I send every value with \r at the end...But it receive only 3 values correct, the other are incorrect...if i only printf the values, then all the values are correct... I think the problem is the size of the serial buffer... it takes too much time to convert the values.
How can i solve this? make a delay between sending values? or make some handshake routine?
And the other question, will it store the data permanent like this way, or delete after power down?
Thanks
Code: |
#include <stdlib.h>
#fuses NOMCLR,NOLVP,HS,NOWDT,NOPUT,NOBROWNOUT
#use delay(clock=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,STREAM=COM)
int16 delay[28];
**********
void main()
{
if(!input(PROG)){
for(i=0;i<28;i++){
fgets(buff,COM);
delay[i]=atoi(buff);
//printf("%s",buff);
}
for(i=0;i<28;i++){
printf("%lu ",delay[i]);
}
}
}
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Sun Mar 27, 2011 6:08 pm |
|
|
First, you need to add 'errors' to the options in the use rs232(..) line...
Second, you're saving that data to RAM so power off ..there's goes the data..
You can 'hard code' the tables into program memory, which will eliminate the two problems. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon Mar 28, 2011 1:47 am |
|
|
If you declare a value as 'const', it is stored in program memory.
So:
Code: |
const int16 look_up[] = {1,2,3,4,5,6,7,8,9,.......};
|
Stores the 16bit array 'look_up', in the program memory.
Limitations:
You can't use _pointers_ to an array declared this way.
There is an overhead of about 20bytes, to add the retrieval code for this.
Obviously, you can't write to it. It has to be pre-declared at compile time.
Best Wishes |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Mon Mar 28, 2011 5:35 am |
|
|
I solved my problem with the incorrect values. I had to use atol() instead of atoi(), because it is for 8bit numbers...
Thanks for the const array, but how can i store a lookup table during runtime? I want to transfer it from my PC, not declared at compile.
Thanks! |
|
|
CheeseE
Joined: 10 Feb 2011 Posts: 8 Location: Hungary
|
|
Posted: Mon Mar 28, 2011 4:11 pm |
|
|
Every day i have another question:)
Today question is: How can I speed up the calculation of this expression:
Code: | delayus=time/360*delay[a]; |
where delayus is int16, time is int16, and delay[] is int. Now it takes about 150us @ 16Mhz
Thanks |
|
|
|