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

   

Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 120
نشاط [ Microchip2012 ]
قوة السمعة:
قديم 11-09-2011, 08:36 PM المشاركة 33   
افتراضي



شكرا على الرابط ونجح معي في المحاكي ولكنه يعمل فقط في العائلة pic16
ولكن يا أخي أنا أستخدم pic18f2455
ولم أجد option_reg في المايكروسي
وعندما بحثت وجدت أنه لا يوجد في العائلة pic18
فقط أحتاج كود بسيط وينتهي الأمر

اعلانات

robota
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: الخرطوم_السودان
المشاركات: 895
نشاط [ robota ]
قوة السمعة:
قديم 11-09-2011, 08:59 PM المشاركة 34   
افتراضي


لا تحتاج الى option_reg . لتفعيل تايمر 0 استخدم الريجستر T0CON
ولقراءة قيمة تايمر0 TMR0L اذا استخدمت 8 بيت او TMR0L+++TMR0H اذا استخدمت
16 بيت .


التعديل الأخير تم بواسطة : robota بتاريخ 11-09-2011 الساعة 09:09 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

robota
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: الخرطوم_السودان
المشاركات: 895
نشاط [ robota ]
قوة السمعة:
قديم 11-09-2011, 09:43 PM المشاركة 35   
افتراضي


ما هو تردد الكريستالة , وهل تستخدم مايكروسى ام مايكرو سى برو


Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 120
نشاط [ Microchip2012 ]
قوة السمعة:
قديم 11-09-2011, 09:56 PM المشاركة 36   
افتراضي


أخي العزيز هذا الكود حاولت كل ما أستطيع في ولم يفلح أرجو أن تصبر علي وتساعدني.
أعلم أني أزعجتك كثيرا ولكن أدعو لك بالخير أن تساعدني
كود:
int count;
unsigned char txt[64];
void interrupt()
{

     porta=255;
   // Intcon.f1=0;
}
void main(){
//UART1_Init(9600);
 trisb=255;
 portb=0;
 trisa=0;
 porta=0;
 TMR0L =0;
T0CON.f0=1;
T0CON.f1=0;
T0CON.f2=0;
T0CON.f3=1;
T0CON.f4=1;
T0CON.f5=1;
T0CON.f6=1;
T0CON.f7=1;
  while(1){
  
  }
}


robota
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: الخرطوم_السودان
المشاركات: 895
نشاط [ robota ]
قوة السمعة:
قديم 11-09-2011, 10:07 PM المشاركة 37   
افتراضي


جيد , فقط امهلنى بعض الوقت .
لكن لم تذكر نوع الكومبايلر او تردد الكريستالة .
سافترض ان الكومبايلر هو مايكروسى برو وان الكريستالة 4 ميغا هيرتز


Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 120
نشاط [ Microchip2012 ]
قوة السمعة:
قديم 11-09-2011, 10:31 PM المشاركة 38   
افتراضي


Hأنا أستخدم مايكروسي
pic18f2455
48 mhz clock


robota
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: الخرطوم_السودان
المشاركات: 895
نشاط [ robota ]
قوة السمعة:
قديم 12-09-2011, 01:56 AM المشاركة 39   
افتراضي


الحسابات :
مدى السنسور من 3 سم الى 330 سم

3 سم وهى تعادل 87 مايكرو ثانية (بالقسمة على سرعة الصوت) (ذهاب فقط)

الى

330 سم وهى تعادل تقريبا 9.6 ميلى ثانية اى 9600 ميكرو ثانية (ذهاب فقط)

لاحظ ان عرض الموجة يساوى المجموع ذهاب+اياب وبالتالى فان اقصى قيمة لعرض الموجة هى تقريبا 19200 ميكرو ثانية.

الدقة : لنفترض اننا نريد دقة 2 سم (دقة السنسور تقريبا 2 الى 3 سم ).
2 سم تعادل 58 مايكرو ثانية . و 116 ذهاب واياب

تردد الكريستالة 4 ميغا اذن دخل التايمر سيكون 1ميكروثانية (4 ميغا / 4 ) .
اذا استخدمنا تايمر 0 كــ 8 bit . بالتالى اقصى سعة هى 255 او
255 ميكرو ثانية .
وهذا الرقم اقل من اقصى قيمة مطلوبة وهى 10000 ميكروثانية . هذه المشكلة لها حلان:
1- جعل تايمر0 يعمل كــ 16 bit .
2- استخدام ما يسمى ب Prescaler.
باستخدام تايمر0 كــ 16 bit تصل اقصى قيمة الى 65535 وهو ما سنستخدمه.

يمكن استخدام الـ Prescaler ب قيمة من 4 حتى 64 . ولا يمكن ان تكون 128 فصاعدا لانها اكبر من اقصى قيمة مسموح بها --حفاظا على الدقة (2سم)—واقصى قيمة هى 116 مايكرو ثانية .

ضبط TIMER0:

T0CON.f7=1 تشغيل تايمر0
T0CON.F6=0 تايمر0 ك 8 Bit
T0CON.F5=0 تايمر 0 يعمل كـ timer not counter
T0CON.F4=X لا يهم .
T0CON.F3=1 الغاء ال Prescaler
T0CON.F(2-0)=XXX لا يهم

اذن T0CON= 0b10001000
حاليا لن نجتاج الى مقاطعة ( الا اذا كنت تريد زيادة الدقة).


خطوات الكود :

1- اجعلPORTB.B0 يعمل كخرج , ثم وارسل pulse لمدة 15 ميكروثانية .
2-اجعل PORTB.B0 دخل.
2- عندما يصبح الجهد عند (PORTB.B0) عالى High , قم بتفعيل المقاطعة الخاصة ب Timer0 حتى يبدأ العد . وانتظر حتى تعود تنتهى النبضة القادمة من السنسور (اى يكون الخرج عندPORTB.B0 م low عندها قم بايقاف تايمر0 .
الزمن الذى تستخرجه من قراءة قيمة تايمر0 هو الزمن الذى تسغرقه الموجة الفوق صوتية للوصول للهدف والعودة يكون الزمن مضاعفا اى زمن الذهاب +زمن العودة وبالتالى تحتاج الى قسمة الزمن على 2.
ويمكن ايجاد المسافة
المسافة = السرعة * الزمن ,
السرعة هنا سرعة الصوت وهى عادة 343 متر/ ثانية اى 34300 سم/ثانية .


الكود:


كود:
unsigned t0l,t0h; unsigned long dis; void main() { T0CON= 0b10001000;// 16bit,no prescaler ,timer delay_ms(500); while(1) { Dis=0; no_rel="nofollow" target=0; portb=0; TRISB.B0=1; PORTB.B0=1; Delay_us(15); PORTB.B0=0; TRISB.B0=0; while(PORTB.B0==0){}; // wait for the signal TMR0L=0; TMR0H=0 ; while(PORTB.B0==1){}; // l t0h=TMR0H; t0l=TMR0L; Dis=t0l+(t0h*256); // shift t0h 16 bits Dis=(dis*343)/2; //distance meter/us Dis=dis/10000; // distance cm/s // Lcd_Out(1,1," Dis="); // // Delay_ms(3000); } }
لا تنسىان تخبرنا بنتيجة تجربة الكود .
بالتوفيق.


التعديل الأخير تم بواسطة : robota بتاريخ 12-09-2011 الساعة 09:35 PM

Microchip2012
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2010
المشاركات: 120
نشاط [ Microchip2012 ]
قوة السمعة:
قديم 12-09-2011, 03:05 PM المشاركة 40   
افتراضي


شكرا على الكود وقمت بتجربته طبعا هي
كود:
delay(5)
وليست
كود:
delay(15)
على حسب الداتاشيت
عند استخدام 15 مايكرو ثانية لا يضاء الـled الخاص بالحساس
ولكن عند 5(حسب الداتاشيت) يضاء وهذا يعني أنه يعمل
أرى أنك قمت بتعريف متغيرين ولم تستخدمهما
كود:
unsigned t0l,t0h;
ثالثا :أخي الكريم الكود الذي وضعته صحيح وأنا متأكد من ذلك
ولكن المشكلة فيه هي الجزء الخاص بالتايمر
أشكرك على الكود مجددا
-------------------------------------------
أنا أستخدم pic18f2455
20 mhz ولكن قمت برفعها إلى mhz 48 بواسطة PLL لكي أستطيع أن أستخدم الـUSB
طبعا القيم التي أستقبلها من الـUSB هي
دائما 0 ونادرا 1 أنا أتكلم على المتغير dir


التعديل الأخير تم بواسطة : Microchip2012 بتاريخ 12-09-2011 الساعة 03:08 PM


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