יום חמישי, 1 בדצמבר 2011

סדר פעולות בקריאת חיישן גז.


לתלמידים ששאלו אותי על קוד לחיישן גז בארדוינו. זה הקוד.
int sensorValue;

void setup()
{
  Serial.begin(9600);      // sets the serial port to 9600
}

void loop()
{
  sensorValue = analogRead(0);       // read analog input pin 0
  Serial.println(sensorValue, DEC);  // prints the value read
  delay(100);                        // wait 100ms for next reading
}

מחפשים מנחי פרויקטים בנרות!!!!!!!!!!!!!

מחפשים מנחי פרויקטים בנרות!!!!!!!!!!!!!
לאחר שיחה עם מספר מנהלי בית הספר אני אפרסם כאן שמות מכללות ובתי הספר שמחפשים מנחים וגם שמות מנחים שמאוניינים לעבוד בנוסף לעבודה שיש להם. תשלחו לי לד"א דוגמאות של הפרויקטים שעשיתם בעבר וקורות חיים שלכם.
מנהלי בתי הספר: מנהלי בתי הספר: תשלחו לי בקשות למנחים לד"א בצירוף מידע הבא :  מה מספר תלמידים, מיקום עבודה, באיזה חומרה משתמשים, כמה זמן נותנים לתלמיד בשבוע. תודה רבה markalex012@gmail.com

חיישני גז (חיישן אלכוהול)

חישן גז אלכוהול MQ-3
חישן אלכוהול זה מסוגל לזהות המצאות אלכוהול בנשימה שלכם. החישן די רגיש והזיהוי מהיר יחסית אחרי שהחישן חומם כמו שצריך. יש צורך לחמם את החישן (לספק מתח חימום) לפחות 24-48 שעות לפני שימוש הראשון. החישן ישנה את ההתנגדות שלו בהתאם לכמות האלכוהול שמגיעה אליו. המעגל הדרוש לעבודה עם החישן די פשוט, צריך להוסיף רק נגד אחד. משתמשים דווחו שעדיף להשתמש בנגדים 1-10 קילו אום כדי להגיע למדידה תקינה .
צורת החיבור של החיישן:

חייבים לחקות 100 מילי שניות עד למדידה הבאה.


יום חמישי, 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;
בהצלחה.

יום שלישי, 5 ביולי 2011

חידה מס' 4 - מי לקח את הספר?

לאיליה יש הרבה ספרים. בסוף השנה הוא ספירת מלאי וראה שחסרים 5 ספרים - ז'ול ורן, דיקנס, פושקין, סולז'ניצין, יסנין.
לאיליה נכנסו רק 5 חברים: אנטון, פיני, יוסי, קובי, שושי.ליליה יש כלל - הוא לא נותן לאף אחד יותר מספר אחד ורק אחרי שהו יחזיר את הספר שלקח קודם.
פיני לקח את דיקנס לפני הרבה זמן והחזיר. אנטון אוהב או את ז'ול ורן או את יסנין. קובי אוהב לקרוא ספרים של מאה XX.
יוסי אוהב רק ספרות רוסית ושושי אוהבת שירה.
האם לפי נתונים האלה איליה יכול לזכור מי לקח איזה ספר ואם כן אז תעזרו לו למצוא את הפתרון.


יום רביעי, 29 ביוני 2011

תוכנה להפעלת AD0804

        rd equ P1.0           ;Read signal P1.0
        wr equ P1.1           ;Write signal P1.1
        cs equ P1.2           ;Chip Select P1.2
        intr equ P1.3         ;INTR signal P1.3

        adc_port equ P2       ;ADC data pins P2
        adc_val equ 30H       ;ADC read value stored here

        org 100H
start:                    ;Start of Program
        acall conv            ;Start ADC conversion
        acall read            ;Read converted value
        mov P3,adc_val        ;Move the value to Port 3
        sjmp start            ;Do it again

conv:                     ;Start of Conversion
        clr cs                ;Make CS low
        clr wr                ;Make WR Low
        nop
        setb wr               ;Make WR High
        setb cs               ;Make CS high
wait:
        jb intr,wait          ;Wait for INTR signal
        ret                   ;Conversion done

read:                     ;Read ADC value
        clr cs                ;Make CS Low
        clr rd                ;Make RD Low
        mov a,adc_port        ;Read the converted value
        mov adc_val,a         ;Store it in local variable
        setb rd               ;Make RD High
        setb cs               ;Make CS High
        ret                   ;Reading done
----------------------------------------------------------------------------------
#include <REG89X51.H>
#define adc_port P2              //ADC Port
#define rd P1_0                  //Read signal P1.0
#define wr P1_1                  //Write signal P1.1
#define cs P1_2                  //Chip Select P1.2
#define intr P1_3                //INTR signal P1.3

void conv();                     //Start of conversion function
void read();                     //Read ADC function

unsigned char adc_val;

void main(){
        while(1){                    //Forever loop
                conv();                  //Start conversion
                read();                  //Read ADC
                P3 = adc_val;            //Send the read value to P3
        }
}

void conv(){
        cs = 0;                      //Make CS low
        wr = 0;                      //Make WR low
        wr = 1;                      //Make WR high
        cs = 1;                      //Make CS high
        while(intr);                 //Wait for INTR to go low
}

void read(){
        cs = 0;                      //Make CS low
        rd = 0;                      //Make RD low
        adc_val = adc_port;          //Read ADC port
        rd = 1;                      //Make RD high
        cs = 1;                      //Make CS high
}

חיבור ממיר AD0804 למעבד 80X51

AD0804 הוא ממיר מתח אנלוגי לדיגיטלי הפשוט ביותר. זה המעגל ואופן חיבור.

תזמון של מערכת:

מנגנון עבודה מחולק לשני חלקים: חלק ראשון - לפני קריאת תוצאות, חלק שני אחרי.
חלק ראשון:
  1. Make chip select (CS) signal low.
  2. Make write (WR) signal low.
  3. Make chip select (CS) high.
  4. Wait for INTR pin to go low (means conversion ends).
חלק שני:
  1. Make chip select (CS) pin low.
  2. Make read (RD) signal low.
  3. Read the data from port where ADC is connected.
  4. Make read (RD) signal high.
  5. Make chip select (CS) high.


יום שלישי, 28 ביוני 2011

תכנות מנוע צד בשפת C ושפת אסמבלי.

Programming Full step Sequence (90 degrees)
#include <REG89c51.H>.
#define stepper P1
void delay();

void main(){
        while(1){
                stepper = 0x0C;
                delay();
                stepper = 0x06;
                delay();
                stepper = 0x03;
                delay();
                stepper = 0x09;
                delay();
        }
}

void delay(){
        unsigned char i,j,k;
        for(i=0;i<6;i++)
                for(j=0;j<255;j++)
                        for(k=0;k<255;k++);
}
------------------------------------------------
org 100H

stepper equ P1

main:
        mov stepper, #0CH
        acall delay
        mov stepper, #06H
        acall delay
        mov stepper, #03H
        acall delay
        mov stepper, #09H
        acall delay
        sjmp main

delay:
        mov r7,#4
wait2:
        mov r6,#0FFH
wait1:
        mov r5,#0FFH
wait:
        djnz r5,wait
        djnz r6,wait1
        djnz r7,wait2
        ret
        end
-------------------------------------------------------
 
-------------------------------------
Programming Half step Sequence (45 degrees)
void main(){
        while(1){
                stepper = 0x08;
                delay();
                stepper = 0x0C;
                delay();
                stepper = 0x04;
                delay();
                stepper = 0x06;
                delay();
                stepper = 0x02;
                delay();
                stepper = 0x03;
                delay();
                stepper = 0x01;
                delay();
                stepper = 0x09;
                delay();
        }
}
----------------------------------
main:
        mov stepper, #08H
        acall delay
        mov stepper, #0CH
        acall delay
        mov stepper, #04H
        acall delay
        mov stepper, #06H
        acall delay
        mov stepper, #02H
        acall delay
        mov stepper, #03H
        acall delay
        mov stepper, #01H
        acall delay
        mov stepper, #09H
        acall delay
        sjmp main
-----------------------------
 
----------------------------------------------
Programming for 2-wire connection of Unipolar Stepper Motor
void main(){
        while(1){
                stepper = 0x03;
                delay();
                stepper = 0x01;
                delay();
                stepper = 0x00;
                delay();
                stepper = 0x02;
                delay();
        }
}
-------------------------------
main:
        mov stepper, #03H
        acall delay
        mov stepper, #01H
        acall delay
        mov stepper, #00H
        acall delay
        mov stepper, #02H
        acall delay
        sjmp main
--------------------------------------------
----------------------------------------------------------
Programming for Bipolar Stepper Motor
void main(){
        while(1){
                stepper = 0x08;
                delay();
                stepper = 0x02;
                delay();
                stepper = 0x04;
                delay();
                stepper = 0x01;
                delay();
        }
}
---------------------------------
main:
        mov stepper, #08H
        acall delay
        mov stepper, #02H
        acall delay
        mov stepper, #04H
        acall delay
        mov stepper, #01H
        acall delay
        sjmp main
---------------------------------