سلام عليكم
أخي كريم أنت لم تفعل تايمر0 في الكود
أذا أفترضنا ان مايكرو هو 16f628a لابد من كتابه هذا الكود (( لكي تفعل الانتربت))
intcon=0xA0
ملاحظه الثانيه في حساب مسافه هناك نسبه خطأ في قياس المسافه لانك كما تعرف هذه حساس يرجع زمن قليل لذا جعل معامل تقسيم 1/256 يعتبر امر حسب رائي خاطئ لنحسب مسافه معا
distance =time/58 ,حيث time مقاس بالمايكروثانيه لنفترض أن تايمر0 =1
distance =1*256/58=4.4cm وهذا يعني يوجد نسبه خطأ بحدود 4.4cm
تريد نصيحه أستخدم هذا برنامج حدد العائله مايكرو هل هو من عائله 16f أو 18F او....
ثم اكتب تردد كرستاله ثم حدد اي تايمر تسستخدم ثم حدد زمن الانتربت اي عنده يحدث الانتربت بعدين اضغط على calculate
راح يقوم برنامج بكتابه الكود كامل لك (( طبعا خاص بانتربت))
https://www.mediafire.com/?8c8kn7k67i68ypn
وعلى سبيل مثال لو أفترضنا اريد يحدث الانتربت كل 100us ومايكرو هو 16f628a وتردد كرستاله هو 4ميكا اذن الكود المتولد من البرنامج
كود:
//Timer0
//Prescaler 1:1; TMR0 Preload = 155; Actual Interrupt Time : 100 us
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x88;
TMR0 = 155;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 155;
//Enter your code here
}
}