قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 15-05-2013, 12:11 AM المشاركة 25   
افتراضي



مشكور اخي حيدر ممكن نعرض القيم على LCD ياليت تعملها حتى نشاهد نتائج،، حقيقتا لم افهم الفكرة ياليت ترفع الديزايين كامل

اعلانات

ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 25-05-2013, 02:23 PM المشاركة 26   
افتراضي


السلام عليكم
حاولت اعمل نفس كود الاخ محمد لكن مايعطي قراءات شاهد الصورة



وهذا الكود

كود:
void interrupt () {
unsigned int ov_cnt=0;
if (TMR1IF) //if timer1 overflow
 { PIR1.TMR1IF = 0; //clear overflow
 ov_cnt=ov_cnt+1;	//add 1 to ov_cnt
 } }




unsigned int temp1,temp2,ov_cnt=0;
unsigned long period;
float freq1,freq2,freq3,freq4,freq5;
 
void main() {
Trisb.f0=1;
Trisc.f2=1;

UART1_Init(9615);
CCP1CON=0b000000101;

while (1) {
if (!RB0){
delay_ms(50);

ov_cnt=0;
INTCON.GIE=0;
PIR1.TMR1IF=0;
PIE1.CCP1IE=0;
PIR1.CCP1IF=0;
TMR1L=0;
TMR1H=0;
T1CON=0b00000101;

while(CCP1IF==0);
temp1= ((unsigned int)CCPR1H << 8) | CCPR1L;
PIR1.CCP1IF=0;
PIR1.TMR1IF=0;
INTCON = 0xC0;
PIE1.TMR1IE=1;
while(CCP1IF==0);
temp2= ((unsigned int)CCPR1H << 8) | CCPR1L;
INTCON.GIE=0;
T1CON.TMR1ON=0;

period= ov_cnt*65536 + temp2 - temp1;

freq1=period;
freq2= freq1 *250;
freq3= freq2/1000000;
freq4= freq3/1000;
freq5=1/freq4;
period= freq5;

 UART1_Write_Text("Frequency: ");
 UART1_Write(freq5);
 UART1_Write_Text(" Hz");
 UART1_Write(13);
 UART1_Write_Text("First edge: ");
 UART1_Write(temp1);
 UART1_Write(13);
 UART1_Write_Text("Second edge: ");
 UART1_Write(temp2);
 UART1_Write(13);
 UART1_Write_Text("Timer overflow happend: ");
 UART1_Write(ov_cnt);
 UART1_Write_Text(" times");
 UART1_Write(13);
}
}
}

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 26-05-2013, 10:18 PM المشاركة 27   
افتراضي


وعليكم السلام اخوي عبدالله
اعتذر عن التاخر في الرد على رسالتك الخاصة ولكن حاولت الرد بس للاسف انت معطل استقبال الرسائل من الاعضاء في المنتدى ولم استطيع الرد. اتمنى ان تراسلني عند تفعيل استقبال الرسائل, حتى ارد على رسالتك الخاصة.

وبالنسب للكود شايف خطا بسيط وان شاءالله يكون هو الحل للمشكلة
1-
كود:
void interrupt () {
unsigned int ov_cnt=0;
if (TMR1IF) //if timer1 overflow
 { PIR1.TMR1IF = 0; //clear overflow
 ov_cnt=ov_cnt+1;	//add 1 to ov_cnt
 } }
المفروض مانصفر ونعرف ال ov_cnt داخل دالة المقاطعة, لانه لو نراجع الكود نلاحظ انه كل مره تتفعل المقاطعة يتصفر ال ov_cnt ويزيد بمقدار واحد.
فنعدل داله المقاطعة كالتالي:
كود:
void interrupt () {

if (TMR1IF) //if timer1 overflow
 { PIR1.TMR1IF = 0; //clear overflow
 ov_cnt=ov_cnt+1;	//add 1 to ov_cnt
 } }
والمتغير ov_cnt عرفته في البدايه مع ال global variables
كود:
unsigned int temp1,temp2,ov_cnt=0;
unsigned long period;
float freq1,freq2,freq3,freq4,freq5;
:
:
فما نحتاج نعرفه ثاني داخل داله المقاطعة لانه جميع الدوال(functions) في الكود تتعرف على ال global variables


ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 27-05-2013, 02:34 AM المشاركة 28   
افتراضي


بارك الله فيك اخي محمد وجزاك الله خير
غريبة اخي ايميلي الخاص مفعل وفعلت مرة اخرى حاول تجرب وتعطيني خبر.
اما بالنسبة لما قلت اننا نخرج المتغير خارج المقاطعة هذا صحيح وعملت ذالك لكن نفس المشكلة لايظهر شئ!! يطلع عندي في virtual terminal رموز غريبة بدل الارقام مثل اللي بالصورة !!


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 27-05-2013, 07:46 AM المشاركة 29   
افتراضي


لازالت مشكلة البريد الخاص موجودة. هذه الرساله الي تظهر عند محاولة الارسال:
ennng إختار عدم تلقي الرسائل الخاصة أو لا يسمح بتلقي الرسائل الخاصة. لذلك لن تتمكن من إرسال الرسالة اليه.

بالنسبة للكود اتوقع مشكلة الرموز الغريبة سببها عدم توافق سرعة النقل (baud rate) في الكود وفي virtual terminal. فمثلاً سرعة النقل في الكود 9615
كود:
UART1_Init(9615);
فلازم نخلي سرعة ال baud rate في ال virtual terminal نفس هذه القيمة.
اضغط على بلوك ال virtual terminal وضع نفس القيمة في خانة ال virtual baud .rate وانا افضل ان توضع قيمة ال baud rate من القيم القياسية مثل: 9600 او 19200 او اي قيمة متعارف عليها, لانه في البروتس تختار ال virtual buad rate من قائمة منسدلة قيها القيم القياسية المتعارف عليها.


ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 27-05-2013, 03:16 PM المشاركة 30   
افتراضي


ماقصرت اخي محمد لقد انحرجت منك كثير بارك الله فيك
عملت نفس الشئ اللي قلت عليه وهو تغير baud rate لكن نفس المشكلة حاولت كثير كثير لاشي غيرت المتحكم لاشي هل يكون هناك مشكلة في الكود لم ننتبه لها !! او مشكلة في برنامج المحاكاة ياليت احد الاخوة يجرب الكود ويشوف . بارك الله في الجميع


Mohammedalharbi
:: مهندس متواجد ::
تاريخ التسجيل: Dec 2012
المشاركات: 58
نشاط [ Mohammedalharbi ]
قوة السمعة:
قديم 28-05-2013, 08:15 AM المشاركة 31   
افتراضي


ماقصرت اخي محمد لقد انحرجت منك كثير بارك الله فيك
عملت نفس الشئ اللي قلت عليه وهو تغير baud rate لكن نفس المشكلة حاولت كثير كثير لاشي غيرت المتحكم لاشي هل يكون هناك مشكلة في الكود لم ننتبه لها !! او مشكلة في برنامج المحاكاة ياليت احد الاخوة يجرب الكود ويشوف . بارك الله في الجميع
ابد يااخي ماسويت شي,جميعنا هنا لنتعلم ونفيد بعض.
مشكلة غريبة, راجعت الكود وتقريبا نفس فكرة الكود الي عندي. ممكن تكون المشكلة في دالة ال UART انها ماتعرض ارقام float(او اكبر من 8 بت)؟؟ للاسف انا مااعرف استخدم مايكروسي وان شاءالله احد يقدر يفيدنا في حل المشكلة. شوف هذا الكود لشخص يريد عرض ارقام float ويرسلها على uart باستخدام مايكروسي ممكن يفيدنا:
كود:
double voltage=3.47;
 float temp=153.2;
 char s1[4],s2[10];
 int i;
 uart1_init(4800);

 UART1_Write_Text("STX");

 floattostr(voltage,s1);

 for (i=0;i<strlen(s1);i++)
     usart1_write(s1[i]);
 floattostr(temp,s2);
 for (i=0;i<strlen(s2);i++)
     usart1_write(s2[i]);
 UART1_Write_Text("ETX");
وهنا المصدر: http://www.mikroe.com/forum/viewtopic.php?f=88&t=24939

ايضا حاول تسوي تجربة اخيرة اخي عبدالله, جرب قياس ترددات عالية (مثلاً 100khz) وشوف هل تظهر نتيجة مقنعة. النقطة الثانية, هل انت مستخدم كريستالة داخلية 16 ميجا هرتز؟ لان التحويل في الجزئية التالية:
كود:
freq1=period; 
freq2= freq1 *250;
 freq3= freq2/1000000; 
freq4= freq3/1000; 
freq5=1/freq4; 
period= freq5
;
يعتمد على كريستالة 16 ميجاهرتز. وعند استخدام كريستاله مختلفه نحتاج نعدل في الحسابات. ان شاءالله نوصل لنتيجة.


ennng
:: مهندس متميز ::
تاريخ التسجيل: Jul 2010
المشاركات: 453
نشاط [ ennng ]
قوة السمعة:
قديم 28-05-2013, 12:22 PM المشاركة 32   
افتراضي


الله يكرمك اخي محمد
استخدمت فكرة floattostr لكن مانفعت
بالنسبة للكرستالة استخدمت 16 ميغا لكن خارجية واستخدمت وحدة داخلية 16 لكن نفس المشكلة.
جربت قياس ترددات عالية 100khz-200khz لكن لايظهر شئ!!



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:31 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)