قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الاليقسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots
مساء الخير اخواني الأعزاء..
كيف ممكن اعمل كنترول لل DC Motor بحيث اخليه يشتغل كل ساعتين لمدة 10 ثواني وبعدها يبند عن طريق الميكروكنترولر باستخدام ميكروسي ولكم جزيل الشكر..
مساء الخير اخواني الأعزاء..
كيف ممكن اعمل كنترول لل DC Motor بحيث اخليه يشتغل كل ساعتين لمدة 10 ثواني وبعدها يبند عن طريق الميكروكنترولر باستخدام ميكروسي ولكم جزيل الشكر..
السلام عليكم ورحمه الله
مساء الخير عليك
اخي لم تحدد رقم الميكرو عموما اخترت لك ميكرو كنترولر مناسب
وعليكم السلام اخي العزيز مهندس عبدلله..
شكرا جزيلا طريقه جيده..
انا كنت أريد طريقه أخرى اذا ممكن بدون مايأثر زمن التأخير على البرنامج الرئيسي للميكروكنترولر اي باستخدام المقاطعات اذا ممكن وبدون التعليمه delay_ms.
شكرا لوقتك اخي الكريم وفي ميزان حسناتك في هذا الشهر الفضيل
وعليكم السلام اخي العزيز مهندس عبدلله..
شكرا جزيلا طريقه جيده..
انا كنت أريد طريقه أخرى اذا ممكن بدون مايأثر زمن التأخير على البرنامج الرئيسي للميكروكنترولر اي باستخدام المقاطعات اذا ممكن وبدون التعليمه delay_ms.
شكرا لوقتك اخي الكريم وفي ميزان حسناتك في هذا الشهر الفضيل
تمام معني كلامك انك تريد كود الإنتظار يكون فرعي لأن هناك مهام أخري للميكرو..
حسنا سوف انشئ كود جديد
اولا أخي هذا كود لتفعيل التايمر الداخلي للميكرو اللذي جاء في المشاركه اعلاه وهوا
Pic12f675
كود:
unsigned int ADC_LUX, ADC_ADJ;
unsigned long int TCOUNT;
unsigned short int var1,var2,var3;
// Interrupt Handler
void interrupt()
{
// Timer0 Interrupt - Freq = 15.26 Hz - Period = 0.065536 seconds
if (INTCON.TMR0IF == 1) // timer 0 interrupt flag
{
TCOUNT = TCOUNT + 1;
if (TCOUNT == 100000) //332300 COUNT EQUALS TO 8 HOURS
TCOUNT = 0;
// GPIO.GP4 = ~GPIO.GP4; // Toggle PORTB bit0 LED
INTCON.TMR0IF = 0; // clear the flag
INTCON.TMR0IE = 1; // reenable the interrupt
TMR0 = 0; // reset the timer preset count
}
}
void main() {
ADC_Init();
ADCON0 = 0x00;
ANSEL = 0X03; // AN0 & AN1 CONFIGURED AS ANALOGUE INPUT
TRISIO = 0b00000011;
//GPIO = 0X00;
CMCON = 0x07;
var1 = 0;
var2 = 0;
var3 = 0;
//Timer0 Registers Prescaler= 256 - TMR0 Preset = 0 - Freq = 15.26 Hz - Period = 0.065536 seconds
OPTION_REG.T0CS = 0; // bit 5 TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
OPTION_REG.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
OPTION_REG.PSA = 0; // bit 3 Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
OPTION_REG.PS2 = 1; // bits 2-0 PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 0; // preset for timer register
// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCON.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCON.GIE = 1; // bit7 global interrupt enable
while(1)
{
ADC_ADJ = ADC_READ(0);
ADC_ADJ = ADC_ADJ/1; // divide by 1 for maximum sensitivity * 10 bit resolution
ADC_LUX = ADC_Read(1);
ADC_LUX = ADC_LUX/1;
if (ADC_LUX <= 540 && var1 == 0)
{
GPIO.GP5 = 1;
TCOUNT = 0;
}
if (TCOUNT >= 980 || ADC_LUX >= 710)
{
GPIO.GP5 = 0;
var1 = 1;
}
if (ADC_LUX >= 710)
{
var1 = 0;
}
}
}
ان احببت اكمل علي هذا الميكرو
ولكن انت تقول أن توجد مهام أخري للميكرو لذالك سوف اختار ميكرو أقوي لكي يقوم بالمهمه
وهوا pic16f877a
ايضا لو انت ملتزم برقم ميكرو معين اخبرني به
تفضل اخي هذا طلبك
كود:
unsigned int X,A,DATA1,DATA2;
//Timer0
//Prescaler 1:4; TMR0 Preload = 6; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x81;
TMR0 = 6;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 6;
X++;
if( X==60000 && A==0){ DATA1++; X=0; }
if( DATA1==120 ){PORTB.F0=1; DATA2++; A=1; }
if( DATA2==10000 ){PORTB.F0=0; DATA1=0; DATA2=0; X=0; A=0; }
}
}
void main() {
TRISB=0; PORTB=0;
InitTimer0();
while(1){
//Enter your code here
}
}
في هذا الكود تم استخدام التايمر الداخلي دون أن يتعارض مع مهام البرنامج الأساسي
اولا أخي هذا كود لتفعيل التايمر الداخلي للميكرو اللذي جاء في المشاركه اعلاه وهوا
Pic12f675
كود:
unsigned int ADC_LUX, ADC_ADJ;
unsigned long int TCOUNT;
unsigned short int var1,var2,var3;
// Interrupt Handler
void interrupt()
{
// Timer0 Interrupt - Freq = 15.26 Hz - Period = 0.065536 seconds
if (INTCON.TMR0IF == 1) // timer 0 interrupt flag
{
TCOUNT = TCOUNT + 1;
if (TCOUNT == 100000) //332300 COUNT EQUALS TO 8 HOURS
TCOUNT = 0;
// GPIO.GP4 = ~GPIO.GP4; // Toggle PORTB bit0 LED
INTCON.TMR0IF = 0; // clear the flag
INTCON.TMR0IE = 1; // reenable the interrupt
TMR0 = 0; // reset the timer preset count
}
}
void main() {
ADC_Init();
ADCON0 = 0x00;
ANSEL = 0X03; // AN0 & AN1 CONFIGURED AS ANALOGUE INPUT
TRISIO = 0b00000011;
//GPIO = 0X00;
CMCON = 0x07;
var1 = 0;
var2 = 0;
var3 = 0;
//Timer0 Registers Prescaler= 256 - TMR0 Preset = 0 - Freq = 15.26 Hz - Period = 0.065536 seconds
OPTION_REG.T0CS = 0; // bit 5 TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
OPTION_REG.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
OPTION_REG.PSA = 0; // bit 3 Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
OPTION_REG.PS2 = 1; // bits 2-0 PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 0; // preset for timer register
// Interrupt Registers
INTCON = 0; // clear the interrpt control register
INTCON.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
INTCON.GIE = 1; // bit7 global interrupt enable
while(1)
{
ADC_ADJ = ADC_READ(0);
ADC_ADJ = ADC_ADJ/1; // divide by 1 for maximum sensitivity * 10 bit resolution
ADC_LUX = ADC_Read(1);
ADC_LUX = ADC_LUX/1;
if (ADC_LUX <= 540 && var1 == 0)
{
GPIO.GP5 = 1;
TCOUNT = 0;
}
if (TCOUNT >= 980 || ADC_LUX >= 710)
{
GPIO.GP5 = 0;
var1 = 1;
}
if (ADC_LUX >= 710)
{
var1 = 0;
}
}
}
ان احببت اكمل علي هذا الميكرو
ولكن انت تقول أن توجد مهام أخري للميكرو لذالك سوف اختار ميكرو أقوي لكي يقوم بالمهمه
وهوا pic16f877a
ايضا لو انت ملتزم برقم ميكرو معين اخبرني به
تفضل اخي هذا طلبك
كود:
unsigned int X,A,DATA1,DATA2;
//Timer0
//Prescaler 1:4; TMR0 Preload = 6; Actual Interrupt Time : 1 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x81;
TMR0 = 6;
INTCON = 0xA0;
}
void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 6;
X++;
if( X==60000 && A==0){ DATA1++; X=0; }
if( DATA1==120 ){PORTB.F0=1; DATA2++; A=1; }
if( DATA2==10000 ){PORTB.F0=0; DATA1=0; DATA2=0; X=0; A=0; }
}
}
void main() {
TRISB=0; PORTB=0;
InitTimer0();
while(1){
//Enter your code here
}
}
في هذا الكود تم استخدام التايمر الداخلي دون أن يتعارض مع مهام البرنامج الأساسي
بالتوفيق أخي الكريم
شكرا شكرا شكرا جزيل الشكر مهندس عبدالله هذا ما احتاج اليه فعلا..
بارك الله فيك ساعدتني كثير وجزاك الله خيرا
الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:38 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)