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

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

خالد راشد
:: مهندس ::
تاريخ التسجيل: Jan 2018
المشاركات: 9
نشاط [ خالد راشد ]
قوة السمعة:0
قديم 19-03-2018, 10:25 PM المشاركة 1   
افتراضي مشكلة في التايمر Twitter FaceBook Google+



السلام عليكم
عملت ساعة رقمية بواسطة بيك 16F84 والمشكة انها تتأخر تقريبا بدقيقتين او تلات في كل ساعة
وجزاكم الله خير الجزاء
كود:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB2_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;  

char  s1,s2,m1,m2, h1,h2,j,p,t;

void affichage2(){
if(j==1)Lcd_Out(1, 12, "Lun");
if(j==2)Lcd_Out(1, 12, "Mar");
if(j==3)Lcd_Out(1, 12, "Mer");
if(j==4)Lcd_Out(1, 12, "Jeu");
if(j==5)Lcd_Out(1, 12, "Ven");
if(j==6)Lcd_Out(1, 12, "Sam");
if(j==7)Lcd_Out(1, 12, "Dim");
}
                              //pic16f84 Cristal 4MHZ
 void afichage (){
  Lcd_Chr(1, 7, m1); Lcd_Chr(1, 10, s1); Lcd_Chr(1, 9, s2);Lcd_Chr(1, 8, p);
Lcd_Chr(1, 6, m2);Lcd_Chr(1, 5, p); Lcd_Chr(1, 4, h1);Lcd_Chr(1, 3, h2);}
void interrupt()
 {
if(INTCON.T0IF==1)
    { t++;
    if(t==125){s1++; t=0;}
    if(s1==58){s1=48;  s2++; }
    if(s2==54){s1=48;s2=48; m1++; }
    if(m1==58){s1=48;s2=48;m1=48; m2++; }
    if(m2==54){s1=48;s2=48;m1=48;m2=48; h1++; }
    if(h1==58){s1=s2=m1=m2=h1=48; h2++; }
    if(h2==50&&h1==52){s1=s2=m1=m2=h1=h2=48; j++; }
   }
   INTCON.T0IF=0;
   TMR0=125;
   }

void main() {
s1=s2=m1=m2=48; j=1;  h1=50; h2=49; p=58;
INTCON=0b10100000;
option_reg=0b00000101;

TMR0=125;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
trisb=0; portb=0; trisa=255;
for(;;){

   if(j==1)Lcd_Out(1, 12, "Lu");
if(j==2)Lcd_Out(1, 12, "Ma");
if(j==3)Lcd_Out(1, 12, "Me");
if(j==4)Lcd_Out(1, 12, "Je");
if(j==5)Lcd_Out(1, 12, "Ve");
if(j==6)Lcd_Out(1, 12, "Sa");
if(j==7)Lcd_Out(1, 12, "Di");

 Lcd_Out(2, 5, "REDOUAN");
  if(porta.RA0==0){ m1++;delay_ms(300);}
  if(porta.RA1==0){h1++;delay_ms(300);}

  //Lcd_Out(2, 2, "ALARM");
  afichage ();
  //affichage2();

}


}

اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 20-03-2018, 05:22 AM المشاركة 2   
افتراضي


انت لم تستخدم خاصية المقاطعة للتايمر المستخدم
نصيحة إضافية فى مثل هذه الحالات لا تستخدم If ولكن استخدم switch لسببين
1-إن تحقق الشرط الأول لا داعى لمقارنة باقى الشروط فهى لن تتحقق
2- أسرع فى التنفيذ

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

محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 21-03-2018, 10:28 AM المشاركة 3   
افتراضي


السلام عليكم
عملت ساعة رقمية بواسطة بيك 16F84 والمشكة انها تتأخر تقريبا بدقيقتين او تلات في كل ساعة
وجزاكم الله خير الجزاء
السلام عليكم
أخي الكريم القيم التي أسندتها لكل من option_reg و TMR0 غير مناسبة لمشروعك.
جرب هذا الكود المعدل (مع ملاحظة أن المتغير t لم يعد من نوع char بل تغير إلى نوع unsigned int ليتحمل العد إلى 1000) :
كود:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB2_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;  

unsigned int t ;
char  s1,s2,m1,m2, h1,h2,p,j;

void affichage2(){
if(j==1)Lcd_Out(1, 12, "Lu");
if(j==2)Lcd_Out(1, 12, "Ma");
if(j==3)Lcd_Out(1, 12, "Me");
if(j==4)Lcd_Out(1, 12, "Je");
if(j==5)Lcd_Out(1, 12, "Ve");
if(j==6)Lcd_Out(1, 12, "Sa");
if(j==7)Lcd_Out(1, 12, "Di");
}
                              //pic16f84 Cristal 4MHZ
 void afichage (){
Lcd_Chr(1, 7, m1); Lcd_Chr(1, 10, s1); Lcd_Chr(1, 9, s2);Lcd_Chr(1, 8, p);
Lcd_Chr(1, 6, m2);Lcd_Chr(1, 5, p); Lcd_Chr(1, 4, h1);Lcd_Chr(1, 3, h2);}
void interrupt()
 {
if(INTCON.T0IF==1)
    INTCON.T0IF=0;
    TMR0=6;
    t++;
    {
    if(t==1000){s1++; t=0;}
    if(s1==58){s1=48;  s2++;}
    if(s2==54){s1=48;s2=48; m1++;}  
    if(m1==58){s1=48;s2=48;m1=48; m2++; }
    if(m2==54){s1=48;s2=48;m1=48;m2=48; h1++; }  
    if(h1==58){s1=s2=m1=m2=h1=48; h2++; }
    if(h2==50&&h1==52){s1=s2=m1=m2=h1=h2=48; j++; }
   }

   }

void main() {
s1=s2=m1=m2=48; j=1;  h1=50; h2=49; p=58;
INTCON   =   0b10100000;
option_reg = 0b10000001;
TMR0=6;
trisb=0; portb=0; trisa=255;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2, 5,"REDOUAN");

for(;;)
{
if(porta.RA0==0){ m1++;delay_ms(300);}
if(porta.RA1==0){h1++;delay_ms(300);}
afichage();
affichage2();
}

}


خالد راشد
:: مهندس ::
تاريخ التسجيل: Jan 2018
المشاركات: 9
نشاط [ خالد راشد ]
قوة السمعة:0
قديم 29-03-2018, 07:59 PM المشاركة 4   
افتراضي


السلام عليكم
لقد قمت اخي الياس بتغيير القيم option reg tmr0 التي اعطيتني اياها وشحنت بها البيك والنتيجة هي نفسها ياخير في الوقت لان القيم التي اعتمدت عليها من قبل ايضا مضبوطة ادا قسمت التردد على اربعة وعلى البريسكيلر الى اخره تحصل على تانية مضبوطة ولكن المشكل قائم,
احاول ان استعمل السويتش بدل اف كما افادنا الاخ ماجد وسننظر
وشكرا


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 30-03-2018, 06:05 AM المشاركة 5   
افتراضي


السلام عليكم
لقد قمت اخي الياس بتغيير القيم option reg tmr0 التي اعطيتني اياها وشحنت بها البيك والنتيجة هي نفسها ياخير في الوقت لان القيم التي اعتمدت عليها من قبل ايضا مضبوطة ادا قسمت التردد على اربعة وعلى البريسكيلر الى اخره تحصل على تانية مضبوطة ولكن المشكل قائم,
احاول ان استعمل السويتش بدل اف كما افادنا الاخ ماجد وسننظر
وشكرا
الأهم هو استخدام المقاطعة لأنها لا تدخل زمن باقى الأوامر فى حساب الوقت


محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 30-03-2018, 11:12 AM المشاركة 6   
افتراضي


السلام عليكم
لقد قمت اخي الياس بتغيير القيم option reg tmr0 التي اعطيتني اياها وشحنت بها البيك والنتيجة هي نفسها ياخير في الوقت لان القيم التي اعتمدت عليها من قبل ايضا مضبوطة ادا قسمت التردد على اربعة وعلى البريسكيلر الى اخره تحصل على تانية مضبوطة ولكن المشكل قائم,
احاول ان استعمل السويتش بدل اف كما افادنا الاخ ماجد وسننظر
وشكرا
السلام عليكم
أخي الكريم.
1- ليس فقط تغيير قيم option reg و tmr0 بل أيضا قيمة المتغير الذي سميته أنت t .
هكذا:
t=1000
في السطر:
كود:
if(t==1000){s1++; t=0;}
;option_reg = 0b10000001
;TMR0=6
2- القيم التي ذكرت أنك اخترتها لا يمكن أن تعطي 1 تانية.
فلو ممكن تذكر لنا قيمة البريسكيلر التي اخترتها و معادلة حساب مقاطعة التايمر 0 التي استخدمتها حتى يتضح أين الخطأ.
3- كنت أريد اقتراح كود التحربة بالتايمر 1 فهو أفضل دقة من التايمر0 لكن Pic16F84 لا يتوفر عليه.
4- هذا موضوع فيه شروحات وأمثلة عن:
استخدام التايمر 0 والتايمر 1
وطريقة استخدام برنامج Timer calculator الخاص بالميكروسي لتوليد كود مقاطعة التايمر بدون عناء كبير:
https://www.qariya.info/vb/showthread.php?t=219592
5- لا دخل لاستخدام if أو switch case في الدقة لكن لو تريد تتعلم استخدام السويتش فلا بأس .


التعديل الأخير تم بواسطة : محمد إلياس بتاريخ 30-03-2018 الساعة 11:51 AM

خالد راشد
:: مهندس ::
تاريخ التسجيل: Jan 2018
المشاركات: 9
نشاط [ خالد راشد ]
قوة السمعة:0
قديم 04-04-2018, 08:14 PM المشاركة 7   
افتراضي


السلام عليكم
اعتدر كان هناك خطا في الكود الاول في tmr0 ليس125 بل الصحيح هو131 ومع دلك مازال المشكل قائم , وهدا ما جعلني اشك في جودة الكوارتز المستعمل, ما رأيكم بارك الله فيكم؟


محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 04-04-2018, 10:40 PM المشاركة 8   
افتراضي


السلام عليكم
اعتدر كان هناك خطا في الكود الاول في tmr0 ليس125 بل الصحيح هو131 ومع دلك مازال المشكل قائم , وهدا ما جعلني اشك في جودة الكوارتز المستعمل, ما رأيكم بارك الله فيكم؟
السلام عليكم
1- متفق معك أخي على أن قيمة الكوارتز قد لا تكون مضبوطة 100% على 4 ميغاهرتز مما يفسر عدم الدقة حتى مع ضبط قيم المقاطعة.
احتمال آخر: ربما تكون المكثفات مع الكريستالة غير مختارة حسب المطلوب في الداتا شيت :

تأكد منها وحاول تقوم بتعديلات طفيفة على قيمها أو حتى تستبدل أحدها بمكثف متغير 60 بيكو فراد ..
ويبقى الافضل هو استخدام دارة RTC مثل دارة بالمتكاملة DS1307 وما معها من كوارتز وبطارية وغير ذلك .
2- نعم 131 هي القيمة المتوافقة مع قيمة option reg i
هذه معادلة حساب زمن نبضة مقاطعة التايمر0:
ومعها تطبيق على قيم الكود :





التعديل الأخير تم بواسطة : محمد إلياس بتاريخ 04-04-2018 الساعة 11:03 PM
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025