|
:: نائب المشرف العام ::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
|
|
نشاط [ ماجد عباس محمد ]
قوة السمعة:
|
|
18-07-2018, 09:42 AM
المشاركة 77
|
|
الغسالة باستخدام PIC18F و لغة البيزك
قد نفكر فى استخدام 4552 لكن استخدام وحدة usb سيضع تغذية usb على أحد الأطراف المستخدمة كما أننا لا نحتاج هذه الخاصية الآن ، لذا سنستخدم هنا ميكرو PIC18F452 لأن كل أطرافه مطابقة للسابق و لهذا سنجد أن ذات البرنامج فيما عدا بعض المسميات و المسجلات تحتاج تعديل

ما زالت مقاومات التعليق Pull Up فقط لمنفذ B و لتفعيلها نحتاج المسجل INTCON2 وهذا تكوينه

البت رقم 7 لإتاحة أو فصل مقاومات التعليق لأعلى للمنفذ B و فى البدء =1 أى غير متاحة و يجب تصفيرها فى دائرتنا
البت رقم 6 و 5 و 4 لحافة المقاطعات الخارجية صفر ،1، 2 و أى منهم =1 تعنى حافة صاعدة و صفر حافة هابطة.
البت رقم 2 باسم TMR0IP هى أولوية مقاطعة تايمر صفر لزيادة العد حيث 1 تعنى أولوية عالية و صفر أولوية منخفضة
البت رقم 0 أولوية مقاطعة تغيير حالة أطراف المنفذ B حيث 1 تعنى أولوية عالية
الآن نحتاج لتفعيل المقاطعة العامة و كذا المنفذ تايمر صفر و لم نعد نحتاج لمدخل INT0 .

البت 7 باسم GIE وهى المقاطعة العامة وهى عندما تكون = صفر توقف إتاحة المقاطعة أما لو =1 فبحسب البت RCON.7 فى المسجل RCON و المسماة IPEN لو = صفر تتيح كل المقاطعات المتاحة أما لو IPEN = 1 فستتاح كل المقاطعات ذات الأولوية العالية فقط.
البت رقم 6 باسم PEIE فعندما تكون = صفر تمنع إتاحة كافة مقاطعات الدوائر المحيطية (التسلسلى بأنواعه الخ) . أما لو =1 فبحسب البت RCON.7 و المسماة IPEN لو = 1 تتيح كل المقاطعات المحيطة ذات الأولوية المنخفضة أما لو IPEN = صفر فستتاح كل المقاطعات المسموح بها من الدوائر المحيطية .
البت رقم 5 باسم TMR0IE فهى لو =1 تتيح مقاطعة اكتمال العد للتايمر صفر Timer0 OV
البت رقم 4 باسم INT01E لو =1 تتيح المقاطعة الخارجية INT0
البت رقم 3 باسم RBIE هى PortB Interrupt Enable لإتاحة المقاطعة من تغير حالة أطراف منفذ B لو =1
البت رقم 2 باسم TMR0IF هى علامة Flag المقاطعة الفعلية لتايمر صفر
البت رقم 1 باسم INT0IF هى علامة Flag المقاطعة الخارجية الفعلية رقم صفر INT0
البت رقم صفر باسم RBIF هى علامة Flag المقاطعة الفعلية لتغير حالة طرف منفذ B
لاحظ المربع الأحمر بأعلى الصورة و التى تقول يجب على المبرمج التأكد من تصفير العلامات Flags قبل حدوث المقاطعة ليتمكن من استقبال التالية (وهذا عكس أتميل التى تتغير آليا بمجرد الاستجابة للمقاطعة بالكود و توقف باقى المقاطعات حتى نهاية الخدمة و العودة آليا أو أتاحها المبرمج بالكود)
و أخيرا تشغيل و إيقاف التايمر صفر من المسجل T0CON أو تحكم تايمر صفر
PIC18 T0CON Reg.png
بت 7 باسم TMR0ON هى تشغيل = 1 و إيقاف التايمر = صفر
بت 6 باسم T08BIT اختيار 8 بت أم 16 و لو 1 يكون 8 بت
بت 5 باسم TOCS وهى اختيار مصدر العد ولو 1 يكون خارجيا
بت 4 باسم TOSE للحافة ولو 1 للحافة الهابطة
بت 3 باسم PSA لتحديد المقسم السابق Prescaler ولو 1 تعنى غير مستخدم
الباقيات لنسبة التقسيم من صفر تساوى 1:2 إلى 111 أى ثنائى سبعة لنسبة 1:256
و أخيرا القيمة التى تضاف للتايمر تحتاج تعديل فقد تغير اسمه من TMR0 إلى TMR0L
و اصبح الكود هكذا
كود:
program WM18
' Declarations section
dim Switches as byte at PORTB
dim Leds as byte at Portc
Dim Relays As byte at Portd
dim Fullled as sbit at Portc.0
dim Halfled as sbit at Portc.1
dim Smallled as sbit at Portc.2
dim Hotled as sbit at Portc.3
dim Mildled as sbit at Portc.4
dim Coldled as sbit at Portc.5
dim Wateron as sbit at Portc.6
dim Drainon as sbit at Portc.7
dim Hitemp as sbit at Portd.0
dim Midtemp as sbit at Portd.1
dim Waterfull as sbit at Portd.2
dim Waterempty as sbit at Portd.3
dim Run_nspin as sbit at Portd.5
dim Motoron as sbit at Portd.6
dim Heateron as sbit at Portd.7
dim Dooropen as sbit at Portb.0
dim Run as sbit at Portb.1
dim Cold as sbit at Portb.2
dim Mild as sbit at Portb.3
dim Hot as sbit at Portb.4
dim SmallLoad as sbit at Portb.5
dim Half as sbit at Portb.6
dim Full as sbit at Portb.7
تشغيل و إيقاف التايمر
dim Jobpending as bit
' VARIABLES
dim Runtime as word
Dim Rinse , Cntr As Byte
sub procedure interrupt
if TestBit(INTCON, TMR0IF) = 1 then
dec (Runtime)
If Runtime = 0 Then
Jobpending = 0
ClearBit(INTCON, TMR0IF) ' Clear flag
ClearBit(INTCON, TMR0Ie) ' Disable timer
Clearbit (T0Con, TMR0ON) ' stop timer
End If
ClearBit(INTCON, TMR0IF) ' clear Interrupt Timer0 to receive another
' ClearBit is realised as an inline function, and may be called from within an interrupt
end if
end sub
main: ' Main program
Begin:
INTCON2 = 0 ' setting RB Pull up clearing bit RBPU and all falling edge.
intcon = %10100000 ' Interrupt Control GIE All,Peie edge falling, T01E Enable
' INTE External disable , T01 Ov flag,intf ext flag , RBIF port change flag
TRISB = 255
TRISC = 0 ' out
PORTC = %00100100 'small Cold
TRISD = %00011111 ' some in and some out
Heateron = 0
Motoron = 0
Run_nspin = 0
ClearBit(INTCON, TMR0IF) ' Interrupt Timer0 Flag
ClearBit(INTCON, TMR0IE) ' Stop Interrupt Timer0
Cleartbit (T0Con, TMR0ON) ' stop timer
while true ' Loopagain:
while Run = 1 ' Bitwait Run , Set
wend ' Run button release
do
If Full = 0 Then
Leds = Leds Or %00000111
Fullled = 0
Else
if Half = 0 Then
Leds = Leds Or %00000111
Halfled = 0
Else
if SmallLoad = 0 Then
Leds = Leds Or %00000111
Smallled = 0
end if
end if
End If
If Hot = 0 Then
Leds = Leds Or %00111000
Hotled = 0
Else
if Mild = 0 Then
Leds = Leds Or %00111000
Mildled = 0
Else
if Cold = 0 Then
Leds = Leds Or %00111000
Coldled = 0
end if
end if
End If
loop until run = 0 ' Wait Run Press
while DoorOpen = 1 ' Bitwait Dooropen , Reset ' Wait Door to close
wend
WaterOn = 1 ' Set Wateron Open Water Valve
while Waterfull = 1 ' Bitwait Waterfull , Reset ' Wait full Tank
wend
WaterOn = 0 ' ReSet Wateron ' Close water Valve
If Coldled = 1 Then ' not Cold then
Heateron = 1 ' Heater on
If Mildled = 0 Then
while Midtemp = 1 ' Bitwait Midtemp , Reset
wend
Else
while Hitemp = 1 ' Bitwait Hitemp , Reset
wend
end if
HeaterOn = 0 ' Set Heateron ' Turn off heater
End If ' Now Start Washing
If Fullled = 0 Then
Runtime = 20 * 60
else ' Elseif Halfled = 0 Then
if Halfled = 0 Then
Runtime = 480
Else
Runtime = 300
end if ' because elseif in not supported in MikroElektronika producta
End If
' Runmotor:
Jobpending = 1 ' Set Jobpending ' Timing flag
Motoron = 1 ' Motoron = 0 ' Start Motor
TMR0L = 205 ' Load Tomer0
SetBit(INTCON, TMR0IE) ' enable Timer0
setBit(INTCON, TMR0IF) ' Interrupt Timer0 Flag
setbit (T0Con, TMR0ON) ' start timer
while jobPending = 1 ' Bitwait Jobpending , Reset ' Wait to Finish
wend
motorOn = 0 ' Set Motoron ' stop motor
For Cntr = 1 To Rinse
Drainon = 1 ' Reset Drainon ' Open Drain
while Waterempty = 1 ' Bitwait Waterempty , Reset ' Wait Drain
wend
DrainOn = 0 ' Set Drainon ' Close Drain
WaterOn = 1 ' Reset Wateron ' Fill again
while WaterFull = 1 ' Bitwait Waterfull , Reset
wend
WaterOn = 0 ' Set Wateron ' Close Water
Runtime = 300 ' Rinse Time
TMR0L = 205
Jobpending = 1 ' Set Jobpending
Motoron =1 ' Reset Motoron ' Start Rinse
SetBit(INTCON, TMR0IE) ' enable Timer0 ' Start Timer0 ' Start Timer
setBit(INTCON, TMR0IF) ' Interrupt Timer0 Flag
setbit (T0Con, TMR0ON) ' start timer
while Jobpending = 1 ' Bitwait Jobpending , Reset ' Wait to Finish
wend
Motoron = 0 ' Set Motoron ' Stop Rinse
Next cntr
MotorOn = 0 ' Set Motoron ' Stop Rinse
DrainOn = 1 ' Reset Drainon ' Open Drain second cycle
while Waterempty = 1 ' Bitwait Waterempty , Reset ' Wait Drain
wend
Runtime = 180 ' SPIN
JobPending = 1 ' Set Jobpending
motorOn = 1 ' Reset Motoron ' Start Spin
Run_nSpin = 1 ' Reset Run_nspin ' SPIN
TMR0L = 205
Jobpending = 1
SetBit(INTCON, TMR0IE) ' enable Timer0 ' Start Timer0
setBit(INTCON, TMR0IF) ' Interrupt Timer0 Flag ' Start Timer0
setbit (T0Con, TMR0ON) ' start timer
while JobPending = 1 ' Bitwait Jobpending , Reset ' Wait to Finish
wend
Relays = 255 ' ALL OFF, INITIAL State
wend ' Goto Loopagain
end.
المرة القادمة إن شاء الله نعيدهم بلغة C
|