# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > مباحث عمومی کار با سخت افزارها، سنسورها و لوازم جانبی >  کمک برای ساخت برنامه ای ک  زمان روشن و خاموش شدن یک چراغ را مشخص کنه؟

## چینی ساز

با سلام
من ی چراخ معمولی دارم  (میشه هر نوع چراغی با هر نوع ولتاژی باشه) می خوام  بکمک avr  زمان روشن بودن و خاموش شدن آن در کامپیوتر را ثبت کنم
من با قسمت نوشتن برنامه در ثبت کامپیوتر و خواندن اطلاعات از پورت com مشکلی ندارم
فقط ی نفر می خوام مدار لازم جهت اینکار و برنامه نویسی AVR برام انجام بده
حتی اگه هزینه ای هم داشته باشه تقبل می کنم
کسی هست کمک کنه

----------


## singel

سلام 
اگر فقط داخل کامپيوتر اطلاعات را ثبت کني احتياج به ميکرو نيست

----------


## firststep

بیین اگه قصد داری فقط اطلاعات رو تو سیستمتون ذخیره کنین دیگه نیازی به میکرو نیست فقط چیزی که می خوای اینکه (اگه ولتت 5 هست و البته طرف دیگرت بایستی زمین باشه ) از پشت LED یک سیم بگیرید و به یکی از پینهای کام وصل کنین زمانی که لامپ روشن هست اون پینتون یک میشه 

البته با میکرو هم می تونین کارایی کنین که همیشه نیاز به کام نباشه

اگه حالت دوم رو می خوای پست خصوصی بزن یا داوری کن تا بیشتر توضیح بدم :چشمک:

----------


## چینی ساز

سلام
singel جان ممنون از جوابتون
ولی چیطور؟
میشه کامل توضیح بدین
البته من تستهای زیادی کردم ولی نتونستم

----------


## چینی ساز

> بیین اگه قصد داری فقط اطلاعات رو تو سیستمتون ذخیره کنین دیگه نیازی به میکرو نیست فقط چیزی که می خوای اینکه (اگه ولتت 5 هست و البته طرف دیگرت بایستی زمین باشه ) از پشت LED یک سیم بگیرید و به یکی از پینهای کام وصل کنین زمانی که لامپ روشن هست اون پینتون یک میشه 
> 
> البته با میکرو هم می تونین کارایی کنین که همیشه نیاز به کام نباشه
> 
> اگه حالت دوم رو می خوای پست خصوصی بزن یا داوری کن تا بیشتر توضیح بدم


سلام
ممنون از جوابتون
ببینین من ترجیحا می خوام از پورت کام استفاده کنم
در مورد پیشنهاد اول میشه کامل توضیح بدین به کدوم پایه و چه ولتاژی ؟
آخه من مشابه اینکار انجام دادم ولی نوسانات و نویز باعث میشد که در یک ثانیه 100 رکورد ذخیره بشه در صورتی که چراغ همچنان روشن یا خاموش بود؟
در مورد پیشنهاد دوم : میشه یک میکرو نوشت زانی که چراغ روشن هست عدد صفر و زمانی که خاموش شد عدد  یک را هر یک دقیقه به کامپیوتر بفرسته فکر کنم این دقیق تر و بهتر باشه البته اگه با پورت کام هم نشد مهم نیست

----------


## farzadsw

اگر از میکرو کنترلر استفاده کنید قطعا جواب میگیرید (پورت کام رو همینطوری نمیشه بهش 0و1 داد ، اطلاعات باید تو یه فریم خاص باشن)
برای این کار اگر به سیمهای چراغ دسترسی دارید و ولتاژ تغذیه اون هم بین 3 تا 5 ولت هست ، کافیه تغذیه اون چراغ رو به یکی از پین های میکرو کنترلر متصل کنید (با پول دان 10 کیلو باشه بهتره) و وضعیت اون پایه رو تو برنامه میکرو کنترلر بخونید (ابتدایی ترین کاری که با میکروکنترلر انجام میشه داد و اولین چیزی هست که تو کتابهای میکروکنترلر آموزش داده میشه) . اگر تغذیه چراغ وصل باشه (مثلا 4 ولت وصل باشه) وضعیت پایه 1 خونده میشه و اگر برقش قطع باشه (ولتاژ کمتر از 2) وضعیت پایه 0 خونده میشه . با توجه به وضعیت پایه شما کد دلخواهتون رو به صورت سریال به کامپیوتر میفرستید. 
اون حالت بالایی که گفتم (ولتاژ چراغ بین 3تا5 ولت و دسترسی به سیم تغذیه اون) ساده ترین حالت هست . اگر به سیم تغذیه چراغ دسترسی دارید ولی ولتاژش بیشتره (مثلا 12 ولت) به یه تقسیم مقاومتی ساده میتونید اون 12 ولت رو به مثلا 4 ولت تبدیل کنید و مثل حالت قبل استفاده کنید . تقسیم مقاوتی یعنی دوتا مقاومت سری کنید یه سرشون به تغذیه لامپ باشه ، سر دیگه به زمین و سر وسط و مشترک هم به پایه میکرو میره . مقدار مقاومت ها هم باید طوری انتخاب بشه که سر وسط همون ولتاژ 3تا5 ولت رو داشته باشه.

اگر هم هیچ دسترسی به تغذیه چراغ ندارید ، با توجه به نور چراغ (بدون تماس) میتونید وضعیتش رو تشخیص بدید . میتونید از یه فتوسل استفاده کنید و ولتاژ خروجی رو به adc میکرو بدید . یا اینکه با مدارات آپ امپ ولتاژ 3تا5 ولت رو ایجاد کنید (البته این بیشتر الکترونیکی هست) و بدید به پایه معمولی میکرو.

----------


## چینی ساز

> اگر از میکرو کنترلر استفاده کنید قطعا جواب میگیرید (پورت کام رو همینطوری نمیشه بهش 0و1 داد ، اطلاعات باید تو یه فریم خاص باشن)
> برای این کار اگر به سیمهای چراغ دسترسی دارید و ولتاژ تغذیه اون هم بین 3 تا 5 ولت هست ، کافیه تغذیه اون چراغ رو به یکی از پین های میکرو کنترلر متصل کنید (با پول دان 10 کیلو باشه بهتره) و وضعیت اون پایه رو تو برنامه میکرو کنترلر بخونید (ابتدایی ترین کاری که با میکروکنترلر انجام میشه داد و اولین چیزی هست که تو کتابهای میکروکنترلر آموزش داده میشه) . اگر تغذیه چراغ وصل باشه (مثلا 4 ولت وصل باشه) وضعیت پایه 1 خونده میشه و اگر برقش قطع باشه (ولتاژ کمتر از 2) وضعیت پایه 0 خونده میشه . با توجه به وضعیت پایه شما کد دلخواهتون رو به صورت سریال به کامپیوتر میفرستید. 
> اون حالت بالایی که گفتم (ولتاژ چراغ بین 3تا5 ولت و دسترسی به سیم تغذیه اون) ساده ترین حالت هست . اگر به سیم تغذیه چراغ دسترسی دارید ولی ولتاژش بیشتره (مثلا 12 ولت) به یه تقسیم مقاومتی ساده میتونید اون 12 ولت رو به مثلا 4 ولت تبدیل کنید و مثل حالت قبل استفاده کنید . تقسیم مقاوتی یعنی دوتا مقاومت سری کنید یه سرشون به تغذیه لامپ باشه ، سر دیگه به زمین و سر وسط و مشترک هم به پایه میکرو میره . مقدار مقاومت ها هم باید طوری انتخاب بشه که سر وسط همون ولتاژ 3تا5 ولت رو داشته باشه.
> 
> اگر هم هیچ دسترسی به تغذیه چراغ ندارید ، با توجه به نور چراغ (بدون تماس) میتونید وضعیتش رو تشخیص بدید . میتونید از یه فتوسل استفاده کنید و ولتاژ خروجی رو به adc میکرو بدید . یا اینکه با مدارات آپ امپ ولتاژ 3تا5 ولت رو ایجاد کنید (البته این بیشتر الکترونیکی هست) و بدید به پایه معمولی میکرو.


با سپاس فرواوان
ممنون از جواب کامل
من هیچ محدودتی در نوع ولتاژ ندارم مشکل من اینه که اصلا از میکرو کنترلر و برنامه نویسی اون اطلاعی ندارم می خوام اگه کسی بتونه اینکار رو انجام بده

----------


## singel

سلام 
اين برنامه رو برات ميفرستم بدون نياز به ميکرو احتمالا بايد مشکلت حل بشه البته خودت هر طوري که ميخواي بايد تغييرش بدي 
ri پايه شماره 9
با يک مقاومت       ( با  يه ولتاژ پايين تستش کن جواب ميده )

----------


## چینی ساز

> سلام 
> اين برنامه رو برات ميفرستم بدون نياز به ميکرو احتمالا بايد مشکلت حل بشه البته خودت هر طوري که ميخواي بايد تغييرش بدي 
> ri پايه شماره 9
> با يک مقاومت ( با يه ولتاژ پايين تستش کن جواب ميده )


سلام
ممنون از لطفتون
میشه در مورد برنامه و نحوه عملکردش ی توضیح هم بدی

----------


## singel

ببين دوست عزيز اين برنامه سه تا پايه رو چک ميکنه که ما بيشتر با پايه نهم پورت سريال  (  ri  يا  Ring Indicator )کار داريم 

پین1 و 9:

این پین ها به ترتیب Carrier Detect و Ring Indicator یا CD و RI نام دارند و مربوط به مودم می شوند که اولی برای تشخیص حامل بر روی خط و دومی برای اعلان یک تماس تلفنی به مودم شماست و معمولا در طراحی های کنترلری به ندرت مورد استفاده قرار می گیرند.
موقعي که يک ولتاژ به اين پايه وصل بشه در نرم افزار جلوي قسمتش تيک ميخوره 
نهايت ولتاژي که به اين پايه ميديد 5 ولت باشه

----------


## singel

اين هم يه فايل توضيحي در مورد پورت سريال

----------


## چینی ساز

> ببين دوست عزيز اين برنامه سه تا پايه رو چک ميکنه که ما بيشتر با پايه نهم پورت سريال ( ri يا Ring Indicator )کار داريم 
> 
> پین1 و 9:
> 
> این پین ها به ترتیب Carrier Detect و Ring Indicator یا CD و RI نام دارند و مربوط به مودم می شوند که اولی برای تشخیص حامل بر روی خط و دومی برای اعلان یک تماس تلفنی به مودم شماست و معمولا در طراحی های کنترلری به ندرت مورد استفاده قرار می گیرند.
> موقعي که يک ولتاژ به اين پايه وصل بشه در نرم افزار جلوي قسمتش تيک ميخوره 
> نهايت ولتاژي که به اين پايه ميديد 5 ولت باشه


ممنون از جواب
شرمنده که زیاد سئوال می کنم چون ناواردم
ببینین من دقیقا از همین روش استفاده کردم با این تفاوت ک در VB6 بود مشکلی ک اونجا ایجاد می شد این بود در زمان وصل جریان یا قطع  بیش از 100 بار در ثانیه رکورد ذخیره می کرد در صورتی ک من می خوام برای هر بار قطع یک رکورد و برای هر بار وصل یک رکورد دیگه ذیره کنه از قسمت برنامه ای هم ک نوشته ودم هم مطمئن بودم ولی جواب نگرفتم
میشه اگه شما تخصص دارین بیشتر با هم صحبت کنیم
نیاز مبرم به این برنامه دارم

----------


## farzadsw

اون روشی که دوستمون گفتند (استفاده از ri) رو من تا حالا استفاده نکردم و جزییاتش رو هم نمیدونم . شما استفاده کردید و میگید اطلاعات رو میده ولی تعدادش زیاده ؟
چون مشکلتون رو کاملا متوجه نشدم توضیح بدید که آیا *فقط* در لحظه قطع و وصل تعداد رکورد زیادی  ایجاد میشه یا این اتفاق همیشه و به صورت مثلا 100 بار در ثانیه (چه وصل چه قطع) رخ میده!؟
اگر فقط موقع قطع و وصل این اتفاق میوفته (یعنی به جای 1 بار مثلا 80 بار قطع و وصل رو نشون میده) راههای زیادی برای حلش هست که من 2 تاش رو میگم :
1. اگر سرعت خاموش  و روشن شدن چراغ خیلی سریع نیست یا به عبارت دیگه اگر بین خاموش شدن و روشن شدن مجدد اون همیشه n ثانیه فاصله هست ، کافیه شما فقط تغییر وضعیت (اولین تغییر وضعیت)رو تشخیص بدید و حدود n ثانیه تو برنامتون تاخیر بذارید و دوباره برنامه به روال اصلی برگرده.
2.اگر مشکل به خاطر نوسانات ولتاژ موقع قطع و وصل کلید هست ، کافیه یه خازن بین زمین(منفی) و همون پایه ri قرار بدید تا زمان رد شدن این نوسانات ولتاژ تا یه حدی بمونه و بعد تغییر کنه (شبیه همون تاخیر ولی سخت افزاری) . اندازه خازن هم بسته به مدار و میزان تاخیرتون داره میتونید خازن 10 میکروفاراد رو امتحان کنید و بعدا مقدار کمتر یا بیشتر رو استفاده کنید.

----------


## چینی ساز

> اون روشی که دوستمون گفتند (استفاده از ri) رو من تا حالا استفاده نکردم و جزییاتش رو هم نمیدونم . شما استفاده کردید و میگید اطلاعات رو میده ولی تعدادش زیاده ؟
> چون مشکلتون رو کاملا متوجه نشدم توضیح بدید که آیا *فقط* در لحظه قطع و وصل تعداد رکورد زیادی  ایجاد میشه یا این اتفاق همیشه و به صورت مثلا 100 بار در ثانیه (چه وصل چه قطع) رخ میده!؟
> اگر فقط موقع قطع و وصل این اتفاق میوفته (یعنی به جای 1 بار مثلا 80 بار قطع و وصل رو نشون میده) راههای زیادی برای حلش هست که من 2 تاش رو میگم :
> 1. اگر سرعت خاموش  و روشن شدن چراغ خیلی سریع نیست یا به عبارت دیگه اگر بین خاموش شدن و روشن شدن مجدد اون همیشه n ثانیه فاصله هست ، کافیه شما فقط تغییر وضعیت (اولین تغییر وضعیت)رو تشخیص بدید و حدود n ثانیه تو برنامتون تاخیر بذارید و دوباره برنامه به روال اصلی برگرده.
> 2.اگر مشکل به خاطر نوسانات ولتاژ موقع قطع و وصل کلید هست ، کافیه یه خازن بین زمین(منفی) و همون پایه ri قرار بدید تا زمان رد شدن این نوسانات ولتاژ تا یه حدی بمونه و بعد تغییر کنه (شبیه همون تاخیر ولی سخت افزاری) . اندازه خازن هم بسته به مدار و میزان تاخیرتون داره میتونید خازن 10 میکروفاراد رو امتحان کنید و بعدا مقدار کمتر یا بیشتر رو استفاده کنید.


با سلام و تشکر فراوان از همه دوستان و اساتید گرامی
من ی بار دیگه مشکلم بطور خلاصه شرح می دم
من یک چراغ دارم ( ک می تونی معمولی باشه یا ال ای دی ) روشن و خاموش بودن آن نشانه وضعیت کاری هست میخوام این روشن و خاموش شدن که معلوم نیست کی هست ممکن در روز یکبار الی 20 بار خاموش و بعد از ی زمان نامشخص روشن بشه در کامپیوتر ذخیره بشه من از طریق پورت کام ی برنامه نوشتم و از چند خازن و یک میکرو استفاده کردم ک یکی از دوستان پیشنهاد داده بود ولی این درست کار نمی کنه بعضا با کوچکترین نویز مثلا تکون خوردن سیم رکورد ثبت میشه و موقعی روشن یا خاموش شدن در همون ثانیه 100 رکورد ذخیره می کنه حتی تایمر هم گذاشتم خیلی کارها کردم این اضافه رکورد ثبت کردن به حداقل رسوندم این ثبت تغییرات بی خودی ک ناشی از نویز و تکون سیم بود نشد حل کنم
من در برنامه vb6 از کامپونت mscom  برای اینکار استفاده کردم
حالا پیشنهاد و راهنمایی شما در این خصوص چی هست

----------


## singel

سلام 
ميتوني توضيح بدي که چطوري قسمت سخت افزارت رو به پورت سريال وصل ميکني ؟
اگه  به صورت مدار باشه خيلي بهتره  !  
براي اينکه راحتر بتونم توضيح بدم

----------


## چینی ساز

با سلام
درسته با مدار بهتره فقط بدیش این هست که من هیچ اطلاعاتی در این خصوص ندارم الان هم بهمین دلیل به مشکل برخوردم
مدار پیوست و برنامه ای رو ک یکی از دوستان نوشته می فرستم 
کارش اینه ک وقتی چراغ روشه بشه  حرف H  و وقتی خاموش بشه حرف  L  رو می فرسته ولی درست عمل نمی کنه
بعضی رکوردها ثبت نمیشه یا در  یک ثانیه چند رکورد ذخیره می کنه
اینم برنامه ای که واسش نوشتن 
$SIM
$REGFILE ="M32DEF.DAT"
$CRYSTAL= 800000
$BAUD = 4800
ENABLE INTERRUPTS
CONFIG INT0= RISING
CONFIG INT1=FALLING
ENABLE INT1
ON INT0 HIGH_LED
ON INT1 LOW_LED
CONFIG PORTC = OUTPUT
'-------------------------------------------
'DIM A AS BYTE ,B AS BYTE
DO
'DO
' A = INKEY()
'PRINT CHR(A)
'PRINT "ASCII CODE = " ;A
'END IF
'LOOP UNTIL A= 27
''WAIT UNTIL ESX IS PRESSED
'DO
'B = WAITKEY()
'PRINT CHAR(B)
'PRINT "ASCII CODE = " ; B
'LOOP UNTIL B= 27
'' WAIT UNTIL ESC IS PRESSED
LOOP
END 
'-------------------------------------------
HIGH_LED
TOGGLE PORTC.0
PRINT "H"
RETURN
LOW_LED:
TOGGLE PORTC.1
PRINT "L"
RETURN

من از این برنامه هیچ بلد نیستم فقط وقتی وصل کردم به سیستم در VB6  چک می کنم که ارتباط وصل باشه اون حرف بخونم و در بانک ذخیره کنم

----------


## چینی ساز

اینم ی نمونه کدی که در VB6  استفاده می کنم
""""""""""""""""""""
Public t As Boolean
Dim flag As Boolean
Private Sub Form_Load()
t = False
flag = False
With MSComm
.CommPort = 2 'Put your port
.Settings = "9600,N,8,1" 'And settings here
.Handshaking = comNone
.PortOpen = True
End With
End Sub
Private Sub MSComm_OnComm()
If comEvDSR = 4 Then
   If flag = False Then
   If t = False Then
        Label1.Caption = "ÔÑæÚ"
        t = True
        Text1.Text = shamsyDate(Date, True)
        Text2.Text = Format(Now, "hh:mm:ss")
        flag = False
        Text3.Text = flag
        Timer1.Enabled = True
        Else
        Label1.Caption = "ÇíÇä"
        t = False
        Text1.Text = shamsyDate(Date, True)
        Text2.Text = Format(Now, "hh:mm:ss")
        Timer2.Enabled = True
                flag = True
                Text3.Text = flag
        End If
      End If
End If
End Sub
Private Sub Timer1_Timer()
If PB1.Value < 500 Then
    PB1.Value = PB1.Value + 10
Else
            Adodc1.Recordset.AddNew
            Adodc1.Recordset.Fields("STR_d") = Text1.Text
            Adodc1.Recordset.Fields("STR_t") = Text2.Text
            Adodc1.Recordset.Fields("tozih") = Label1.Caption
            Adodc1.Recordset.Update
            Timer1.Enabled = False
            PB1.Value = 0
End If
End Sub
Private Sub Timer2_Timer()
If PB1.Value < 500 Then
    PB1.Value = PB1.Value + 10
Else
       Adodc1.Refresh
        Adodc1.Recordset.MoveLast
        Adodc1.Recordset.Fields("end_d") = Text1.Text
        Adodc1.Recordset.Fields("end_t") = Text2.Text
        Adodc1.Recordset.Fields("tozih") = Label1.Caption
        Adodc1.Recordset.Fields("tIM") = Text5.Text
        Adodc1.Recordset.Update
        Timer2.Enabled = False
        PB1.Value = 0
End If
End Sub
""""""""""""""""""""""""""""""""""""""""""""""""""  """"
البته مدلهای مختلفی تست کردم

----------


## چینی ساز

> سلام 
> اين برنامه رو برات ميفرستم بدون نياز به ميکرو احتمالا بايد مشکلت حل بشه البته خودت هر طوري که ميخواي بايد تغييرش بدي 
> ri پايه شماره 9
> با يک مقاومت       ( با  يه ولتاژ پايين تستش کن جواب ميده )


 با تشکر از شما
ولی کار نکرد

ارور داد

----------


## چینی ساز

چي شد
چرا جواب نمي دين

----------


## singel

سلام شرمنده زياد نميتونم به سايت سر بزنم




> ولی کار نکرد
> 
> ارور داد


error چي بود 
يه pdf برات ميزارم ارتباط ميکرو و ويژوال بيسيک 6 را توضيح داده
من هم در اولين فرصت برات برنامه ميکرو را مينويسم
حجم فايل در حدود 2 مگ
دانلود از سايت پرشين درايو

----------


## firststep

سلام دوستان
مشکل این اقا توی استفاده از رله هست ایشون برای اینکهع ولتاژ تبدیل کنه از رله استفاده کرده
یکی از خاصیت های رله این هست ولی استفاده از رله با توجه به اینکه از نیرو های مغناطیسی برای برقراری ارتباط استفاده می کنه این سبک ارتباط پایدار نیست به این معنی که این ارتباط در ثانیه ممکنه هزار بار دیبانس داشته باشه یعنی قطع و صل بشه و این یک روند مشخصی نداره این باعث می شه که شما مشکل پیدا کنین توی قطعاتی که دقتشان بالاست مثل میکرو یا کامپیوتر ولی در کل شما از چیزه دیگه به جای رله استفاده کنین فکر کنم مشکلتون برطرف میشه

----------


## firststep

سلام دوست عزیز بعتر شما یک ولتاژ و امپر پشت لامپ هارو بگیری تا بعد تصمیم بگیریم

----------


## mr13668248

آخر به جوابی نرسیدیم :گریه:

----------

