View previous topic :: View next topic |
Author |
Message |
trento
Joined: 14 Oct 2005 Posts: 26
|
voltage and delay problem |
Posted: Sun Oct 23, 2005 2:01 am |
|
|
HI Dear all
I work with 16F877 PIC .My problem is when I programed the PIC to give 8 square wave signals at frequency 50HZ with different delay between each others .when I checked by oscilloscope the frequency and delay ware not as I programed and the peak voltage was 2.5 volt so please tell me what is the problem .
regardes
[/code] |
|
|
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Sun Oct 23, 2005 2:38 am |
|
|
Do you have anything connected to the pin? How much current are you sinking fom the pin? There might be something holding the line down, like a relatively small resistance connected between the pin and ground. The resistance could be a solder bridge. |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Sun Oct 23, 2005 3:00 am |
|
|
thank u for replay . there is nothing conected with bin i just measure directly from the bin by the oscilloscope and waht about the wrong on the frequency i use delay function and use delay with speed 20000000 |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1635 Location: Perth, Australia
|
|
Posted: Sun Oct 23, 2005 3:14 am |
|
|
Anonymous wrote: | thank u for replay . there is nothing conected with bin i just measure directly from the bin by the oscilloscope and waht about the wrong on the frequency i use delay function and use delay with speed 20000000 |
Post your code. If you want to get accurate waveforms you might want to setup timers instead of using the delay routines. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Sun Oct 23, 2005 3:17 am |
|
|
thank u for ur response i will send my code to you now |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Sun Oct 23, 2005 8:26 am |
|
|
[/****************************************************
* *
* COPYRIGHT (c) safoan *
* *
* codes = Chasing signal *
* *
* KIT = emBox-877 Kit ( CPU = PIC16F877A ) *
* *
* STATUS = DONE 12/09/05 *
* *
****************************************************/
#include <16F877A.h>
#FUSES HS,NOWDT,NOPROTECT,NOPUT
#USE DELAY( CLOCK=20000000 )
#byte port_a=5 /* define the address of PORTA */
#byte port_b=6 /* define the Address of PORTB */
#byte port_c=7 /* define the address of PORTC */
#byte port_d=8 /* define the address of PORTD */
static byte CONST UP_MAP[8] = { 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff };
static byte CONST DOWN_MAP[8] = { 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00 };
static byte CONST delay_v[8] = { 365,1145,998,950,950,998,1145,365 };
/***************************************
* LED wiring *
* ********** *
* 8 signals = PB0 - PB7 *
* 8 signals = PD0 - PD7 *
***************************************
* NOTE: see emBox-877 schematic *
***************************************/
main(){
char cnt,tnt;
/* long asof;*/
/* set_tris_a(0xfe); */ /* set port_a to be RA0 outputs */
set_tris_b(0); /* set port_b to be ALL outputs */
/* set_tris_c(0xbf); */ /* set port_c to be RC6 outputs */
set_tris_d(0); /* set port_d to be ALL outputs */
/* tnt = 0 ; */ /* intialize counter tnt */
port_b = 0 , /* initialize & turn off ALL PORTB outputs */
/* port_c =0; */ /* initialize & turn off ALL PORTC outputs */
port_d = 0xff; /* initialize & turn on ALL PORTD outputs */
for(;;){ /* forever loop*/
/* if(tnt == 80)
tnt = 0 ;
if (tnt % 2 == 0) */ /* multiplixer condition selector */
/* port_a = 0x01, port_c=0;
else port_c = 0x40, port_a=0;*/
DELAY_US (delay_v[0]) ;
for (cnt=0 ; cnt < 4 ; cnt++) { /* delay loop for the first H-bridge leg (positive cycle) */
port_b = UP_MAP[cnt],
/* pick value to display from array */
port_d = 0xff - UP_MAP[cnt];
if (cnt==3)
DELAY_US(3084);
else DELAY_US(delay_v[cnt]+1); } /* delay time loop for increment stage (positive cycle)*/
for( cnt=4 ; cnt < 8 ; cnt++ ){ /* delay time loop for decrement stage (positive cycle) */
port_b = UP_MAP[cnt] ,
port_d = 0xff - UP_MAP[cnt];
DELAY_US ( delay_v[cnt] ) ; }
/* if(tnt == 80)
tnt = 0 ;
if ( tnt % 2 == 0 )
port_c = 0x40 ,
port_a = 0x01 ;
else port_c = 0 ,
port_a = 0 ;
tnt++ ;*/
DELAY_US( delay_v[7] );
for (cnt=0 ; cnt < 4 ; cnt++) { /* delay time loop for increment stage (negative cycle) */
port_b = DOWN_MAP[cnt] ,
port_d = 0xff - DOWN_MAP[cnt];
if (cnt==3)
DELAY_US(3084);
else DELAY_US(delay_v[cnt+1]);}
for (cnt=4 ;cnt < 8; cnt++){ /* delay time loop for decrement stage(negative cycle) */
port_b = DOWN_MAP[cnt],
port_d = 0xff - DOWN_MAP[cnt];
DELAY_US( delay_v[cnt] );
}
}
}
][/code] |
|
|
Ttelmah Guest
|
|
Posted: Sun Oct 23, 2005 10:37 am |
|
|
First, when you post code, use the 'code' button, otherwise it is almost unreadable to us.
Second remove 'remmed' out lines which also make the program flow almost unreadable.
Comments though, on the glaring faults. A _variable_ used in a delay statement can only be an integer. Hence 255 max.
Even if this was not the case, you are trying to store values over 255, into an integer variable.
Your delays will be completely screwed.
On the 2.5v question, double check that your scope is set to the range you think it is, and try a simple test, just toggle a line high/low, with no other code. Also note that you should be disabling the peripherals that exist on some of the IO pins being used, or may get unexpected results. Look at the typical initialisations used on code posted, or use the wizard (which will generate some unecessary initialisation, it will show the sort of extras needed.
Best Wishes |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Sun Oct 23, 2005 3:52 pm |
|
|
Quote: | Even if this was not the case, you are trying to store values over 255, into an integer variable. |
To further explain, both a byte and and int are unsigned 8 bit variables for CCS. You would have to use int16 or long to hold a 16bit variable. The delay statements only allow constants for 16 bit numbers. Even though your arrays are constants, accessing them and using that value for the delay is not allowed. |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Mon Oct 24, 2005 12:01 am |
|
|
when i cahange the defination of matrix also there is no cahnge I put long and int16b even float there is no change |
|
|
Ttelmah Guest
|
|
Posted: Mon Oct 24, 2005 2:24 am |
|
|
trento wrote: | when i cahange the defination of matrix also there is no cahnge I put long and int16b even float there is no change |
There won't be.
You are still missing part of the 'point'. The 'delay' functions, _only_ accept int8 values, when handed a value from a 'variable'. Though the contents of your matrix are themselves filled with constants, by passing these through an array, you are using a variable. You are still trying to use a value that the function does not support.
Given you only have a limited number of values to select, you can use this approach instead:
Code: |
switch (cnt) {
case 0:
delay_us(366);
break;
case 1:
delay_us(1146);
break;
case 2:
delay_us(999);
break;
case 3:
delay_us(951);
break;
case 4:
delay_us(951);
break;
case 5:
delay_us(999);
break;
case 6:
delay_us(1146);
break;
case 6:
delay_us(366);
break;
}
|
Now I have added one to each delay value (which is what you are doing in this line):
DELAY_US(delay_v[cnt]+1);
This will actually be faster than getting the value from the array, and then incrementing this anyway.
However you also need to be aware that operations take time, and that there will be quite a few clock cycles added to the timings, whichever approach you use.
Best Wishes |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Mon Oct 24, 2005 4:00 am |
|
|
thank you so much for your care I tried your suggestion it work properly .
But I want to use the matrix because I want to store groupe of delay
angle sets.Depending on the feedback ,one of the sets will excute I do
single phase induction motor control using PIC this programe just one
set of angle from my program please tell how I can do it .
regards. |
|
|
Ttelmah Guest
|
|
Posted: Mon Oct 24, 2005 6:55 am |
|
|
Write your own delay function that accepts a larger variable. You don't say how fast the processor is running, which will affect both the accuracy, and limitations on this. You could also consider using the CCP, to give a much more accurate result. If you run timer2, so it has the longest period you require, then you can program the CCP, to the period you require, clear it's interrupt flag, and just 'poll' this till it changes, to get accurate timings.
Best Wishes |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Mon Oct 24, 2005 6:56 am |
|
|
How accurate do the delays need to be?
You will most likely need to write you own delay routines or wrap the built in delay routine inside your own function. You could put a delay_us(256) inside a for loop and execute it multiple times. Each time subtracting 256 from your delay value until the value is less than 256 and then call one final delay with the result. Keep in mind that loops and conditional tests take time so you can adjust for this by delaying less than 256 to compensate for the added overhead of the loop. |
|
|
trento
Joined: 14 Oct 2005 Posts: 26
|
|
Posted: Mon Oct 24, 2005 9:12 am |
|
|
Thank u so much it was very good hints thank you for your help |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 24, 2005 9:24 am |
|
|
Quote: | You could put a delay_us(256) inside a for loop and execute it multiple
times. Each time subtracting 256 from your delay value until the value is
less than 256 and then call one final delay with the result. Keep in mind
that loops and conditional tests take time so you can adjust for this by
delaying less than 256 to compensate for the added overhead of the loop. | http://www.ccsinfo.com/forum/viewtopic.php?t=16656&highlight=longdelayus |
|
|
|