לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 23-12-2008, 23:18
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
אסמבלי - ספירת יום שלם בצורה המדויקת ביותר

אני מחפש את הדרך המדויקת ביותר לבצע delay של 24 שעות.

צורת החישוב היא לא בעייתית בכלל, בתנאי שלא מתחשבים בזמן שלוקח להציב ערכים לתאים בזיכרון (שאיתם מבצעים את ה-delay).

אתן דוגמא מ-ASM-8051:
קוד:
Delay_OneDay: ACALL DL_Init ; All (except of init) MOV commands, within the DL_Init procedure, take 201.0101 sec. ; I need an extra delay of 198.9899 sec. MOV R3, #1 MOV R4, #23 ACALL DL_3 ; Takes 197.8 sec + 0.523583 sec = 198.323583 sec. MOV A, #250 MOV R5, #4 MOV R4, #1 MOV R3, #1 ACALL DL_2 ; Takes 400ms + 0.252254 sec = 0.652254 sec. RET DL_Init: MOV A, #215 ; Should be 216, but changed to 215 to be more accurate (the MOV commands take time) MOV R3, #100 DL_4: MOV R4, #100 DL_3: MOV R5, #100 DL_2: MOV R6, #200 DL_1: MOV R7, A DJNZ R7, $ ; Jump to self DJNZ R6, DL_1 DJNZ R5, DL_2 DJNZ R4, DL_3 DJNZ R3, DL_4 RET


ניסיתי לדייק כמה שיותר.

רמת הדיוק זה לא משהו שאני חייב לעשות, אבל מאוד מעניין אותי לדעת איך מבצעים זאת.

האם יש איזשהי פונקציה עם פרמטרים של:
- כמות פקודות מקוננות מיותרות (פקודות ה-MOV).
- כמות הזמן שלוקח ה-DELAY ללא התחשבות בפקודות האחרות שלוקחות זמן.
???

אני מתאר לעצמי שבמחשבים מתקדמים מבצעים זאת עם פסיקות, אבל אני מחפש בדרך הזו.

אני אישית כותב ב-ASM 8051, אבל זה לא נראה לי משנה כל עוד יש פונקציה גנרית שצריך להציב בה ערכים.

תודה רבה מראש!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 04-01-2009, 22:43
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
עידכון לגבי הזמן האמיתי ש"מבזבזות" פקודות ה-MOV
בתגובה להודעה מספר 2 שנכתבה על ידי dorM שמתחילה ב "הערה: חישובי הזמן הנ"ל לא נכונים לגבי פקודות ה-MOV"

בביצוע הפונקציה הנ"ל ששמה DL_Init יש 2 סוגים של בזבוז זמן:

1. ביזבוז זמן רצוי ומחושב מראש - זה ביזבוז הזמן שאנחנו שואפים להגיע אליו באופן אידיאלי, בלי התחשבות בפקודות אחרות הנלוות לתהליך הזה. כלומר זה מכפלת המספרים שנמצאים באוגרים R3 עד R7.
2. ביזבוז זמן נלווה - זהו ביזבוז הזמן של פקודות ה-MOV שלא חישבנו אותן בתהליך.

את ביזבוז הזמן של 1 הכי קל למצוא - מקוה שזה ברור (אם לא אז נא לכתוב ואסביר)

ביזבוז הזמן של 2 קצת קשה יותר למצוא, צריך לשבת על זה והתחיל לחשב באופן מסודר... זה קצת מבלבל.
אז ניסיתי למצוא את זה, ומצאתי נוסחאות כלליות לגבי כל תת-פרוצדורה הנמצאת בפונקציה DL_Init:

קוד:
f(DL_1) = V{R6} * T f(DL_2) = V{R5} * 2T + V{R5}*f(DL_1) f(DL_3) = V{R4} * 3T + V{R4}*f(DL_2) f(DL_4) = V{R3} * 4T + V{R3}*f(DL_3)


אנסה להסביר מה כתבתי:

קוד:
f(DL_1)

לדוגמא, זהו הזמן המבוזבז שלוקחת הפרוצדורה DL_1.

קוד:
V{R6}

לדוגמא, זהו הערך ההתחלתי שיש באוגר R6 (הערך הראשון שהוצב בו, כלומר הערך שבפקודת ה-MOV).

T זהו הזמן שלוקח לעשות cycle אחד במעבד. במקרה של המעבד שלי, לוקח לו 1 מיקרו-שניה לביצוע פקודה כמו INC A.

יש לחבר את סכום כל תוצאות הנוסחאות הנ"ל כדי לקבל את זמן הביזבוז של (2).

וזהו...
בבקשה תקנו אותי אם אני טועה, אם יש לכם את הסבלנות לזה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 25-12-2008, 22:54
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 8 שנכתבה על ידי רמי ד שמתחילה ב "אני מבין שזה מיקרוקונטרולר,..."

אה מצטער על חוסר הפירוט.

זה מיקרו בקר P89V51RD2.
יוצר ע"י חברת NXP (שהייתה בעבר "פיליפס").

תכונת הרכיב זה מחזור מכונה 1 בעבור 12 פולסי שעון... ככה הוא עובד.
עשיתי קצת קוראים, וכתוב שהוא גם תומך במחזור מכונה 1 עבור 6 מחזורי שעון.
ציטוט:
אתה רק צריך לחשב מספר שיוצא עגול (ביחס לדפיקות שלו), וכל פעם אתה סופר מהירות מסוימת, נניך 1KHz
שזה יוצא 0.001 שניות. אתה מכפיל את זה ב-1000 ומקבל שניות.
ואז אתה סופר את השניות הדקות השעות וכו...


למה הכוונה? :/

מה שרציתי מההתחלה זה איזשהי פונקציה מתמטית שמחשבת לי את הזמן שלוקח לעשות X פעולות, באופן שבו כתוב קוד האסמבלי למעלה...

אני יודע שבתכנות מתעסקים הרבה במתמטיקה, לכן חשבתי שזה אולי קיים.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 28-12-2008, 10:42
  רמי ד רמי ד אינו מחובר  
 
חבר מתאריך: 07.10.06
הודעות: 1,795
בתגובה להודעה מספר 9 שנכתבה על ידי dorM שמתחילה ב "אה מצטער על חוסר הפירוט. זה..."

אני לא עבדתי עם הבקרים האילו, אבל קראתי עליהם קצת.
עד כמה שידוע לי הם לא ARM, לכן יהיה לך קשה לחשב כמה זמן לוקחת כל פקודה כיוון שישנם פקודות שונות ומצבים שונים. כניראה זה עד 12 מחזורי שעון...

בקשר לטימר. (יש לך תיעוד בע"מ 13)
הטימר שלך דופק בקצב שעון של 1MHz. פירוש הדבר שכל דפיקה היא 1uS (מיקרו שניה).
יש לך 4 מצבים של עבודה.
כולם ניקבעים ע"י האוגר TMOD.
אנחנו צריכים את המצב, שבו הסיבית M1 היא 0 והסיבית M0 היא 1.

במצב זה, שני האוגרים TL ו TH משמשים יחד כמונה אחד בן 16 סיביות. כאשר המונה מגיע
לערך 0xFFFF, בדופק השעון הבא המונה יעבור ל 0x0000. דגל הפסיקה יעלה ל '1', המעבד יעבור לבצע תוכנית פסיקה.

על מנת לקבל קצב שעון קבוע, ניבחר בקצב של 1KHz למשל...

על מנת לקבל קצב כזה, עלינו לעשות חישוב כמה TH ו-TL צריכים להיות.
החישוב מתבצע כך:
65535-((1/1000)/(1/1000000))
שזה אומר ש TH ו-TL צריכים להיות64535.
זה אומר ש-TH הוא 0xFC
ו-TL הוא 0x17.

כל זה בעיניין הטימר.
בעיניין הפסיקה:
אם אני לו טועה, בע"מ 26 כתוב שהפסיקה של טימר 0 היא Interrupt 0.
זה אומר שבאוגר המיוחד TCON, עליך "לטעון"בסיבית TR0 - את הערך 1 על מנת שהוא יתחיל לעבוד,

והסיבית TF0 היא עולה ל '1'- כאשר יש 'גלישה', ופעולה זה יוצרת פסיקה.
ועל מנת לקבל ביכלל פסיקות, עליך לטעון EA ב-1
ו-ET0 ב-1.

ניראה לי שזהוא פחות או יותר...
בהצלחה!

ד"א: הנה ה-PDF של זה, עליו התבססתי:
http://www.keil.com/dd/docs/datasht...s/p89v51rd2.pdf
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #16  
ישן 12-01-2009, 23:22
  Alpha Centauri Alpha Centauri אינו מחובר  
 
חבר מתאריך: 30.04.06
הודעות: 8
בתגובה להודעה מספר 15 שנכתבה על ידי dorM שמתחילה ב "[QUOTE]במידה ושימוש בפסיקות..."

ציטוט:
במקור נכתב על ידי dorM
למה הכוונה? אשמח אם תוכל להרחיב בבקשה

ניתן להפעיל את הטיימר (דהיינו TR0=1) אבל לבטל את היכולת שלו לבצע פסיקות (ET0=0) ואז
עדיין ניתן לגשת ל-TH0,TL0 (כי הם עדיין יתעדכנו)

ציטוט:
במקור נכתב על ידי dorM
אבל עדיין היה לך מצב בו פקודות ה-MOV "מבזבזות" זמן שלא צריך לבזבז.... לא? (או פקודות אחרות, לא יודע איך כתבת את התוכנה)

אמת, אבל זה נכנס לתוך החישוב בתוך טבלה וגם בתוך הקוד קצת - לדוגמא, זה קוד שאני משתמש בו
ולפי הסימולטור הוא די מדויק:

קוד:
code char sleepTable[256] = { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236 }; void delay_us(unsigned char us) { us = sleepTable[us]; _asm setb rs1 mov a, dpl subb a, #7 mov r0, a 00001$: djnz r0, 00001$ clr rs1 ret _endasm; }


הקוד הזה נכון למעבד 8052 עם קריסטל של 22.1184MHz

אם תסתכלו על הטבלה תראו שההבדל שהיא יוצרת הוא במקסימום 19 - אבל יש לזכור ש-19
במשתנה של הלולאה משמעותו 10.26 מיקרושניות הבדל בין הזמן האמיתי לזמן הרצוי, שזה די הרבה לפונקציה שאמורה להיות מדויקת מאוד.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #18  
ישן 14-01-2009, 00:01
  Alpha Centauri Alpha Centauri אינו מחובר  
 
חבר מתאריך: 30.04.06
הודעות: 8
בתגובה להודעה מספר 17 שנכתבה על ידי dorM שמתחילה ב "חתיכת טבלה |משוגע| :) הבנתי..."

ציטוט:
במקור נכתב על ידי dorM
חתיכת טבלה

הבנתי את העיקרון של התוכנית. מה שלא הבנתי זה החלק של האסמבלי, כמו:
למה העברת מידע מ-dpl ל-a (שהרי dpl זה הבית הנמוך של DPTR).
למה חיסרת מהצובר ( האוגר a ) את המספר 7 ?
ומה התפקיד של הביט rs1 ?

תודה :]


הי דור,

ב-sdcc (הקומפיילר שבו השתמשתי) הפרמטר הראשון מועבר דרך dpl, השני דרך dph והשאר אני לא זוכר. השורה הראשונה בפונקציה היא ב-C: השמה של הערך הרלוונטי בטבלה אל תוך הערך שנכנס - ומכאן שההשמה תתבצע לתוך אוגר dpl. אני לוקח את הערך מ-dpl אל תוך a ומחסיר ממנו 7, שהוא
מספר קסם שהגעתי אליו ע"י "חישוב" הזמן שלוקח לכל פקודה בפונקציה (פרט ללולאה) ווידאתי אותו עם הסימולטור.

ב8052 יש 4 register banks - הביטים RS0 ו-RS1 שולטים על איזה register bank אתה עובד עכשיו
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 01:33

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר