Hab mal ein bisschen mit SerialCominstruments 4 rum gespielt und eine Testschaltung mit 6 AD Eingängen(bis 100 VDC), 2 Digitalausgängen(LED zum testen) sowie 1 DAC Ausgang (PWM) aufgebaut. Ich wollte nur mal sehen, wie die Kommunikation mit dem Programm funktioniert, und zwar in beide Richtungen. Da es ein gutes Manual dazu gibt, war es gar nicht so schwierig. Vielleicht kann ja jemand etwas davon gebrauchen. Man kann damit Mess-oder Zählwerte visualisieren und auch den ATMega mit Schaltern und Schiebereglern fernsteuern. Diese Funktionen kann man dem Code entnehmen und für seine Bedürfnisse anpassen(und sicherlich auch noch verbessern). Viel Spass damit.
Gruß Thomas
Screenshot (5).png20180606_183217.jpg
Alles anzeigen
Gruß Thomas
Screenshot (5).png20180606_183217.jpg
Quellcode
- $regfile = "m8def.dat"
- $crystal = 8000000
- $hwstack=40
- $swstack=16
- $framesize=32
- $baud = 115200
- '----------------------------------------------------------------------------------------------------------------------
- 'AD-Wandler einschalten
- Config Adc = Single , Prescaler = Auto , Reference = Internal
- Start Adc
- '----------------------------------------------------------------------------------------------------------------------
- 'INT UART-Empfang Int nach jedem empfangenen Byte
- Enable Urxc
- On Urxc Uart0 'ISR
- Enable Interrupts 'generell Interrupts einschalten
- '----------------------------------------------------------------------------------------------------------------------
- Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64
- '----------------------------------------------------------------------------------------------------------------------
- Config Portd.7 = Output
- Config Portb.0 = Output
- Led1 Alias Portd.7
- Led2 Alias Portb.0
- '----------------------------------------------------------------------------------------------------------------------
- Dim I1 As Single
- Dim I2 As Single
- Dim I3 As Single
- Dim I4 As Single
- Dim I5 As Single
- Dim I6 As Single
- Dim Z As Byte
- Dim N As Byte
- Dim U As Word
- Dim Tabelle1(50) As Word
- Dim Tabelle2(50) As Word
- Dim Tabelle3(50) As Word
- Dim Tabelle4(50) As Word
- Dim Tabelle5(50) As Word
- Dim Tabelle6(50) As Word
- Dim Index As Byte
- Dim Median As Word
- Dim S As String * 13
- Dim Dat As Byte
- Dim Byte_wert As Byte
- Dim Pwm_wert As Byte
- Dim Stellwert As String * 3
- Dim Status As String * 1
- Dim Aktor As String * 2
- Pwm1b = 0
- Led1 = 1
- Waitms 200
- Led2 = 1
- Waitms 200
- Led1 = 0
- Led2 = 0
- Do
- If Dat = 10 Then 'ENDE-Zeichen von UART auswerten
- Print S 'String zurück schicken zu Kontrolle im Terminal
- Gosub Ausführen
- S = "" 'String löschen
- Dat = 0 'zuletzt empfangenes Byte löschen
- End If
- Index = Index + 1
- U = Getadc(0)
- Waitus 300
- Tabelle1(index) = U
- U = Getadc(1)
- Waitus 300
- Tabelle2(index) = U
- U = Getadc(2)
- Waitus 300
- Tabelle3(index) = U
- U = Getadc(3)
- Waitus 300
- Tabelle4(index) = U
- U = Getadc(4)
- Waitus 300
- Tabelle5(index) = U
- U = Getadc(5)
- Waitus 300
- Tabelle6(index) = U
- If Index = 50 Then
- Gosub Median50
- Print "#1M" ; Str(i1) ; "<" ; "#2M" ; Str(i2) ; "<" ; "#3M" ; Str(i3) ; "<" ; "#4M" ; Str(i4) ; "<" ; "#5M" ; Str(i5) ; "<" ; "#6M" ; Str(i6) ; "<"
- End If
- Loop
- Ausführen:
- Aktor = Mid(s , 2 , 2) 'Aktoren(DAC und Schalter) müssen 2-Stellige Kanalnummern haben
- Status = Mid(s , 5 , 1)
- If Aktor = "20" Then 'Schalter
- If Status = "0" Then 'Aus
- Led1 = 0
- Elseif Status = "1" Then 'Ein
- Led1 = 1
- End If
- Elseif Aktor = "21" Then 'Schalter
- If Status = "0" Then 'Aus
- Led2 = 0
- Elseif Status = "1" Then 'Ein
- Led2 = 1
- End If
- Elseif Aktor = "10" Then 'DAC Kanal 10 auf Format"000" stellen, damit immer 3-stellig
- Stellwert = Mid(s , 5 , 1)
- Pwm_wert = Stellwert - 48 'wegen ASCII im String
- Pwm_wert = Pwm_wert * 100 ' Hunderter
- Stellwert = Mid(s , 6 , 1)
- Byte_wert = Stellwert - 48
- Byte_wert = Byte_wert * 10 'Zehner
- Pwm_wert = Pwm_wert + Byte_wert
- Stellwert = Mid(s , 7 , 1)
- Byte_wert = Stellwert - 48 'Einer
- Pwm_wert = Pwm_wert + Byte_wert
- Print "#7M" ; Str(pwm_wert) ; "<" 'für eine Kontroll-Anzeige (Kanal 7)
- Pwm1b = Pwm_wert
- End If
- Return
- '---------------------------------------------------------------------------------------
- Median50:
- For N = 1 To 24 '24mal kleinsten Wert in Tabelle suchen und auf 65000 setzen
- Min(tabelle1(1) , Median , Index)
- Tabelle1(index) = 65000
- Next
- Min(tabelle1(1) , Median , Index) 'der 25. minwert ist der Median
- I1 = Median / 10
- For N = 1 To 24
- Min(tabelle2(1) , Median , Index)
- Tabelle2(index) = 65000
- Next
- Min(tabelle2(1) , Median , Index)
- I2 = Median / 10
- For N = 1 To 24
- Min(tabelle3(1) , Median , Index)
- Tabelle3(index) = 65000
- Next
- Min(tabelle3(1) , Median , Index)
- I3 = Median / 10
- For N = 1 To 24
- Min(tabelle4(1) , Median , Index)
- Tabelle4(index) = 65000
- Next
- Min(tabelle4(1) , Median , Index)
- I4 = Median / 10
- For N = 1 To 24
- Min(tabelle5(1) , Median , Index)
- Tabelle5(index) = 65000
- Next
- Min(tabelle5(1) , Median , Index)
- I5 = Median / 10
- For N = 1 To 24
- Min(tabelle6(1) , Median , Index)
- Tabelle6(index) = 65000
- Next
- Min(tabelle6(1) , Median , Index)
- I6 = Median / 10
- Index = 0
- Return
- Uart0:
- Dat = Inkey() 'empfangenes Byte einlesen
- S = S + Chr(dat) 'zum String dazu fügen
- Return