بسم الله الرحمن الرحيم.
أولا معذرة على الغياب الطويل... لكنه الانشغال الشديد جدا... ياترى كنتم عاملين إيه من غيري!!
ثانيا أنصح المستخدمين بتعلم PIC18F46K22 فإمكانياته رهيبة وسعره أرخص من المتحكمات الأخرى ذات الإمكانات الأقل... فإن كنت من مصر فهو موجود عند TMT في باب اللوق بـ55 جنية فقط... وإن واجهتك مشكلة في تعلمه فأنا معك.. أرسل لي على الخاص تخبرني أنك وضعت سؤالا.
ثالثا ندخل في المشكلة.
انظرو إلى هذا الكود:
كود:
char x;
void main()
{
ANSELa=0;ANSELb=0;
ANSELc=0;ANSELd=0;
ANSELE=0;
C1ON_bit=0;C2ON_bit=0;
TMR1L=0; TMR1H=0;
T1CON=0b00010011;
trisc=0; portc=0;
trisd=0; portd=0;
delay_ms(10);
x=TMR1L;
TMR1ON_bit=0;
TMR1L=0; TMR1H=0;
portc=TMR1L; portd=TMR1H;
delay_ms(1000);
TMR1L=10; TMR1H=10;
portc=TMR1L; portd=TMR1H;
delay_ms(1000);
TMR1L=20; TMR1H=20;
portc=TMR1L; portd=TMR1H;
delay_ms(1000);
TMR1L=30; TMR1H=30;
portc=TMR1L; portd=TMR1H;
}
هذا الكود يظهر بهذا الشكل على برنامج مايكرو سي برو:
في البداية أوامر تعطيل الأنالوج.
ثم أوامر ضبط portc لأنه سيظهر عليه قيمة TMR1L وضبط portb لأنه سيظهر عليه قيمة TMR1H.
ثم ضبط وبدأ تشغيل TMR1.
ثم الأمر الذي باللون الأحمر.
ثم توقف تايمر1
ثم تغيير قيمة تايمر1 وهو متوقف وإظهار القيمة على بورت c و d.
المشكلة أن البرنامج يستجيب للأمر TMR1L=كذا (مثلاTMR1L=10)... بينما لا يستجيب للأمر TMR1H=كذا.
وجربت TMR3 ونفس المشكلة.
وأتوقع أنها ستكون نفس المشكلة مع TMR5.
لاحظ الأمر المتعلم عليه بالأحمر... وهو إجراء أي عملية حسابية على السجل TMR1L سواء بهذا الأمر أو بغيره.
مع العلم أن البرنامج يستجيب للتعليمة TMR1H=كذا لو كانت في بداية البرنامج... أما بعد المرور على تعليمة X=TMR1L فهنا المشكلة.
ولقد جربت حذف التعليمة X=TMR1L فوجدت أيضا أن البرنامج لم يستجب للأمر TMR1H=كذا... إلا أن الاختلاف أنه في الحالة الثانية تثبت قيمة TMR1H على صفر ولا تتغير مهما أمرته بالتغيير... أما في الحالة الأولى فتثبت TMR1H على قيمة أخرى لا أتذكرها.
إن كنت لم تفهم فافتح برنامج البروتس وجرب عليه البرنامج ستجد أنه يستجيب للأمر TMR1L=10 بينما لا يستجيب للأمر TMR1H=10 وانظر الفرق بين وجود التعليمة التي معلم عليها بالأحمر وبين عدم وجودها.
وجزاكم الله خيرا.