יום חמישי, 22 בספטמבר 2011

פיתוח של פונקציית MAIN

בשלב הבא אני רוצה לממש LCD ולוח מקשים כדי לראות כיצד מערכת שלי עובדת. בגלל הרבה פונקציות שLCD חייב לתמוך אני רושם את כל הפונקציות בקובץ נפרד LCD.h ו- הגדרות עצמם אני ארשום לתוך קובץ LCD.cpp. סיבה נוספת לכך נשתמש בשפונקציות LCD מקבצים שונים ואני לא רוצה לכתוב בכל קובץ וקובץ רשימה שמית של כל הפונקציות.
 #include "REG_89C51.h"
#include "lcd_play.h"
#include "type_var_H.h"
u8 write_num(); //usage of function that receive the number from keyboard from different file
void delay_lcd();
void delay ();

  void main()
    {
    u8 code message[]={"0-Manual 1-Auto"};
    u8 code err_message[]={"Try Again"};
u8 data number, i;   
lcd_setup();
    delay_lcd();
 
    delay_lcd();
    for(i=0;message[i];i++)
        lcd_write(message[i]);
     for(i=0;i<20;i++)
          delay();
          lcd_clear();
       while(1)
        {
          number=write_num();
          if(number=='0')
          {
         //Setup();
          }
        
          else if(number=='1')
{

          //work
}
        
        else
{
lcd_setup();
    delay_lcd();
 
    delay_lcd();
    for(i=0;err_message[i];i++)
        lcd_write(err_message[i]);
     for(i=0;i<20;i++)
          delay();
          lcd_clear();


        }//while
      }//main
//================================================
//             End of file "main.c"
//================================================
 בשלב זה כתבנו קובץ ראשי שמטרה שלנו לפתח את הלוגיקה של התוכנה.
שלב הבא: לכתוב (במילים) תת-פונקציות SETUP ו-WORK, כדי לדעת מה אנחנו צריכים לממש.

יום רביעי, 21 בספטמבר 2011

תהליך פיתוח תוכנה:

תלמידים חושבים שכדי לבנות פרויקט הם צריכים לבנות את החומרה ורק אז להתחיל לכתוב תוכנה. אני מציע לסדר את העבודה לפי תהליך אחר.
1. בניית הצעת פרויקט.
2. הזמנת רכיבים.
3. כתיבת תוכנה לפי מערכת לוגית. (נדבר על זה בהמשך)
4. הכנסת רכיבים (מכניסים רכיב, כותבים תוכנה בשבילו, מריצים תוכנה יחד עם חומרה ובודקים תוצאות).
5. כתיבת ספר.
6. גימור.
7. הגנת פרויקט.
על שלב 3 אני רוצה לכתוב בצורה מפורטת.
נגיד ואנו עושים פרויקט לבית חכם שמכיל חיישן חום, חיישן אור, RTC, AD, DA, מגעים לחלונות, זוג צמד אופטי לדלתות, גוף חימום, מעברר, ממסרים.
שלב 1. מרכיבים לוח מקשים וLCD על ערכה.
שלב 2. בונים גוף התוכנית.
#include "REG_89C51.h"
#include "type_var_H.h"

  void main()
    {
  
   
       while(1)
        {
         

        }//while
      }//main
//================================================
//             End of file "main.c"
//================================================
כותב במילים בלוקים שתוכנית מבצעת (אחר כך מחליפים כל בלוק בקוד בשפת C).
#include "REG_89C51.h"
#include "type_var_H.h"

  void main()
    {
   //הגדרת מערכת בסיסית
   
       while(1)
        {
          //LCD.write(Press 0 to setup 1 to work)
         //input=/KBD.read();
       //if(input=='0')
       //setup();
       //else if(input=='1')
       //work();
        //else LCD.write('Error Message');
        }//while
      }//main
המשך יהיה מחר......

יום שלישי, 20 בספטמבר 2011

קובץ הגדרת טיפוסים.

עוד דוגמא לפיתוח סביבה נוחה - בניית קובץ הגדרות משתנים. במקום שכל פעם תכתבו unsigned char ניתן לכתוב u8 - קצר יותר - פשוט יותר. נא לא לשכוח בסוף הקובץ לכתוב   #endif.

#ifndef type_var_H
#define type_var_H

typedef unsigned char  u8;
typedef signed   char  s8;
typedef unsigned int   u16;
typedef signed   int   s16;
typedef unsigned long  u32;
typedef signed   long  s32;

#endif

כתיבת קוד לפרויקטים. חלק א' - קובץ הגדרות h.*

הזמנו רכיבים, סרטטנו מעגלים, מה עושים עכשיו? נתחיל לכתוב תוכנה. למערכת שאנו בונים יש אפשרות לכתוב תוכנה ללא חומרה ולעשות את זה לפי שלבים.
בשלב ראשון אני פותח פרויקט חדש בתוכנה Keil uVision 4. אנו עובדים עם חומרה, ז.א. עם כל הפורטים ורכיבים פנימיים. נוח מאוד לתת להם שמות שיהיה קל יותר לקרוא אותם, כגון:

כיצד מערכת הזאת עובדת? במקום לעבוד עם כתובות של חומרה אנו מגדירים פעם אחד שמות לוגיות לכל האוגרים, פורטים, פסיקות. שומרים אותם לקובץ בשם REG_89C51.h ובקריאה משתמשים בהם. שימו לב שבתוך קובץ H שתי שורות ראשונות צריכות להיות הגדרות הבאות:
#ifndef __REG_89C51_H__
#define __REG_89C51_H__
קובץ עצמו נראה כך: (אל תשכחו לבדוק מספרי פורטים ואוגרים -לכל סוג מעבד יש פורטים משלו.  לפורט 3 יש אפשרות לפנות גם לפי שם של פורט וגם לפי תפקידו.

/*  BYTE Register  */
sfr CKCON   = 0x8F;
sfr B       = 0xF0;
sfr SP      = 0x81;
sfr DPL     = 0x82;
sfr DPH     = 0x83;
sfr TMOD    = 0x89;
sfr TL0     = 0x8A;
sfr TL1     = 0x8B;
sfr TH0     = 0x8C;
sfr TH1     = 0x8D;
sfr IP      = 0xB8;
sfr ICON    = 0xFF;
sfr CKSEL   = 0x85;
sfr OSCCON  = 0x86;
sfr FCON    = 0xD1;
sfr EECON   = 0xD2;
sfr EETIM   = 0xD3;


/*  PORT 0  */
sfr  P0   = 0x80;           
sbit P0_7 = P0^7;
sbit P0_6 = P0^6;
sbit P0_5 = P0^5;
sbit P0_4 = P0^4;
sbit P0_3 = P0^3;
sbit P0_2 = P0^2;
sbit P0_1 = P0^1;
sbit P0_0 = P0^0;

/*  PORT 1  */
sfr  P1   = 0x90;
sbit P1_7 = P1^7;
sbit P1_6 = P1^6;
sbit P1_5 = P1^5;
sbit P1_4 = P1^4;
sbit P1_3 = P1^3;
sbit P1_2 = P1^2;
sbit P1_1 = P1^1;
sbit P1_0 = P1^0;


/*  PORT 3  */
sfr  P3   = 0xB0;
sbit P3_7 = P3^7;
sbit P3_6 = P3^6;
sbit P3_5 = P3^5;
sbit P3_4 = P3^4;
sbit P3_3 = P3^3;
sbit P3_2 = P3^2;
sbit P3_1 = P3^1;
sbit P3_0 = P3^0;

sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD  = P3^1;
sbit RXD  = P3^0;
בהצלחה.