|
:: نائب المشرف العام ::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
|
|
نشاط [ ماجد عباس محمد ]
قوة السمعة:
|
|
12-08-2018, 08:27 AM
المشاركة 107
|
|
الآن كتبنا و نريد أن نقرأ و يمكننا أن نقرأ بايت واحدة أو أى عدد من البيتات بلا حد أقصى فلووصلت لنهاية القطعة سيعود المؤشر للصفر ليبدأ من أول الذاكرة مرة أخرى . نحتاج إرسال عنوان هذه القطعة مع أمر قراءة . ولقراءة عدد من البايت سنحتاج قراءة العدد كله ماعدا الأخيرة و نرسل بعد كل منهم Ack للقطعة و إلا لن تستجيب. ثم تقرأ الأخيرة و يرسل بعدها Stop و هكذا الكود حيث نضع فى عداد للبايت العدد ناقص واحد وهنا نريد قراءة 8 فنضع 7 و يمكنك استخدام متغير باسم ByteNu و تطرح منه واحد أو تضع فى ByteCount عدد البايت و تبدأ الكود بالأمر DEC ByteCount ثم تنتظر و تطلب كود SendPgAdd السابق لإرسال العنوان للقطعة و عنوان الكتابة و هكذا حددت العنوان ثم ترسل STOP ثم عنوان القطعة و تكتب بايت مع أمر قراءة و هنا نبدأ الدورة.
كود:
ReadMem: ; Read 8 memory locations from EEprom Address in PgAddress to RAM address in R0
MOV ByteCount,#7 ; loop counter, send only 7 bytes with ack, then one with stop
ACALL Wait_9
ACALL SendPgAdd ; send start command,PgAddress,no stop
ACALL MemStop ; Send stop to read sequentially at current location
ACALL Wait_9
ACALL MemStart ; send start command
MOV A,#10100001b ; Device address 1010,page 000 and Read bit
ACALL WriteMemByte
NxtRead:
ACALL ReadMemByte ; result in A
ACALL SendEEAck
MOV *R0,A
INC R0
DJNZ ByteCount,NxtRead
ACALL ReadMemByte ; read the 8th
MOV *R0,A
ACALL MemStop
RET
طبعا يجب أن نضع فى R0 أو R1 عنوان الذاكرة حيث نريد أن نبدأ حفظ ما نقرأ ثم نطلب كود قراءة بايت التالى شرحة ثم نرسل نبضة ACK كما سيلى شرحة فنجد نتيجة القراءة فى المراكم A و من ثم نحفظه فى العنوان المشار إليه بالمسجل المختار سواء R0 أو R1 ثم ننقص عد البايت و ننتقل لو لا = صفر لنكرر القراءة و عندما ينتهى العد نقرأ الأخيرة ثم نحفظها ثم نرسل STOP و نعود.
الآن كيف نقرأ بايت واحدة؟
طبعا عدد البت =8 ثم ننشئ دورة من ننتظر ثم نرسل نبضة برفع SCL =1 و الانتظار ثم ننقل الرد من طرف SDA إلى C لأنه لا غيره يمكن النقل منه و إليه. ثم ننفذ الأمر RLC أى Rotate Left with Carry لنضعه فى البت صفر و التى باستمرار الإزاحة ستصبح فى النهاية رقم 7 ثم ننهى النبضة بخفض SCL ثم ننقص العد واحد ونكرر لنهاية 8 بت ثم ننتظر و نعود دون نبضة توقف Stop لنتمكن من قراءة التالية إن أردنا.
كود:
ReadMemByte: ; Reads 8 bit from mem to A, neither Ack nor stop pulse
MOV BitCount,#8
RMB00:
ACALL Wait_9
SETB SCL ; send clock
ACALL Wait_9
MOV C,SDA ; Get data, MSD first
RLC A ; MSD first
CLR SCL ; clock end
DJNZ BitCount,RMB00
ACALL Wait_9
RET
SendEEAck: ; Send ACK code, ret w/ SCL low
CLR SDA
ACALL Wait_9
ACALL MemClk
SETB SDA ; make it input again
ACALL Wait_9
RET
طبعا بعد استقبال 8 بت لابد هنا من أن ترسل ACK للقطعة لتستقبل البايت التالية وهى بتصفير SDA و الانتظار ثم نطلب كود إرسال نبضة ثم نضع SDA=1 ليصبح دخول للمتحكم مرة أخرى و ننتظر ثم نعود
لم يبقى سوى دورات التأخير أو قضاء الوقت أو الانتظار وهى إما مجموعة من NOP وهى تستهلك دورة أو دورات من العد باستخدام مسجل أو خانة ذاكرة
كود:
; Delay routines at 11.059Mhz Xstal has 1.085 uS per cycle, clk rate = 0.92 MHz=920KHz
; --------------------------------------------------------
' time: 9 cyc. (incl. ACALL/RET)=9.765 uSec
' stack: 2 (incl. ACALL/RET)=4
Wait_9:
NOP
NOP
NOP
NOP
NOP
RET
; ---------------------------------------------------------------
; destroys: Nothing
; time: 9326 cyc. (incl. ACALL/RET)=10.11871 ms
; stack: 4 (incl. ACALL/RET)=4
Wait_10ms:
MOV DelTime1,#20
_W10ms: MOV DelTime2,#231
DJNZ DelTime2,$
DJNZ DelTime1, _W10ms
RET
القراءة و الكتابة فى ذاكرة المتحكم سهلة نوعا ما بكود الأسيمبلى و لذا سنستخدم المتحكم AT89S5283 ذو 2 ك ذاكرة داخلية EEPROM فيمكن الكتابة و القراءة فيها.
الآن نحتاج عرض البيانات على الشاشة وهو موضوعنا القادم إن شاء الله.
|