|
|
View previous topic :: View next topic |
Author |
Message |
2xhp
Joined: 14 Jan 2019 Posts: 39
|
Faster pin input detection |
Posted: Thu Jan 07, 2021 10:36 am |
|
|
Hi,
I'm trying to use a 12F615 to detect and act fast on a pulse. The MCU is set up to use the internal oscillator at 8 MHz. I'm assuming that the fastest theoretical response time would be 0.5 us (1/8,000,000) * 4. All the test code does is look at an input pin. If it changes to high, it outputs high on another pin.
I get between 2 and 5 us from input rising edge to output rising edge as measured using an oscilloscope with a separate probe channel looking at both input and output. The input waveform is being generated by a signal generator. Frequency of the input is about 340 Hz and the pulse width is about 20 us. I'm wondering why the response time is so long. If I was seeing in the 1 us range, I don't think I'd be surprised. But 2-5 us is a lot more than I expected to see. I also expected it would be fairly consistent, but it jumps around from the low to the high range quite a bit.
Any ideas? Here's the test program:
Code: |
#include <12f615.h>
#fuses IOSC8,NOWDT,NOMCLR,NOBROWNOUT,NOPUT,INTRC_IO, NOPROTECT
#use delay(clock=8000000)
#use fast_io(ALL)
void main() {
set_tris_a(0b00001100);
// A0: PGD, not used otherwise (output low)
// A1: PGC, not used otherwise (output low)
// A2: Pulse input
// A3: MCLR
// A4: unused, output low
// A5: Pulse output
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A4);
output_low(PIN_A5);
setup_wdt(WDT_144MS); // WDT on in software
while(1) {
if(input(PIN_A2)) output_high(PIN_A5);
else output_low(PIN_A5);
restart_wdt();
}
}
|
Compiler version is 5.083.
Thanks in advance. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Thu Jan 07, 2021 11:00 am |
|
|
1st get RID of the WDT code......,recompile and test...see what happens.
There is no need for the WDT.
2nd, dump the listing and post it here... |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1907
|
|
Posted: Thu Jan 07, 2021 11:22 am |
|
|
Agreed, remove the watchdog for now.
If all you're looking for is to monitor one pin and set a reaction on another pin, consider CLC (configurable logic cell). I realize that your problem is probably more involved, and that you're initially gauging response time as part of a larger issue, but if speed is critical and the task is simple, you can't beat standard gates. |
|
|
2xhp
Joined: 14 Jan 2019 Posts: 39
|
|
Posted: Thu Jan 07, 2021 11:42 am |
|
|
temtronic wrote: | 1st get RID of the WDT code......,recompile and test...see what happens.
There is no need for the WDT.
2nd, dump the listing and post it here... |
First, thank for the response.
I had previously tested with the WDT removed with no discernible difference. I put it back in as I will need this functionality in the final program (so wanted to see best-case performance with this included).
I revised the program to remove the WDT again though and verified no change. Here is the list file:
CCS PCM C Compiler, Version 5.083, xxxxx 07-Jan-21 10:37
Filename: C:\temp\test.lst
ROM used: 31 words (3%)
Largest free fragment is 993
RAM used: 4 (6%) at main() level
4 (6%) worst case
Stack used: 0 locations
Stack size: 8
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
.................... #include <12f615.h>
.................... //////////// Standard Header file for the PIC12F615 device ////////////////
.................... ///////////////////////////////////////////////////////////////////////////
.................... //// (C) Copyright 1996, 2014 Custom Computer Services ////
.................... //// This source code may only be used by licensed users of the CCS C ////
.................... //// compiler. This source code may only be distributed to other ////
.................... //// licensed users of the CCS C compiler. No other use, reproduction ////
.................... //// or distribution is permitted without written permission. ////
.................... //// Derivative programs created using this software in object code ////
.................... //// form are not restricted in any way. ////
.................... ///////////////////////////////////////////////////////////////////////////
.................... #device PIC12F615
....................
.................... #list
....................
....................
.................... #fuses IOSC8,NOWDT,NOMCLR,NOBROWNOUT,NOPUT,INTRC_IO, NOPROTECT
....................
.................... #use delay(clock=8000000)
....................
.................... #use fast_io(ALL)
....................
.................... void main() {
0004: MOVF 03,W
0005: ANDLW 1F
0006: MOVWF 03
0007: BCF 1F.6
0008: BSF 03.5
0009: BCF 1F.0
000A: BCF 1F.1
000B: BCF 1F.2
000C: BCF 1F.3
000D: BCF 03.5
000E: CLRF 1A
000F: CLRF 1C
....................
.................... set_tris_a(0b00001100);
0010: MOVLW 0C
0011: BSF 03.5
0012: MOVWF 05
.................... // A0: PGD, not used otherwise (output low)
.................... // A1: PGC, not used otherwise (output low)
.................... // A2: Pulse input
.................... // A3: MCLR
.................... // A4: unused, output low
.................... // A5: Pulse output
....................
.................... output_low(PIN_A0);
0013: BCF 03.5
0014: BCF 05.0
.................... output_low(PIN_A1);
0015: BCF 05.1
.................... output_low(PIN_A4);
0016: BCF 05.4
.................... output_low(PIN_A5);
0017: BCF 05.5
....................
.................... while(1) {
....................
.................... if(input(PIN_A2)) output_high(PIN_A5);
0018: BTFSS 05.2
0019: GOTO 01C
001A: BSF 05.5
001B: GOTO 01D
.................... else output_low(PIN_A5);
001C: BCF 05.5
001D: GOTO 018
.................... }
.................... }
001E: SLEEP
Configuration Fuses:
Word 1: 3CD4 INTRC_IO NOWDT NOPUT NOMCLR NOPROTECT IOSC8 NOBROWNOUT
|
|
|
2xhp
Joined: 14 Jan 2019 Posts: 39
|
|
Posted: Thu Jan 07, 2021 11:46 am |
|
|
newguy wrote: | Agreed, remove the watchdog for now.
If all you're looking for is to monitor one pin and set a reaction on another pin, consider CLC (configurable logic cell). I realize that your problem is probably more involved, and that you're initially gauging response time as part of a larger issue, but if speed is critical and the task is simple, you can't beat standard gates. |
Hi newguy. You are correct, there is more to come in the program that can't be realized (at least not easily) with logic gates.
I do have a newer PIC arriving any minute (PIC12F1571) that ends up being quite a bit cheaper and can run with an internal oscillator of 32 MHz. I'll test it with the same basic program and see what difference I find. I can't imagine it being worse! |
|
|
gaugeguy
Joined: 05 Apr 2011 Posts: 303
|
|
Posted: Thu Jan 07, 2021 12:36 pm |
|
|
Looking at the assembly it is going to be anywhere from 3 to 8 clock cycles delay in response. At 8MHz that would be 1.5us to 4us. Seems to match your testing fairly close. |
|
|
2xhp
Joined: 14 Jan 2019 Posts: 39
|
|
Posted: Thu Jan 07, 2021 12:54 pm |
|
|
gaugeguy wrote: | Looking at the assembly it is going to be anywhere from 3 to 8 clock cycles delay in response. At 8MHz that would be 1.5us to 4us. Seems to match your testing fairly close. |
I see now looking at the list file and the number of cycles per instruction how you get the 3 cycles. That would be upon detecting a high input. But I'm not seeing the 1.5 us on every rising edge - I see 1.5 to 4 us seemingly random (again - on the detection of a high input). Any ideas what could be causing that randomness?
Thank you. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Thu Jan 07, 2021 1:20 pm |
|
|
The randomness or jitter can be the signal generator ( is it a super stable 50/50 square wave ??)
or
simply WHEN a 'high'( or 'low) is detected.
Say the high pulse width is 10us. You don't have any 'sychronizing' with WHEN you sample. it could be .25us into the high, 2us, 4.99 us,9.99us etc.
Ideally you want to sample on the rising and falling edges.
I don't know if that PIC has 'edge detection' (IOC) capability. |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1907
|
|
Posted: Thu Jan 07, 2021 3:15 pm |
|
|
temtronic wrote: | The randomness or jitter can be the signal generator ( is it a super stable 50/50 square wave ??)
or
simply WHEN a 'high'( or 'low) is detected.
Say the high pulse width is 10us. You don't have any 'sychronizing' with WHEN you sample. it could be .25us into the high, 2us, 4.99 us,9.99us etc.
Ideally you want to sample on the rising and falling edges.
I don't know if that PIC has 'edge detection' (IOC) capability. |
IOC won't bring the reaction time down, especially if you actually code it as an interrupt driven event. The fastest possible reaction will be 3 clock cycles, worst 8 as gaugeguy has posted. The reaction, as Jay has said, depends on when the pulse arrives relative to which line the program is currently executing. Assuming that the assembly for the new faster processor is the same, and the new process runs 4x faster, that means the reaction time will be 1/4 of what you're currently observing. If that isn't fast enough, you could try a PIC that is capable of running at 64MHz. If that still isn't enough, then a GAL or small FPGA will probably be your next best option. |
|
|
|
|
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
|