منتديات الالكترونيات العصريه  
yoursite.com page title .

استرجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
العودة   منتديات الالكترونيات العصريه > منتدى الحاكمات الدقيقة Microcontroller > منتدى المتحكمات ميكرو بلغة السي MikroC

  #11  
قديم 12-19-2010, 09:54 AM
geniusse01 geniusse01 غير متواجد حالياً
عضو نشيط
 
تاريخ التسجيل: Jul 2009
المشاركات: 59
معدل تقييم المستوى: 8
geniusse01 will become famous soon enough
افتراضي رد: استفسارات في برمجة ال pic

اقتباس:
المشاركة الأصلية كتبت بواسطة ورشة محمود الفنية مشاهدة المشاركة
اشكرك يااخي كل شي وارد
ولو اثقلت عليك
كيف سيكون شكل البرنامج ارجو ان تكتبه ولو بشكل مختصر
مع العلم ان المسنن هو مستمر بالدوران مادام المثقاب يدور اي ان دوران المسنن هو تحصيل حاصل

السلام عليكم

ان شاء الله ساحاول كتابة البرنامج في اسرع وقت ممكن وارفقه هنا ان شاء الله ..ساحاول ان لا اتاخر عليك..امنحني الوقت حتى اجهزه ..ارجو لك التوفيق..
رد مع اقتباس
  #12  
قديم 12-19-2010, 05:03 PM
ورشة محمود الفنية ورشة محمود الفنية غير متواجد حالياً
عضو جديد
 
تاريخ التسجيل: Dec 2010
المشاركات: 8
معدل تقييم المستوى: 0
ورشة محمود الفنية is on a distinguished road
افتراضي رد: استفسارات في برمجة ال pic

اكون شاكرا لك
والان خلال هذه الفترة اطلعكم على برنامج لشخص اجنبي يدعي انه انجزه
وهو برنامج مشابهة للذي نحن بصدده وارجو من الاساتذة في المنتدى ان يشرحو
ولو بعض الفقرات في البرنامج
طبعا هو يقول انه استخدمPIC30F6014A في برنامجه
والدائرة التي انجزها توزع الاشارة الى اربع وحدات للقدح
وهذا الموقع له لمن يريد ان يرى الشروع الاصلي
http://www.kolumbus.fi/juha.niinikos...P_ignition.htm
وهذا الكود الذي تكلمت عنه
// Suzuki COP / DIS ignition
// Juha Niinikoski, OH2NLT 26.03.2009
//
//
// Microchip MPLAB + C30 compiler
// MCU dsPIC30F6014A
//
// General info


// processor & board header
#include <string.h>
#include <stdio.h>

#include "cop_ignition.h" // board & processor specific definitions
#include "uart1.h" // UART functions
#include "uart2.h"
#include "adc12.h" // ADC functions
#include "timers_pwm.h" // timers & PWM system


// processor config
//_FOSC(CSW_FSCM_OFF & XT); // 7,3728MHz XT, 7,3728MHz clock = 1,8432MHz cycle

//_FOSC(CSW_FSCM_OFF & XT_PLL4); // 7,3728MHz XT, 29,4912MHz clock = 7,3728MHz cycle

_FOSC(CSW_FSCM_OFF & XT_PLL8); // 14,7456MHz cycle

//_FOSC(CSW_FSCM_OFF & XT_PLL16); // 29,4912MHz cycle = 33,9ns

_FWDT(WDT_OFF); //Turn off the Watch-Dog Timer.
_FBORPOR(MCLR_EN & PWRT_64 & BORV_20); //Enable MCLR, power on timer, brown out 2V
//_FGS(GEN_PROT); //Disable Code Protection, old compiler
_FBS(CODE_PROT_OFF);
_FSS(CODE_PROT_OFF);
_FGS(CODE_PROT_OFF);


// version info
const char ver[] = {"v0.00 "}; // software version information, displayed at startup
const char date[] = {"30.08.2009"}; // version date


unsigned char pbuf[100]; // sprintf buffer

// spark variables
unsigned int pulse_duration; // one cranc sensor pulse duration(us)

unsigned int target_dwell; // calculated target dwell(us), max = 65536 = 65ms


// sparc engine variables

// these are set values
extern volatile int advance_teeth; // ignition advance set value, # of teeth
extern volatile int dwell_teeth; // dwell set value, # of teeth

// do not touch
extern volatile int coil_1_start; // start loading pulse count
extern volatile int coil_2_start;
extern volatile int coil_3_start;
extern volatile int coil_4_start;

extern volatile int coil_1_ignite; // ignite pulse count
extern volatile int coil_2_ignite;
extern volatile int coil_3_ignite;
extern volatile int coil_4_ignite;

extern volatile int coil_saver; // coil saver timer set value(ms)

extern volatile unsigned int cranc_pulse_duration; // one cranc sensor pulse duration(TMR4 units, 542ns/bit)

// tacho test
#define TACHO_STEP_TIME 500 // time to show one step
const unsigned char tacho_steps[6] = {30, 15, 10, 7, 6, 5}; // 1000 ... 6000 RPM
extern int tacho_test; // flag for tacho test
extern unsigned char tacho_test_val; // test value(ms)


// data logger test
int log_rpm;
int log_kpa;
int log_adv;

unsigned long cam_pulses; // cam sensor test
unsigned long cranc_ctr; // cranc pulses / 400 counter

// scaled analog measurement values
int map; // scaled Map (kPa)
int batt; // mattery voltage (100mV units)

// raw ADC values
int raw_map;
int raw_batt;
int aux;

// Diag & datalog
extern volatile int cam_sensor_diag; // cranc pulses saved when we get CAM trigger
extern int cam_sensor_diag_ready; // diag data available

int last_cam_sensor_cycle; // last measured cam sensor cycle cranc pulses
int high_cam_sensor_cycle; // highest
int low_cam_sensor_cycle; // lowest

extern int datalog_pulses; // Cylinder #x pulses after CAM trigger
extern int datalog_pulses_ready; // datalog data available

int print_on; // print on/off flag

// helper routines

void measure_analog_values(void)
{
int temp;
temp = convert_adc12(MAP_CH);
sprintf(pbuf, "\n\rMAP ADC = %d, MAP = %dhPa, MAP = %dkPa", temp, scale_map_hpa(temp), scale_map_kpa(temp));
putst2(pbuf);

temp = convert_adc12(BATT_CH);
sprintf(pbuf, "\n\rBatt ADC = %d, Voltage = %dV", temp, scale_batt_v(temp));
putst2(pbuf);

temp = convert_adc12(AUX_CH);
sprintf(pbuf, "\n\rAUX ADC = %d", temp);
putst2(pbuf);
}


void tacho_gauge_test(void)
{
int x;

tacho_test_val = tacho_steps[0]; // set first step before test start
tacho_test = 1; // start test
for(x=0; x<sizeof(tacho_steps); x++)
{
tacho_test_val = tacho_steps[x]; // set step
ms_delay(TACHO_STEP_TIME);
}
ms_delay(TACHO_STEP_TIME);
tacho_test = 0; // end test
}


// command menu
void menu(void)
{
sprintf(pbuf, "\n\r--- Commands ---");
putst2(pbuf);

sprintf(pbuf, "\n\ri = info ");
putst2(pbuf);
sprintf(pbuf, "\n\rm = measure analog values ");
putst2(pbuf);
sprintf(pbuf, "\n\rc = clear test counters ");
putst2(pbuf);
sprintf(pbuf, "\n\rT = Tacho qauge test ");
putst2(pbuf);
sprintf(pbuf, "\n\rL = table look up test ");
putst2(pbuf);
sprintf(pbuf, "\n\r ");
putst2(pbuf);
}

// main __________________________________________________________________________________

int main(void)
{
int x, z, temp, i;
long l;
unsigned int y, w;
unsigned char c, cc;
unsigned int idx;
float f;

// set general I/O
TRISA = TRISA_INIT; //
PORTA = PORTA_INIT;

TRISB = TRISB_INIT; //
PORTB = PORTB_INIT;

TRISC = TRISC_INIT; //
PORTC = PORTC_INIT;

TRISD = TRISD_INIT; //
PORTD = PORTD_INIT;

TRISF = TRISF_INIT; //
PORTF = PORTF_INIT;

TRISG = TRISG_INIT; //
PORTG = PORTG_INIT;

// Start LEDs
LD1 = 1; // Red on while waiting PLL to lock
LD2 = 0;
while( _LOCK == 0); // wait for PLL to lock

// Start timers
init_timers_int_system(); // timers & interrupt system

// Init UARTs
InitUSART1(57600); //
InitUSART2(115200); // Terminal UART

// Init ADC
init_adc12();

// Say hello
sprintf(pbuf, "\n\r\n\rSuzuki COP/DIS test started");
putst2(pbuf); // terminal UART
sprintf(pbuf, "\n\rJuha Niinikoski");
putst2(pbuf); // terminal UART
putst2((unsigned char*)&ver);
putst2((unsigned char*)&date);

sprintf(pbuf, "\n\rFCY = %ld, PR3 = %d", FCY, PR3);
putst2(pbuf);

#ifdef RISING_CAM_SYNC
sprintf(pbuf, "\n\rINT3, Rising edge Cranc pulse CAM Sync configuration");
putst2(pbuf);
#endif
#ifdef FALLING_CAM_SYNC
sprintf(pbuf, "\n\rINT4, Falling edge Cranc pulse CAM Sync configuration");
putst2(pbuf);
#endif


measure_analog_values(); // print ADC values

// Set run LEDs
LD1 = 0;
LD2 = 1;

pulse_duration = 60000;
target_dwell = 5000; // 5ms

advance_teeth = 10; // some test values
dwell_teeth = 5;

// Tacho test show
// tacho_gauge_test();

high_cam_sensor_cycle = 400; // highest
low_cam_sensor_cycle = 400; // lowest


// Main forever loop
//_______________________________________________________


for(;
{
// LD1 = !SW1; // test
LD1 = CAM; // test, show CAM sensor

//sensor test
if(cam_sensor_diag_ready)
{
last_cam_sensor_cycle = cam_sensor_diag;
cam_sensor_diag_ready = 0;

if(last_cam_sensor_cycle < low_cam_sensor_cycle)
low_cam_sensor_cycle = last_cam_sensor_cycle; // new lowest valoe

if(last_cam_sensor_cycle > high_cam_sensor_cycle)
high_cam_sensor_cycle = last_cam_sensor_cycle; // new highest value
}


// do analog measurements
raw_map = convert_adc12(MAP_CH);
map = scale_map_kpa(raw_map);

raw_batt = convert_adc12(BATT_CH);
batt = scale_batt_v(raw_batt);

aux = convert_adc12(AUX_CH);

// calculate ignition parameters when tacho event ready
if(tacho_ready != 0) // wait for new tacho result
{
// LD1 = 1; // loop test

tacho_ready = 0;

advance_teeth = get_ign_adv(map, tacho); // do advance look up

target_dwell = get_dwell(batt); // do dwell look up with battery voltage

// calculate dwell
l = (long)cranc_pulse_duration * 542; // cranc pulse event(ns)

temp = ((long)target_dwell * 1000) / l; // target dwell(ns) / cranc pulse event(ns) = dwell(number of events)
if(temp < 1)
temp = 1; // at very very low engine speed coil saver take care
dwell_teeth = temp;

// LD1 = 0;
}



//_________________________________________________________
// terminal commands
if(kbhit2() != 0) // Terminal
{
c = getch2();
switch(c)
{

// system info
case 'i': // info
sprintf(pbuf, "\n\r\n\rRPM %d, MAP %d kPa, Batt %d.%d V", tacho*10, map, batt/10, batt%10);
putst2(pbuf);

temp = BASE_ADVANCE + (advance_teeth * 18); // convert to degrees
sprintf(pbuf, "\n\rAdvance = %d.%d deg, %d Teeth, Dewll = %d ", temp/10, temp%10, advance_teeth, dwell_teeth);
putst2(pbuf);

sprintf(pbuf, "\n\rCoil_1 %d, %d ",coil_1_start, coil_1_ignite );
putst2(pbuf);
sprintf(pbuf, "\n\rCoil_2 %d, %d ",coil_2_start, coil_2_ignite );
putst2(pbuf);
sprintf(pbuf, "\n\rCoil_3 %d, %d ",coil_3_start, coil_3_ignite );
putst2(pbuf);
sprintf(pbuf, "\n\rCoil_4 %d, %d ",coil_4_start, coil_4_ignite );
putst2(pbuf);

sprintf(pbuf, "\n\rCam Cycle: Current %d, Low %d, High %d ",last_cam_sensor_cycle, low_cam_sensor_cycle, high_cam_sensor_cycle);
putst2(pbuf);

sprintf(pbuf, "\n\rCAM pulses = %ld, Cranc 400 events = %ld ",cam_pulses, cranc_ctr );
putst2(pbuf);
break;

case 'm': // measure analog values
measure_analog_values();
break;


case 'c': // Clear test counters
high_cam_sensor_cycle = 400; // highest
low_cam_sensor_cycle = 400; // lowest

cam_pulses = 0; // cam sensor test
cranc_ctr = 0; // cranc pulses / 400 counter

sprintf(pbuf, "\n\r\n\rTest counters cleared");
putst2(pbuf);
break;


// online printout
case 'Q': // Quit print
sprintf(pbuf, "\n\rQuit online print");
putst2(pbuf);
print_on = 0;
break;

case 'R': // Resume print
sprintf(pbuf, "\n\rResume online print");
putst2(pbuf);
print_on = 1;
break;


case 'T': // Tacho gauge test
sprintf(pbuf, "\n\rTacho Gauge test, give rpm ");
putst2(pbuf);
x = getlong2();
f = x;

sprintf(pbuf, "\n\rx = %d, f = %f ", x, f);
putst2(pbuf);

y = 500.0 / (f / 60.0); // calculate timer value(ms*1000)

f = 60.0 * (1.0 / ((float)(y * 2) / 1000.0));

tacho_test_val = y;
tacho_test = 1;

sprintf(pbuf, "\n\rTest started, TMR %dms, RPM %f", y, f);
putst2(pbuf);

while(kbhit2() == 0) // any key interrupt test
{

}

tacho_test = 0; // end test
break;


// temporary test commands

case 'L': // table look up
sprintf(pbuf, "\n\rTable test, Give MAP ");
putst2(pbuf);
x = getlong2();
sprintf(pbuf, "\n\rGive RPM ");
putst2(pbuf);
y = getlong2();

sprintf(pbuf, "\n\rAdv %d", get_ign_adv(x, y));
putst2(pbuf);
break;

//___________
#if 0

case 'D': // set test dwell, target value(us)
sprintf(pbuf, "\n\rDewll = %d, Set new value ", target_dwell);
putst2(pbuf);
y = getlong2();
target_dwell = y;
sprintf(pbuf, "%d", target_dwell);
putst2(pbuf);
break;

case 'd': // set test dwell, teeth value
sprintf(pbuf, "\n\rDewll = %d, Set new value ", dwell_teeth);
putst2(pbuf);
y = getlong2();
dwell_teeth = y;
sprintf(pbuf, "%d", dwell_teeth);
putst2(pbuf);
break;

case 'a': // set test advance
sprintf(pbuf, "\n\rDewll = %d, Set new value ", advance_teeth);
putst2(pbuf);
y = getlong2();
advance_teeth = y;
sprintf(pbuf, "%d", advance_teeth);
putst2(pbuf);
break;


case 'c': // Calculate, no terminal I/O
sprintf(pbuf, "\n\rCalculate, no terminal I/O\n\r");
putst2(pbuf);
while(kbhit2() == 0) // any key interrupt test
{
w = target_dwell / cranc_pulse_duration; // use TMR4 542ns units
if(w == 0)
w = 1; // allways at least one pulse
dwell_teeth = w;

if(tacho_ready != 0) // wait for new tacho result
{
tacho_ready = 0;

// calculate one pulse duration
if(tacho <= 10)
pulse_duration = 60000; // limit to 60ms
else
pulse_duration = 600000 / tacho;

LD2 = !LD2;
}
}
LD2 = 1;
break;

/// test commands
case 'r': // Rev counter
sprintf(pbuf, "\n\rRev counter\n\r");
putst2(pbuf);

while(kbhit2() == 0) // any key interrupt test
{
w = target_dwell / cranc_pulse_duration; // use TMR4 542ns units
if(w == 0)
w = 1; // allways at least one pulse
dwell_teeth = w;

#if 0
coil_1_ignite = coil_1_start + w;
coil_2_ignite = coil_2_start + w;
coil_3_ignite = coil_3_start + w;
temp = coil_4_start + w; // last cylinder can overflow
if(temp < 200) // check overflow
coil_4_ignite = temp; // noemal set
else
coil_4_ignite = temp - 200; // move to next round
#endif


if(tacho_ready != 0) // wait for new tacho result
{
tacho_ready = 0;

// calculate one pulse duration
if(tacho <= 10)
pulse_duration = 60000; // limit to 60ms
else
pulse_duration = 600000 / tacho;

// print tacho data
sprintf(pbuf, "\rRPM %d, rt %ld ct %ld pulses %d ", tacho, (long)pulse_duration, (long)cranc_pulse_duration, w);
putst2(pbuf);
LD2 = !LD2;
}
}
LD2 = 1;
break;
#endif
//_________
default:
menu(); // print command list
break;
}




} // end if()

} // end for(;
} // end main
رد مع اقتباس
  #13  
قديم 12-25-2010, 09:58 PM
geniusse01 geniusse01 غير متواجد حالياً
عضو نشيط
 
تاريخ التسجيل: Jul 2009
المشاركات: 59
معدل تقييم المستوى: 8
geniusse01 will become famous soon enough
افتراضي رد: استفسارات في برمجة ال pic

السلام عليكم

احاول كتابة البرنامج لكن الى الان لم اصل الى نتيجة ..هل حاولت فيه ؟؟؟ ارجو من الاخوة ان يفيدونا ...ارجو لك التوفيق.

واخر دعوانا ان الحمدلله رب العالمين .. وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم.
رد مع اقتباس
  #14  
قديم 12-26-2010, 08:52 PM
الصورة الرمزية eng_a_sayed
eng_a_sayed eng_a_sayed غير متواجد حالياً
مشرف
 
تاريخ التسجيل: Jun 2008
الدولة: India in next Dec
المشاركات: 1,243
معدل تقييم المستوى: 22
eng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud ofeng_a_sayed has much to be proud of
افتراضي رد: استفسارات في برمجة ال pic

أخوانى الكرام ذوى أخر مشاركتين بالنسبة للبرنامج المكتوب للبيك 30F6014 فهذه البيك من نوع DSPIC وهو نوع متقدم من البيك وللأسف برنامج الميكروسى المعتاد الذى نعمل عليه لا يدعمه فهو فقط حتى 18fxxx

بالتالى لن تتمكن من كتابة البرنامج على الميكرو سى العادى

ولنكمل الموضوع ... من يعمل برنامج يمكن كتابة عليه برامج هذه الفئة فليضعه لنا لتعم الفائدة

وأن شاء الله سيكون لنا بداية مع هذه السلسلة أن شاء الله

تحياتى للجميع
__________________
رد مع اقتباس
  #15  
قديم 12-15-2016, 01:29 AM
TomCroz TomCroz غير متواجد حالياً
عضو جديد
 
تاريخ التسجيل: Dec 2016
المشاركات: 6
معدل تقييم المستوى: 0
TomCroz is on a distinguished road
افتراضي رد: استفسارات في برمجة ال pic

الف شكر لك اخي الكريم
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة



الساعة الآن 04:57 PM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
الحقوق محفوظة لمنتديات الاليكترونيات العصريه

Security team

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77