View previous topic :: View next topic |
Author |
Message |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Sun May 09, 2010 8:51 pm Post subject: pulsein and pulseout simultanously |
|
|
Hi
Is it possible for atmega32 running at 4MHZ to pulseout a pulse and measure this pulse on the other pin using pulsein. According to my little knowledge it does not seem to be possible using this method but could be possible using Timers which I am not conversant with. There should be a way out but I need a helping hand here with a practical example.
Regards and thanks to the Forum members.
NaseerAk |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Mon May 10, 2010 7:04 pm Post subject: pulsein and pulseout simultanously |
|
|
Any One Here |
|
Back to top |
|
 |
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland

|
Posted: Tue May 11, 2010 12:11 am Post subject: |
|
|
Yes, we are here, but you ask a question which no-one wants to answer.
While its probably possible to get Pulsein and Pulseout to work together, by rewriting one of them, it may be very difficult, certainly beyond just showing a few lines of code. If you studied the examples of using a timer, and read all the details on timers and compares in the Atmel datasheet for the processor you use, you might be able to see how to do this.
A similar question is in this thread:
http://www.mcselec.com/index2.php?option=com_forum&Itemid=59&page=viewtopic&p=41709#41709
Also with no direct answer, except a couple of suggestions from me.
You should consider that if you generate a pulse, you ( and the processor ) already know what the pulse length is, so why try to measure it with the same processor ?
If you just want to know if a pulse is there - eg if a line is connected, then that is very simple, and does not need Pulsein and Pulseout. Just drive a line high, and see if the pin connected to it is high. ( with suitable electrical connections, of course). _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Thu May 13, 2010 3:32 pm Post subject: |
|
|
Thanks Adrian
you were the man who kick started my basic understanding of Basic (bascom). A question usually carries the ???? in the mind of a programmer (here) A questioner does not know the protocol of the questioning and here is the same case with me. The story is as follows.
The PULSEOUT will trigger a solenoid at the rate of 40Ms the solenoid will break a light connection falling on a photo transistor. the solenoid is supposed to be opened in 7-10Ms. if it takes longer then the solenoid is supposed to be wear out. Here I want to measure the opening time of the solenoid. Hopefully My question has become decent Now.
Regards And thanks to Adrian for sparing Time. |
|
Back to top |
|
 |
glena
Joined: 25 Jul 2007 Posts: 284 Location: PA near Philly

|
Posted: Thu May 13, 2010 4:22 pm Post subject: |
|
|
naseerak,
If I'm understanding your question correctly then you could probably do something like the following.
Note this is not tested and may need some changes to work properly!
First, assuming a clock rate of 4MHz
Code: | dim SolinoidTripFlag as byte
dim SolinoidTripTime as word
Config Timer1 = Timer , Prescale = 8 ' This will give you 0.000002 (2us) steps.
SolinoidControl alias portx.y ' the port that controls the solinoid
SolinoidStatus alias portx.y ' the port that shows the actual status of the solinoid
Const Timeout = 20000 ' 40ms / 2us = 20000
''' The process starts here...
SolinoidTripFlag = 0 ' reset the flag
timer1 = 0 ' clear timer1
SolinoidControl= 1 ' trigger the solinoid
do
if SolinoidTripFlag = 0 and SolinoidStatus = 1 then
SolinoidTripTime = timer1
SolinoidTripFlag = 1
endif
while timer1 < TimeOut ' wait until we hit the 40ms mark...
SolinoidControl = 0 ' trigger the solinoid
if SolinoidTripFlag = 1 then
SolinoidTripTime= SolinoidTripTime * 2
else
' !!! it never tripped!!!
endif
' now SolinoidTripTime has the number of us it took to trip. |
I hope this helps!
-Glen _________________ http://bahbots.com
Last edited by glena on Fri May 21, 2010 2:41 am; edited 1 time in total |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Fri May 14, 2010 10:56 am Post subject: |
|
|
Thanks Glena
I am trying to understand your code and will give it a try. |
|
Back to top |
|
 |
glena
Joined: 25 Jul 2007 Posts: 284 Location: PA near Philly

|
Posted: Mon May 17, 2010 4:09 pm Post subject: |
|
|
naseerak,
I was just looking at my code again and noticed an error.
In the do loop the lines with:
SolinoidStatusFlag =
should be:
SolinoidTripFlag =
Also note that you need to setup the status port as in input port and the solinoid control port as output.
I hope this helps.
-Glen _________________ http://bahbots.com |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Tue May 18, 2010 7:48 pm Post subject: |
|
|
Thanks to every body helping here.
I have omitted the pulseout and doing like this but the resulting pulse is 250ms long while looking on a tektronics 100mhz dso.
Pulsein Pulse , Pinb , 1 , 1
If Seconds > 0 Then
T = Seconds ' to latch the result on the LCD
End If
If Enter = 1 Then
Set Portc.0
Start Timer1
End If
If Count = 20000 Then
Stop Timer1
Reset Portc.0
Timer1 = 0
Count = 0
Enter = 0
End If
I am using count as a variable to show the result on the LCD.
the pulse is supposed to be 40ms as glena calculated earlier. |
|
Back to top |
|
 |
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland

|
Posted: Tue May 18, 2010 10:59 pm Post subject: |
|
|
The line
Timeout alias 20000
should be changed to
Const Timeout = 20000
Assuming you still use the name Timeout in your code.
Also have you set the fuses on the processor you use to run at 4 Mhz ?
It really helps to show all of your code, including the $regfile and other directives at the top of your code, so we know exactly how you have the processor and compiler set up. _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Wed May 19, 2010 2:16 pm Post subject: |
|
|
$regfile = "m32def.dat"
$crystal = 4000000
$baud = 19200
$hwstack = 128
$swstack = 24
$framesize = 128
Locate 1 , 1
Lcd " TIME = " ; T
Const Timeout = 20000 = Here I am using directly the 20000 figure so I think I dont need the any alies. |
|
Back to top |
|
 |
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland

|
Posted: Wed May 19, 2010 10:53 pm Post subject: |
|
|
Ok, so you have told the compiler that you run at 4 MHz, with the $crystal statement. And your timer count of 20000 is set up based on that too.
But have you set the fuses on the processor to actually run at that speed ? By default, the processor will run on the internal clock at 1 MHz, unless you set it otherwise. This may well be the source of the timing error you see. _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
 |
naseerak
Joined: 08 Nov 2008 Posts: 138

|
Posted: Thu May 20, 2010 7:45 am Post subject: |
|
|
Ok
My Fuses are
L=FD, H=DF |
|
Back to top |
|
 |
glena
Joined: 25 Jul 2007 Posts: 284 Location: PA near Philly

|
Posted: Thu May 20, 2010 3:26 pm Post subject: |
|
|
naseerak,
Do you have a DSO or someway to measure the pulse that is being sent out in order to confirm its 40ms long or to make sure your getting a pulse at all? If you are and its 40ms then your probably setup correctly with the fuse bits. If not then there is an issue with ether the fuse bits or the code is wrong.
-Glen _________________ http://bahbots.com
Last edited by glena on Fri May 21, 2010 2:37 am; edited 1 time in total |
|
Back to top |
|
 |
AdrianJ
Joined: 16 Jan 2006 Posts: 2483 Location: Queensland

|
Posted: Thu May 20, 2010 11:31 pm Post subject: |
|
|
I agree with glena, there must be something wrong. My approach when debugging timing issues is first to write some really simple program and see if the timing is what I expect. Can be *really* simple:
Code: |
$crystal = 4000000
config portx.y=output
do
set portx.y
waitms 1
reset portx.y
waitms 1
loop
|
Should output a 1msec high and low on the line. If its out by more than a few uSec, your fuses are wrong, or the crystal is not what you think it is. _________________ Adrian Jansen
Computer language is a framework for creativity |
|
Back to top |
|
 |
|