LAMPIRAN A SKEMA RANGKAIAN

51

LAMPIRAN B LISTING PROGRAM ASSEMBLY

.equ

StartPRG= 4096-271-274-274-274-274

.include "m8def.inc" .equ .equ .equ .equ .equ

StartRAM=$60 data=$80 buffer=$60 EEAR=EEARL UBRR=UBRRL

.def .def .def .def .def

copyL =r12 copyH =r13 mp10L =r14 mp10H adder =r19

.def .def .def .def .def

tbinL =r14 tbinH =r15 fBCD0 =r16 fBCD1 =r17 fBCD2 =r18

;Low byte of binary result (same as mp10L) ;High byte of binary result (same as mp10H) ;BCD value digits 1 and 0 ;BCD value digits 2 and 3 ;BCD value digit 4

.def .def .def .def

fbinL =r8 fbinH =r9 cnt16a =r20 tmp16a=r21

;binary value Low byte ;binary value High byte ;loop counter ;temporary value

.def .def .def .def .def

wReg wReg1 gstatus hitung timer

.org

StartPRG

=r15

= r25 = r24 = r23 = r18 = r22

;temporary register ;temporary register ;Low byte of number to be multiplied by 10 ;High byte of number to be multiplied by 10 ;value to add after multiplication

;working register (like PIC16F84) ;register bantu

; ///////////////////////// initialization////////////////////////////// init: ldi wReg,low(RAMEND)

52

out ldi out

SPL,wReg wReg,high(RAMEND) SPH,wReg

ldi out ldi out out

wReg,0b00000010 ddrD,wReg ;set portD direction wReg,0b11111111 portD,wReg ;set initial values to portD pinD,wReg ;set initial values to pinD ;(seems necessary for the simulator!)

ldi out ldi out out

wReg,0b00000010 ddrB,wReg ;set portB direction wReg,0b11111111 portB,wReg ;set initial values to portB pinB,wReg ;set initial values to pinB ;(seems necessary for the simulator!) wReg,0b0000000 ddrC,wReg ;set portC direction wReg,0b0000000 portC,wReg ;set initial values to portC pinC,wReg ;set initial values to pinC ;(seems necessary for the simulator!)

ldi out ldi out out

;these lines are for higher version

set_adc: ldi out ldi out

wReg,0b00000100 ADMUX,wReg ;set ADC parameter (ADMUX) wReg,0b10000110 ADCSR,wReg ;set ADC parameter (ADCSR)

set_rs232: ldi out ldi out

wReg,51 UBRR,wReg ;set baudrate 9600 wReg,0b10011000 UCSRB,wReg ;set Rx complete interrupt enable

set_pwm: ldi out ldi out

wReg,0b11000011 TCCR1A,wReg wReg,0b00000010 TCCR1B,wReg

set_timer2: ldi out ldi

wReg,0b01000000 TIMSK,wReg wReg,0x01

;set PWM mode ;set CK/***

;aktifkan overflow interrupt enable ;masukkan nilai timer

53

out ldi

TCNT2,wReg wReg,0b00000111

out

TCCR2,wReg

;masukkan prescaler untuk timer,

1024

set_misc: cli clr clr clr

XH YH ZH

; ///////////////////////// main program//////////////////////////////// rcall hello ldi timer,0x00 ldi hitung,0x00 Start: sei ;global interrupt enable sbrs gstatus,0 ;check data dari PC rjmp start cli ;global interrupt disable cbr gstatus,0b00000001 ldi XL,buffer ld wReg,X+ cpi wReg,'N' ;validasi data brne abort ld wReg,X+ cpi wReg,'C' breq do_satu cpi wReg,'V' breq do_dua cpi wReg,'Z' breq softReset rjmp abort ;//////////////////////////command////////////////////////////////////// abort: rjmp start softReset: rjmp

0x00

do_satu:ld subi mov swap ld subi add

wReg,X+ wReg,48 fBCD1,wReg fBCD1 wReg,X+ wReg,48 fBCD1,wReg

;set current

54

ld subi mov swap ld subi add rcall mov mov out out rjmp do_dua: rcall rcall rcall rjmp

wReg,X+ wReg,48 fBCD0,wReg fBCD0 wReg,X+ wReg,48 fBCD0,wReg BCD2bin16 wReg1,tbinH wReg,tbinL OCR1AH,wReg1 OCR1AL,wReg start ldi hitung,0x00 rata2 bin2BCD kirim_BCD start

;menampilkan data ke PC

; ///////////////////////// sub-routines (general)////////////////////// var_delay: mov r0,wReg rjmp delay0 short_delay: ldi wReg,10 mov r0,wReg ;output value to r0 to set delay (short) rjmp delay0 long_delay: ldi wReg,45 mov r0,wReg ;output value to r0 to set delay (long) delay0: ldi wReg,2 mov r1,wReg ldi wReg,2 mov r2,wReg delay1: dec r2 brne delay1 dec r1 brne delay1 dec r0 brne delay1 ret EERead:

55

out sbic rjmp sbi

in ret xmit: cbi out sbis rjmp rcall ret a2d_conv: sbi a2d_0: sbic rjmp rcall ret a2d_read: in in ret

EEAR,wReg ;output address EECR,EEWE ;if EEWE not clear EERead ;...wait more EECR,EERE ;set EEPROM Read strobe ;This instruction takes 4 clock cycles since ;it halts the CPU for two clock cycles wReg,EEDR ;get data

UCSRA,TXC UDR,wReg UCSRA,TXC xmit+2 short_delay

ADCSR,ADSC ADCSR,ADSC a2d_0 a2d_read

fbinL,ADCL fbinH,ADCH ;read A2D conversion result (L first)

bin2BCD:ldi clr clr clr bBCDx_1:lsl rol rol rol dec brne ret

cnt16a,16 r14 r13 ZH fbinL fbinH r13 r14 cnt16a bBCDx_2

;Init loop counter

;clear ZH (not needed for AT90Sxx0x) ;shift input value ;through all bytes ;

bBCDx_2:ldi bBCDx_3:ld subi sbrc st

r30,16 tmp16a,-Z tmp16a,-$03 tmp16a,3 Z,tmp16a

;Z points to result MSB + 1 ;get (Z) with pre-decrement ;add 0x03 ;if bit 3 not clear ; store back

;decrement loop counter ;if counter not zero ; return

56

ld subi sbrc st cpi brne rjmp kirim_BCD: ldi mov swap andi add rcall mov andi add rcall mov swap andi add rcall mov andi add rcall ldi rcall ret mul10a: nibble swap mul10b: nibble mov mov lsl rol lsl rol lsl rol lsl

tmp16a,Z tmp16a,-$30 tmp16a,7 Z,tmp16a ZL,13 bBCDx_3 bBCDx_1

;get (Z) ;add 0x30 ;if bit 7 not clear ; store back ;done all three? ;loop again if not

wReg1,48 wReg,r14 wReg wReg,0b00001111 wReg,wReg1 xmit wReg,r14 wReg,0b00001111 wReg,wReg1 xmit wReg,r13 wReg wReg,0b00001111 wReg,wReg1 xmit wReg,r13 wReg,0b00001111 wReg,wReg1 xmit wReg,13 xmit

;nolkan bit 4-7

;nolkan bit 4-7

;nolkan bit 4-7

;nolkan bit 4-7

;***** multiplies "mp10H:mp10L" with 10 and adds "adder" high adder ;***** multiplies "mp10H:mp10L" with 10 and adds "adder" low copyL,mp10L ;make copy copyH,mp10H mp10L ;multiply original by 2 mp10H copyL ;multiply copy by 2 copyH copyL ;multiply copy by 2 (4) copyH copyL ;multiply copy by 2 (8)

57

rol add adc andi add brcc inc m10_1:

copyH mp10L,copyL ;add copy to original mp10H,copyH adder,0x0f ;mask away upper nibble of adder mp10L,adder ;add lower nibble of adder m10_1 ;if carry not cleared mp10H ; inc high byte ret

BCD2bin16: andi fBCD2,0x0f ;mask away upper nibble of fBCD2 clr mp10H mov mp10L,fBCD2 ;mp10H:mp10L = a mov adder,fBCD1 rcall mul10a ;mp10H:mp10L = 10a+b mov adder,fBCD1 rcall mul10b ;mp10H:mp10L = 10(10a+b)+c mov adder,fBCD0 rcall mul10a ;mp10H:mp10L = 10(10(10a+b)+c)+d mov adder,fBCD0 rcall mul10b ;mp10H:mp10L = 10(10(10(10a+b)+c)+d)+e ret hello: ldi rcall rcall ldi rcall rcall ldi rcall rcall ret

wReg,'N' xmit short_delay wReg,'0' xmit short_delay wReg,'8' xmit short_delay

rata2: ldi mov mov ldi cpi breq clc ld ld add adc

wReg,0x00 fbinL,wReg fbinH,wReg YL,data+1 hitung,4 rotate wReg1,-Y wReg,-Y fbinL,wReg fbinH,wReg1

58

inc rjmp rotate: ldi clc ror ror clc ror ror ret

hitung rata2+4 hitung,0x00 fbinH fbinL fbinH fbinL

;//////////////////////////interrupt//////////////////////////////////// get_char: ldi ZL,buffer sbr gstatus,0b00000001 in wReg,UDR st Z+,wReg get_0: sbis UCSRA,RXC rjmp get_0 in wReg,UDR st Z+,wReg cpi wReg,13 breq get_2 cpi ZL,buffer+7 breq get_1 rjmp get_0 get_1: dec ZL ldi wReg,13 st Z,wReg cbr gstatus,0b00000001 get_2: reti loopcounter: inc cpi breq rjmp data1: rcall inc st st ldi ldi rjmp data2: cpi breq

timer timer,11 data2 data4 a2d_conv ZL -Z,fbinH -Z,fbinL timer,0x00 hitung,0x00 data4 hitung,2 data1

59

ldi ldi inc data3: cpi breq ld st rjmp data4: ldi out reti

YL,data ZL,data+1 hitung YL,data-7 data2 wReg,-Y -Z,wReg data3 wReg,0x01 TCNT2,wReg

;masukkan nilai timer

; ///////////////////////// interupts handling////////////////////////// .exit .cseg .org 00 rjmp

60

;give some area for various interupts

.org

0x04 rjmp loopcounter

.org

0x0b rjmp get_char

;Rx interrupt masuk ke subrutin get_char

60 clt bld

;let r31,7 CLEAR

.org

r31,7

;modification for atMega8 from 4433 .exit .equ EEAR =EEARL .equ OCR1L =OCR1AL .equ OCR1H =OCR1AH .equ UBRR =UBRRL

60

LAMPIRAN C LISTING PROGRAM VISUAL BASIC

Public PortName As String Public PortOpen As Integer Public PerEventCounter As Integer Public EventCounter As Integer Private Symbols(32) As String Private Sub Command1_Click() Dim Strng As String Strng = ConvertToBin("N" & "C" & TextWrite.Text & Chr(13)) Result = IO1.WriteString(Strng) End Sub

Private Sub Command3_Click() Dim Strng As String Strng = ConvertToBin("NV" & Chr(13)) Result = IO1.WriteString(Strng) TextRead.Text = "" TextRead.Text = ConvertFromBin(IO1.ReadString(120)) End Sub

Private Sub Command5_Click() TextRead.Text = "" TextWrite.Text = "" IO1.Close PortOpen = False StatusBar1.Panels("Status").Text = "Status: Offline" StatusBar1.Panels("Setting").Text = " "

61

End Sub Private Sub Form_Load() Dim Result As Integer 'PortName = "COM1" If PortOpen = True Then IO1.Close PortOpen = False Else Result = IO1.Open("COM1", "baud=9600 parity=N data=8 stop=1") StatusBar1.Panels("Status").Text = "Status: Online" StatusBar1.Panels("Setting").Text = "Setting: COM1, 9600, n, 8, 1" End If If (Result = 0) Then StatusBar1.Panels("Status").Text = "Status: Offline" StatusBar1.Panels("Setting").Text = " " PortOpen = False End If End Sub

Private Sub mnConnect_Click() Dim Result As Integer 'PortName = "COM1" If PortOpen = True Then IO1.Close PortOpen = False Else Result = IO1.Open("COM1", "baud=9600 parity=N data=8 stop=1") StatusBar1.Panels("Status").Text = "Status: Online" StatusBar1.Panels("Setting").Text = "Setting: COM1, 9600, n, 8, 1" End If If (Result = 0) Then StatusBar1.Panels("Status").Text = "Status: Offline" StatusBar1.Panels("Setting").Text = " " PortOpen = False

62

End If End Sub Private Sub mnDisconnect_Click() IO1.Close PortOpen = False StatusBar1.Panels("Status").Text = "Status: Offline" StatusBar1.Panels("Setting").Text = " " End Sub Private Sub mnExit_Click() IO1.Close PortOpen = False StatusBar1.Panels("Status").Text = "Status: Offline" StatusBar1.Panels("Setting").Text = " " Unload Me End Sub Public Function ConvertFromBin(Strng As String) As String Dim NewStr As String Dim Value As Integer Dim Number As String For n = 1 To Len(Strng) If Mid(Strng, n, 1) < " " Then Value = Asc(Mid(Strng, n, 1)) Number = Format(Value) If CheckSym = 1 Then If Right(Symbols(Value), 1) = ">" Then NewStr = NewStr + "" Then n = n + Len(Symbols(Number)) Else n = n + Len(Symbols(Number)) + 1 End If 'n = n + 3 Else NewStr = NewStr + Chr(Number) n=n+2 If (Number >= 10) Then n = n + 1 If (Number >= 100) Then n = n + 1 End If Else NewStr = NewStr + Mid(Strng, n, 1) End If Next n ConvertToBin = NewStr End Function

64