Senin, 09 November 2009

Interupsi pada MCS-51

Gelombang kotak dengan frekuensi variabel 

Pembangkit gelombang kotak dengan frekuensi variabel ini mendaya-gunakan 2 sistem interupsi MCS51, masing-masing adalah interupsi Timer 0, ditambah dengan interupsi Ekternal 0.

Setiap kali tombol SW1 ditekan, Q1 dari U2 74121 akan mengeluarkan pulsa nol sesaat, lebar pulsa tersebut ditentukan oleh nilai kapasitor C4 dan resistor R4 yang nilainya bisa di-rubah. Pulsa nol dari U2 74121 dipakai untuk menginterupsi U1 AT89C2051 lewat INT0 (P3.2, kaki nomor 6).

Permintaan interupsi terjadi pada saat kaki INT0 berubah dari ‘1’ menjadi ‘0’. Program Layanan Interupsi (ISR – Interrupt Service Routine) untuk Interupsi Eksternal 0 bertugas mengukur periode waktu kaki INT0 bernilai ‘0’



Gambar 4 Pembentuk Gelombang Kotak

Program 2 : Gelombang kotak dengan frekuensi variabel

01: Clock bit P1.7

02: Pulse bit P3.2

03: ;

04: ; Vektor Reset

05: ORG $0000

06: LJMP Start

07: ;

08: ; Vektor interupsi Eksternal 0

09: ORG $0003

10: LJMP MengukurPulsa

11: ;

12: ; Vektor interupsi Timer 0

13: ORG $000B

14: LJMP MembuatClock

15: ;

16: Start:

17: MOV TMODE,#$01

18: SETB IT0

19: SETB EX0

20: SETB EA

21: TanpaHenti:

22: SJMP TanpaHenti

23: ;

24: ; ISR interupsi eksternal

25: MengukurPulsa:

26: MOV TH0,#0

27: MOV TL0,#1

28: SETB TR0

29: JNB Pulse,$

30: CLR TR0

31: XRL TH0,#$FF

32: XRL TL0,#$FF

33: MOV A,#1

34: ADD A,TL0

35: MOV R2,A

36: MOV A,#0

37: ADDC A,TH0

38: MOV R3,A

39: SETB ET0

40: SETB TF0

41: RETI

42: ;

43: ; ISR interupsi timer 0

44: MembuatClock:

45: CLR TR0

46: MOV TH0,R3

47: MOV TL0,R2

48: CPL Clock

49: SETB TR0

50: RETI

51: ;

52: END

Program utama terletak pada baris 16 sampai 22. Baris 17 mengatur Timer 0 bekerja pada Mode 1 - Pencacah Biner 16 bit, yakni menghubungkan TL0 dan TH0 menjadi satu. Baris 18 menentukan yang dianggap sebagai sinyal interupsi adalan perubahan tegangan pada kaki INT0 dari ‘1’ menjadi ‘0’. Baris 19 mengaktipkan sistem interupsi eksternal 0 dan baris 20 mengaktipkan sistem interupsi AT89C2051 secara keseluruhan. Tapi saat ini interupsi Timer 0 belum diaktipkan.

Seperti halnya contoh program pertama, AT89C2051 akan berputar-putar pada baris 21 dan 22.Saat tegangan pada kaki INT0 berubah dari ‘1’ menjadi ‘0’, bit IE0 menjadi ‘1’ yang merupakan sinyal permintaan interupsi eksternal 0, hal ini mengakibatkan AT89C2051 mengerjakan rutin MengukurPulsa yang merupakan ISR interupsi eksternal 0 (baris 25 sampai 41).

Dalam ISR ini, lebar pulsa pada kaki INT0 dengan Timer 0. Baris 26 dan 27 membuat TH0 dan TL0 bernilai 0. Baris 28 membuat Timer 0 mulai mencacah, dan baris 29 menunggu tegangan pada kaki INT0 kembali menjadi ‘1’, dan selama itu Timer 0 terus mencacah. Baris 30 menghentikan Timer 0, nilai yang tersimpan dalam TH0 dan TL0 saat itu merupakan panjang pulsa dalam satuan mikro-detik.

Lebar pulsa yang didapat dari pengukuran ini akan dipakai untuk menentukan frekuensi gelombang kotak yang dibangkitkan. Lebar pulsa ini dinegatipkan dan disimpan ke dalam R2 dan R3 pada baris 31 sampai 38.

Baris 39 mengaktifkan permintaan interupsi dari Timer 0, dan baris 40 (SETB TF0) membangkitkan permintaan interupsi timer 0 yang pertama kali lewat program.

Rutin Membuat Clock (baris 44 sampai 50) merupakan ISR untuk interupsi Timer 0. Dalam rutin ini mula-mula sumber sinyal denyut (clock) untuk Timer 0 dihentikan (baris 45), setelah itu TH0 dan TL0 diisi ulang dengan nilai hasil pengukuran pulsa yang sudah disimpan dalam R2 dan R2 (baris 46 dan 47). Level tegangan pada P1.7 dibalik pada baris 48, setelah itu sumber sinyal denyut Timer 0 diaktipkan kembali pada baris 49.

mY eveRytHing