;Urspruengliche Datei: Interface.asm, Input/Output mit 9600 Baud
;von Burkhard Kainka,
;Aenderungen: neues Kommando 5
;sowie Kommandos 104 und 105, damit
;einfache Logikanalyse moeglich ist
.include "tn13def.inc"
.def A = r16
.def Delay = r17
.def Count = r18
.def Kom = r19
.def B = r20
.def C = r21
.def D = r22
.def Count2 = r23
.def EEadr = r24
.def EEmode = r25
.def div_f = r30 ; neu
.def tmp1 = r31 ; neu
;Port B
.equ TXD = 1
.equ RXD = 2
rjmp Anfang
Anfang:
sbi ddrb,TXD ;Datenrichtung TXD
ldi div_f,3 ;neu
rcall AdcInit
rcall ADCrd
rcall OscKorrektur
Schleife:
rcall RdCOM
mov Kom,A
k1: cpi Kom,1
brne K5 ;war brne K16
ldi A,100
rcall WrCOM
k5: cpi Kom,5 ;neues Kommando
brne K16
rcall RdCOM
mov div_f,A
rcall AdcInit ;neuen Wert uebernehmen
k16: cpi Kom,16
brne K17
rcall RdCOM
andi A,0b00011001
out portb,A
k17: cpi Kom,17
brne K18
rcall RdCOM
andi A,0b00011011
ori A,0b00000010
out ddrb,A
k18: cpi Kom,18
brne K32
ldi A,0 ;PWM initialisieren
out OCR0A, A
ldi A,0x83
out TCCR0A, A
ldi A,0x02
out TCCR0B, A
k32: cpi Kom,32
brne K48
in A,pinb
rcall WrCOM
k48: cpi Kom,48
brne K49
ldi A,2
rcall AD8Bit
rcall WrCOM
k49: cpi Kom,49
brne K56
ldi A,3
rcall AD8Bit
rcall WrCOM
k56: cpi Kom,56
brne K57
ldi A,2
rcall ADCrd
rcall WrCOM
mov A,B
rcall WrCOM
k57: cpi Kom,57
brne K64
ldi A,3
rcall ADCrd
rcall WrCOM
mov A,B
rcall WrCOM
k64: cpi Kom,64
brne K100
rcall RdCOM
out OCR0A,A
k100: cpi Kom,100 ;Oszi 1 Kanal
brne K101
Oszi: ldi XL,96
ldi XH,0
ldi Count2,61
O100: rcall ADCrd8BitB4
st X+,A
dec Count2
brne O100 ;61 mal
ldi XL,96
ldi XH,0
ldi Count2,61
O101:
Ld A,X+
rcall WrCOM
dec Count2
brne O101 ;61 mal
k101: cpi Kom,101 ;Oszi 2 Kanal
brne k104 ; war brne K250
Oszi2:ldi XL,96
Ldi XH,0
Ldi Count2,31
O102: rcall ADCrd8BitB4
St X+,A
rcall ADCrd8BitB3
st X+,A
dec Count2
brne O102 ;31 mal
ldi XL,96
ldi XH,0
ldi Count2,62
O103:
Ld A,X+
rcall WrCOM
dec Count2
brne O103 ;31 mal
k104: ; einf. Logikanalyse
cpi Kom,104 ; 1 Kanal
brne k105
ldi XL,96
ldi XH,0
ldi Count2,62
mov tmp1,div_f
cbi ddrb,4
Trig:
sbis Pinb,4 ; Start bei High
rjmp Trig
o104:
rcall LogAnB4
st X+,A
dec Count2
brne o104 ;61 mal
ldi XL,96
ldi XH,0
ldi Count2,61
o105:
Ld A,X+
rcall WrCOM
dec Count2
brne o105 ;61 mal
k105:
cpi Kom,105 ; 2 Kanaele
brne k250
LgAn2:
ldi XL,96
Ldi XH,0
Ldi Count2,31
mov tmp1,div_f
cbi ddrb,4 ;Eingang
cbi ddrb,3 ;Eingang
;Trig2:
; sbis Pinb,4 ; Start bei High
; rjmp Trig2
o106:
rcall LogAnB4
St X+,A
rcall LogAnB3
st X+,A
dec Count2
brne o106 ; 31 mal
ldi XL,96
ldi XH,0
ldi Count2,62
o107:
Ld A,X+
rcall WrCOM
dec Count2
brne o107 ;31 mal
k250: cpi Kom,250
brne K251
rcall RdRXD
rcall WrCOM
k251: cpi Kom,251
brne K252
in A, osccal
rcall WrCOM
k252: cpi Kom,252
brne K253
ldi EEadr,63
rcall RdEE
rcall WrCOM
k253: cpi Kom,253
brne K254
rcall RdCOM
ldi EEadr,63
rcall WrEE
k254: cpi Kom,254
brne K255
rcall RdCOM
out osccal,A
k255: cpi Kom,255 ;RC-Osc. kalibireren
brne SchleifenEnde
rcall Cal ;20 x Byte 0
SchleifenEnde:
rjmp Schleife
LogAnB4:
ldi a,0b00000000
sbic pinb,4
ldi a,0b10000000
LogAn0:
mov tmp1,div_f
D_lgAn0: ;Warteschleife
dec tmp1
brne D_LGAn0
ret
LogAnB3:
ldi a,0b00000000
sbic pinb,3
ldi a,0b10000000
LgAn0:
mov tmp1,div_f
D_lgA0: ;Warteschleife
dec tmp1
brne D_lgA0
ret
OscKorrektur: ;OSCCAL in EEPROM(63)
ldi EEadr,63
rcall RdEE
in B, osccal
sub B,A
cpi B,5 ;Abweichung <5?
brlo OscCopy
cpi B,252 ;Abweichung >-5?
brsh OscCopy
ret
OscCopy:
rcall WrCOM
ldi EEadr,63
rcall RdEE
out osccal,A
ret
Cal:
in B,osccal
ldi D, 10 ;maximale Abweichung
subi B,10
ldi Count2,20
C1:
out osccal, B
rcall RdRXD ;Zeit messen
subi A,225 ;Byte 0: 225
cpi A,128
brlo C1b
com A
C1b:
cp A,D
brsh C3
rcall Hit
C2:
cpi A,3
brsh C3
rcall Hit
C3:
rcall WrCOM
inc B
dec Count2
brne C1
subi B,10 ;alter Wert in osccal
mov A,C ;neuer Wert
out osccal,A
ldi EEadr,63
rcall WrEE
rcall WrCOM
mov A,B
rcall WrCOM
ret
Hit:
mov C,B ;besserer Osccal-Wert in C
inc A
mov D,A ;kleinerer Grenzwert in D
dec A
ret
RdRXD:
sbis PINB,RXD ;9,6 kBaud, 25/Bit
rjmp RdRXD
ldi A,0
RXD0: inc A ;1
nop ;1
sbic PINB,RXD ;2
rjmp RXD0 ;1, 5 Takte
ret
AD8Bit:
out ADMUX,A
sbi ADMUX,ADLAR ;Left adjust
sbi ADCSRA,ADSC ;Wandlung starten
AD8rdy:
sbic ADCSRA,ADSC
rjmp AD8rdy
sbi ADCSRA,ADSC
AD8rdyb:
sbic ADCSRA,ADSC
rjmp AD8rdyb
in A,ADCH
ret
ADCrd:
out ADMUX,A
sbi ADCSRA,ADSC ;Wandlung starten
AD10rdy:
sbic ADCSRA,ADSC
rjmp AD10rdy
sbi ADCSRA,ADSC
AD10rdyb:
sbic ADCSRA,ADSC
rjmp AD10rdyb
in B,ADCL
in A,ADCH
ret
AdcInit:
;ldi A,3
out ADCSRA,div_f
sbi ADCSRA,ADEN ;AD einschalten
ret
ADCrd8BitB4: ;8 Bit ADC2
ldi A, 34
out ADMUX,A
sbi ADCSRA,ADSC
AD4rdy:
sbic ADCSRA,ADSC
rjmp AD4rdy
sbi ADCSRA,ADSC
AD4rdyb:
sbic ADCSRA,ADSC
rjmp AD4rdyb
in A,ADCH
ret
ADCrd8BitB3: ;8 Bit ADC3
ldi A, 35
out ADMUX,A
sbi ADCSRA,ADSC
AD3rdy:
sbic ADCSRA,ADSC
rjmp AD3rdy
sbi ADCSRA,ADSC
AD3rdyb:
sbic ADCSRA,ADSC
rjmp AD3rdyb
in A,ADCH
ret
RdCOM: sbis pinb,RXD ;Empfangen
rjmp RdCOM
ldi Delay,58
D1: dec Delay
brne D1
ldi A,0
ldi Count,8
L1: lsr A
sbic pinb,RXD
ori A,128
ldi Delay, 38
D2: dec Delay
brne D2
dec Count
brne L1
ldi Delay, 38
D3: dec Delay
brne D3
com A
ret
WrCOM: sbi portb,TXD ;Senden
ldi Delay,38
D4: dec Delay
brne D4
ldi Count,8
L2: sbrc A,0
rjmp OFF
rjmp ONt
ONt: sbi portb,TXD
rjmp BitD
OFF: cbi portb,TXD
rjmp BitD
BitD: ldi Delay,38
D5: dec Delay
brne D5
lsr A
dec Count
brne L2
cbi PORTB,TXD
ldi Delay,38
D6: dec Delay
brne D6
ret
RdEE: sbic EECR,EEWE
rjmp RdEE
out EEAR,EEadr
sbi EECR,EERE
in A,EEDR
ret
WrEE: sbic EECR,EEWE
rjmp WrEE
ldi EEmode,0
out EECR,EEmode
out EEARL,EEadr
out EEDR,A
sbi EECR,EEMPE
sbi EECR,EEPE
ret
Dim Y1alt, Y2alt, Y1neu, Y2neu, n, f_w1, f_w2, k, dw, h_s3, i, div_f
Private Sub Check1_Click()
If Check1.Value Then
OszilloskopTiny13_2.Height = 5915
Else
OszilloskopTiny13_2.Height = 7695
End If
End Sub
Private Sub Command10_Click()
'Skala
Picture1.DrawWidth = 1
For i = 0 To 40
Picture1.Line (24 + i * 10, 275)-(24 + i * 10, 280), QBColor(1)
Next i
For i = 0 To 8
Picture1.Line (24 + i * 50, 275)-(24 + i * 50, 285), QBColor(1)
Next i
End Sub
Private Sub Command1_Click()
x = 0
'Linienbreite
Picture1.DrawWidth = dw
Y1alt = Val(List1.List(0))
'Es wurden 61 Werte eingelesen
Y1alt = Val(List1.List(1))
Y1alt = 275 - Val(List1.List(0))
While x < 61
d = Val(List1.List(x))
Y1neu = 275 - d
Picture1.Line (x * 6 + 24, Y1alt)-((x + 1) * 6 + 24, Y1neu), QBColor(f_w1)
Y1alt = Y1neu
x = x + 1
Wend
End Sub
Private Sub Command11_Click()
List1.Clear
End Sub
Private Sub Command2_Click()
List1.Clear
List2.Clear
End Sub
Private Sub Command3_Click()
List1.Clear
List2.Clear
SENDBYTE 5
DELAY 5
SENDBYTE div_f
DELAY 5
SENDBYTE 101
While n < 62
d = READBYTE
'ADC3-Werte
List2.AddItem Str$(d)
n = n + 1
d = READBYTE
'ADC2-Werte
List1.AddItem Str$(d)
n = n + 1
Wend
End Sub
Private Sub Command4_Click()
n = 0
OpenString = "COM" + Text1.Text + ":9600,N,8,1"
i = OPENCOM(OpenString)
Label1.Caption = "geöffnet"
If i = 0 Then MsgBox ("Schnittstelle nicht verfügbar")
TIMEINIT
TIMEOUTS 300
RTS 1
DTR 1
End Sub
Private Sub Command5_Click()
Picture1.Cls
n = 0
End Sub
Private Sub Command6_Click()
CLOSECOM
Label1.Caption = "geschlossen"
n = 0
End Sub
Private Sub Command7_Click()
List1.Clear
n = 0
SENDBYTE 5
DELAY 5
SENDBYTE div_f
DELAY 5
SENDBYTE 100
While n < 61
d = READBYTE
List1.AddItem Str$(d)
n = n + 1
Wend
End Sub
Private Sub Command8_Click()
List2.Clear
End Sub
Private Sub Command9_Click()
x = 0
'Linienbreite
Picture1.DrawWidth = dw
Y1alt = Val(List1.List(0))
Y2alt = Val(List2.List(0))
'Es wurden 2*31 Werte eingelesen
Y1alt = 275 - Val(List1.List(0))
Y2alt = 275 - Val(List2.List(0))
While x < 31
d = Val(List1.List(x))
Y1neu = 275 - d
Picture1.Line (x * 12 + 24, Y1alt)-((x + 1) * 12 + 24, Y1neu), QBColor(f_w1)
d = Val(List2.List(x))
Y2neu = 275 - d
Picture1.Line (x * 12 + 24, Y2alt)-((x + 1) * 12 + 24, Y2neu), QBColor(f_w2)
Y1alt = Y1neu
Y2alt = Y2neu
x = x + 1
Wend
End Sub
Private Sub Form_Load()
'Zuvor muss Interface.hex in den auf der
'Platine des Lernpakets Mikrocontroller
'verwendeten ATtiny13 übertragen worden sein.
n = 0
k = 0
dw = 1
Shape1.Visible = True
Label8.Visible = True
HScroll1.Visible = True
Command3.Visible = True
Command9.Visible = True
List1.Visible = True
'Command2.Visible = True
'Label3.Visible = True
Label11.Visible = True
'Label6.Visible = True
Text18.Visible = True
Picture1.DrawWidth = dw
Label1.Caption = "geschlossen"
RTS 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
CLOSECOM
End Sub
Private Sub HScroll1_Change()
f_w1 = HScroll1.Value
Shape1.FillColor = QBColor(f_w1)
End Sub
Private Sub HScroll2_Change()
f_w2 = HScroll2.Value
Shape2.FillColor = QBColor(f_w2)
End Sub
Private Sub HScroll3_Change()
div_f = HScroll3.Value
Select Case div_f
Case 1: Text9.Text = "2"
Case 2: Text9.Text = "4"
Case 3: Text9.Text = "8"
Case 4: Text9.Text = "16"
Case 5: Text9.Text = "32"
Case 6: Text9.Text = "64"
Case 7: Text9.Text = "128"
End Select
End Sub
Private Sub Option1_Click()
dw = 1
End Sub
Private Sub Option2_Click()
dw = 2
End Sub
Private Sub Option3_Click()
dw = 3
End Sub
Private Sub Option4_Click()
Command8.Visible = True
Shape1.Visible = False
Label8.Visible = False
HScroll1.Visible = False
Command3.Visible = False
Command9.Visible = False
List1.Visible = False
Command1.Visible = True
Command7.Visible = True
Command11.Visible = False
'Label3.Visible = False
'Label6.Visible = False
Label11.Visible = False
End Sub
Private Sub Text17_Change()
If Val(Text17.Text) < 100 Then
Text12.Text = "50 "
Text18.Visible = True
End If
End Sub
Private Sub Option5_Click()
Command8.Visible = False
Shape1.Visible = True
Label8.Visible = True
HScroll1.Visible = True
Command3.Visible = True
Command9.Visible = True
Command1.Visible = False
Command7.Visible = False
List1.Visible = True
Command8.Visible = False
Command11.Visible = True
'Label3.Visible = True
'Label6.Visible = True
Label11.Visible = True
End Sub
Dim Y1alt, Y2alt, Y1neu, Y2neu, n, f_w1, f_w2, k, dw, h_s3, i, div_f
Private Sub Check1_Click()
If Check1.Value Then
OszilloskopTiny13_2.Height = 5915
Else
OszilloskopTiny13_2.Height = 7695
End If
End Sub
Private Sub Command1_Click()
x = 0
'Linienbreite
Picture1(0).DrawWidth = dw
Y1alt = Val(List1.List(0))
'Es wurden 62 Werte eingelesen
Y1alt = Val(List1.List(1))
Y1alt = 150 - Val(List1.List(0))
While x < 62
d = Val(List1.List(x))
Y1neu = 150 - d
Picture1(0).Line (x * 6 + 24, Y1alt)-((x + 1) * 6 + 24, Y1alt), QBColor(f_w1)
Picture1(0).Line ((x + 1) * 6 + 24, Y1alt)-((x + 1) * 6 + 24, Y1neu), QBColor(f_w1)
Y1alt = Y1neu
x = x + 1
Wend
Text2.ForeColor = QBColor(f_w1)
End Sub
Private Sub Command11_Click()
List1.Clear
End Sub
Private Sub Command12_Click()
'Skala
Picture1(0).DrawWidth = 1
For i = 0 To 40
Picture1(0).Line (24 + i * 10, 150)-(24 + i * 10, 155), QBColor(1)
Next i
For i = 0 To 8
Picture1(0).Line (24 + i * 50, 150)-(24 + i * 50, 160), QBColor(1)
Next i
End Sub
Private Sub Command13_Click()
'Skala
Picture1(1).DrawWidth = 1
For i = 0 To 40
Picture1(1).Line (24 + i * 10, 150)-(24 + i * 10, 155), QBColor(1)
Next i
For i = 0 To 8
Picture1(1).Line (24 + i * 50, 150)-(24 + i * 50, 160), QBColor(1)
Next i
End Sub
Private Sub Command14_Click()
Picture1(0).Cls
n = 0
End Sub
Private Sub Command15_Click()
Picture1(1).Cls
n = 0
End Sub
Private Sub Command16_Click()
List2.Clear
n = 0
div_f = HScroll3.Value
SENDBYTE 5
DELAY 10
SENDBYTE div_f
DELAY 10
SENDBYTE 104
While n < 62
d = READBYTE
'ADC3-Werte
List2.AddItem Str$(d)
n = n + 1
Wend
Label13.Caption = Str$(div_f)
End Sub
Private Sub Command2_Click()
Picture1(0).Cls
Picture1(1).Cls
n = 0
End Sub
Private Sub Command3_Click()
List1.Clear
List2.Clear
n = 0
div_f = HScroll3.Value
SENDBYTE 5
DELAY 10
SENDBYTE div_f
DELAY 10
SENDBYTE 105
While n < 62
d = READBYTE
'Werte von Pb4
List1.AddItem Str$(d)
n = n + 1
d = READBYTE
'Werte von Pb3
List2.AddItem Str$(d)
n = n + 1
Wend
Label12.Caption = Str$(div_f)
Label13.Caption = Str$(div_f)
End Sub
Private Sub Command4_Click()
n = 0
OpenString = "COM" + Text1.Text + ":9600,N,8,1"
i = OPENCOM(OpenString)
Label1.Caption = "geöffnet"
If i = 0 Then MsgBox ("Schnittstelle nicht verfügbar")
TIMEINIT
TIMEOUTS 300
RTS 1
DTR 1
End Sub
Private Sub Command5_Click()
'Linienbreite
x = 0
Picture1(1).DrawWidth = dw
Y1alt = Val(List2.List(0))
'Es wurden 31 Werte eingelesen
Y1alt = Val(List2.List(1))
Y1alt = 150 - Val(List2.List(0))
While x < 62
d = Val(List2.List(x))
Y1neu = 150 - d
Picture1(1).Line (x * 6 + 24, Y1alt)-((x + 1) * 6 + 24, Y1alt), QBColor(f_w2)
Picture1(1).Line ((x + 1) * 6 + 24, Y1alt)-((x + 1) * 6 + 24, Y1neu), QBColor(f_w2)
Y1alt = Y1neu
x = x + 1
Wend
Text3.ForeColor = QBColor(f_w2)
End Sub
Private Sub Command6_Click()
CLOSECOM
Label1.Caption = "geschlossen"
n = 0
End Sub
Private Sub Command7_Click()
List1.Clear
n = 0
div_f = HScroll3.Value
SENDBYTE 5
DELAY 10
SENDBYTE div_f
DELAY 10
SENDBYTE 104
While n < 62
d = READBYTE
'ADC3-Werte
List1.AddItem Str$(d)
n = n + 1
Wend
Label12.Caption = Str$(div_f)
End Sub
Private Sub Command8_Click()
List2.Clear
End Sub
Private Sub Command9_Click()
x = 0
Picture1(0).DrawWidth = dw
Y1alt = Val(List1.List(0))
'Es wurden 62 Werte eingelesen
Y1alt = Val(List1.List(1))
Y1alt = 150 - Val(List1.List(0))
While x < 32
d = Val(List1.List(x))
Y1neu = 150 - d
Picture1(0).Line (x * 12 + 24, Y1alt)-((x + 1) * 12 + 24, Y1alt), QBColor(f_w1)
Picture1(0).Line ((x + 1) * 12 + 24, Y1alt)-((x + 1) * 12 + 24, Y1neu), QBColor(f_w1)
Y1alt = Y1neu
x = x + 1
Wend
'Linienbreite
x = 0
Picture1(1).DrawWidth = dw
Y1alt = Val(List2.List(0))
'Es wurden 31 Werte eingelesen
Y1alt = Val(List2.List(1))
Y1alt = 150 - Val(List2.List(0))
While x < 32
d = Val(List2.List(x))
Y1neu = 150 - d
Picture1(1).Line (x * 12 + 24, Y1alt)-((x + 1) * 12 + 24, Y1alt), QBColor(f_w2)
Picture1(1).Line ((x + 1) * 12 + 24, Y1alt)-((x + 1) * 12 + 24, Y1neu), QBColor(f_w2)
Y1alt = Y1neu
x = x + 1
Wend
End Sub
Private Sub Form_Load()
'Zuvor muss Interface.hex in den auf der
'Platine des Lernpakets Mikrocontroller
'verwendeten ATtiny13 übertragen worden sein.
n = 0
k = 0
dw = 1
Shape1.Visible = True
Label8.Visible = True
HScroll1.Visible = True
Command3.Visible = True
Command9.Visible = True
List1.Visible = True
'Command2.Visible = True
'Label3.Visible = True
Label11.Visible = True
Command8.Visible = True
'Label6.Visible = True
Text18(0).Visible = True
Picture1(0).DrawWidth = dw
Label1.Caption = "geschlossen"
RTS 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
CLOSECOM
End Sub
Private Sub HScroll1_Change()
f_w1 = HScroll1.Value
Shape1.FillColor = QBColor(f_w1)
Text2.ForeColor = QBColor(f_w1)
End Sub
Private Sub HScroll2_Change()
f_w2 = HScroll2.Value
Shape2.FillColor = QBColor(f_w2)
Text3.ForeColor = QBColor(f_w2)
End Sub
Private Sub HScroll3_Change()
div_f = HScroll3.Value
Text9.Text = Str$(div_f)
End Sub
Private Sub Option1_Click()
dw = 1
End Sub
Private Sub Option2_Click()
dw = 2
End Sub
Private Sub Option3_Click()
dw = 3
End Sub
Private Sub Option4_Click()
Command8.Visible = True
Shape1.Visible = False
Label8.Visible = False
HScroll1.Visible = False
Command3.Visible = False
Command9.Visible = False
List1.Visible = False
Command1.Visible = True
Command7.Visible = True
Command11.Visible = False
'Label3.Visible = False
'Label6.Visible = False
Label11.Visible = False
End Sub
Private Sub Text17_Change()
If Val(Text17.Text) < 100 Then
Text12.Text = "50 "
Text18(0).Visible = True
End If
End Sub
Private Sub Option5_Click()
Command8.Visible = False
Shape1.Visible = True
Label8.Visible = True
HScroll1.Visible = True
Command3.Visible = True
Command9.Visible = True
Command1.Visible = False
Command7.Visible = False
List1.Visible = True
Command8.Visible = False
Command11.Visible = True
'Label3.Visible = True
'Label6.Visible = True
Label11.Visible = True
End Sub