Hallo,
hier möchte ich Euch vorstellen, wie ein AVR (hier ATMega 2560, es kann
aber auch an jeden anderen AVR angepasst werden) über RS-232 mit dem
Windows-PC (geht auch unter Linux und MAC-OS) gesteuert werden kann. Als
Hardware wird hier die LED an PortB.7 verwendet, es lässt sich natürlich
jede hardware analog steuern: Relais, Servos etc.
Hier der Bascom-code auf dem AVR:
1 | $regfile = "m2560def.dat"
| 2 | $framesize = 32
| 3 | $swstack = 32
| 4 | $hwstack = 32
| 5 | $crystal = 16000000
| 6 | $baud = 1200
| 7 |
| 8 | Config Portb.7 = Output
| 9 | Led Alias Portb.7
| 10 |
| 11 | Dim X As Byte
| 12 | Dim Y As Byte
| 13 | Dim Z As Byte
| 14 |
| 15 | Z = 50 ' General Wait Time
| 16 | Y = 0 'initialize software-timer
| 17 |
| 18 | Do
| 19 |
| 20 | If Ischarwaiting() = 1 Then 'Eingang RS-232 prüfen
| 21 | Inputbin X
| 22 | X = 100 - X 'Software-Umkehr damit LED dunkel ist, wenn der Trackbar links gezogen wird
| 23 | End If
| 24 |
| 25 | While Y < 100 'Software-timer. Das kann
| 26 | If Y = X Then Led = 1 'natürlich auch mit einem onboard-timer
| 27 | Waitus Z 'gemacht werden. Mit der Software-Lösung
| 28 | Incr Y 'wird jedoch die Funktion erläutert
| 29 | Wend 'und es kann bspw. eine RGB-Diode oder
| 30 | 'beliebig viele Servos in einer
| 31 | While Y > 0 'Routine abgearbeitet werden.
| 32 | If Y = X Then Led = 0
| 33 | Waitus Z
| 34 | Decr Y
| 35 | Wend
| 36 |
| 37 | Loop
| 38 | End
|
und hier der Code für PureBasic:
1 | #WindowColor=$F0F0F0
| 2 |
| 3 | Define TxByte.a
| 4 |
| 5 | Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
| 6 | OpenWindow(0,0,0,300,100,"RS-232",flags)
| 7 | WindowBounds(0,150,150, #PB_Ignore, #PB_Ignore)
| 8 | SetWindowColor(0,#WindowColor)
| 9 | TextGadget(1,5,50,48,20, "tx-data:", #PB_Text_Center)
| 10 | TrackBarGadget (2, 55, 50, 240, 30, 0, 100)
| 11 | OpenSerialPort(0,"COM9",1200,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,512,512)
| 12 |
| 13 | Repeat
| 14 | Select WaitWindowEvent()
| 15 | Case #PB_Event_Gadget
| 16 | Select EventGadget()
| 17 | Case 2
| 18 | TxByte = GetGadgetState(2)
| 19 | WriteSerialPortData(0, @TxByte, 1)
| 20 | EndSelect
| 21 | Case #PB_Event_CloseWindow:CloseSerialPort(0):End
| 22 | EndSelect
| 23 | ForEver
|
Der COM-Port muss angepasst werden. Nach Installation des USB-RS232
Adapters wird der im Gerätemanager angezeigt.
Viel Spass beim Experimentieren.
Thomas
ich habe das Programm eben darum erweitert, dass eine RGB-LED
individuell angesteuert wird. Dabei liegen die Anoden über jeweils 220 Ω
an den Ports:
Rot - PortB.6
Grün - PortB.5
Blau - PortB.4
Die Helligkeitswerte werden in einem Byte übertragen. Dabei hat die rote
Led den Bereich von 0 bis 80, die grüne 81 ~ 161 und die blaue 162 ~
242. Beide Programme sind in Basic geschrieben (BASCOM und PureBasic,
beide führen diese Programme auch in der Demo-Version aus).
AVR-Seite (Bascom):
1 | $regfile = "m2560def.dat"
| 2 | $framesize = 32
| 3 | $swstack = 32
| 4 | $hwstack = 32
| 5 | $crystal = 16000000
| 6 | $baud = 9600
| 7 |
| 8 | Config Portb = Output
| 9 |
| 10 | Rled Alias Portb.6
| 11 | Gled Alias Portb.5
| 12 | Bled Alias Portb.4
| 13 |
| 14 | Dim R As Byte
| 15 | Dim G As Byte
| 16 | Dim B As Byte
| 17 | Dim X As Byte
| 18 | Dim Y As Byte
| 19 | Dim Z As Byte
| 20 |
| 21 | Z = 30
| 22 | Y = 0
| 23 |
| 24 | Do
| 25 |
| 26 | If Ischarwaiting() = 1 Then
| 27 | Gosub Rgb
| 28 | End If
| 29 |
| 30 | While Y < 80
| 31 | If Y = R Then Rled = 1
| 32 | If Y = G Then Gled = 1
| 33 | If Y = B Then Bled = 1
| 34 | Waitus Z
| 35 | Incr Y
| 36 | Wend
| 37 |
| 38 | While Y > 0
| 39 | If Y = R Then Rled = 0
| 40 | If Y = G Then Gled = 0
| 41 | If Y = B Then Bled = 0
| 42 | Waitus Z
| 43 | Decr Y
| 44 | Wend
| 45 |
| 46 | Loop
| 47 | End
| 48 |
| 49 | Rgb:
| 50 | Inputbin X
| 51 | If X <= 80 Then
| 52 | R = X
| 53 | R = 80 - R
| 54 | End If
| 55 |
| 56 | If X > 80 And X <= 161 Then
| 57 | G = X
| 58 | G = G - 81
| 59 | G = 80 - G
| 60 | End If
| 61 |
| 62 | If X > 161 Then
| 63 | B = X
| 64 | B = B - 162
| 65 | B = 80 - B
| 66 | End If
| 67 | Return
|
und auf dem PC läuft in PureBasic:
1 | EnableExplicit
| 2 |
| 3 | #WindowColor=$F0F0F0
| 4 |
| 5 | Define TxByte.a
| 6 |
| 7 | Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
| 8 | OpenWindow(0,0,0,300,200,"RGB-Steuerung",flags)
| 9 | WindowBounds(0,200,200, #PB_Ignore, #PB_Ignore)
| 10 | SetWindowColor(0,#WindowColor)
| 11 | TextGadget (0, 70, 5, 190, 20, "RGB-Steuerung", #PB_Text_Center)
| 12 | TextGadget(1,5,30,30,20, "R: ", #PB_Text_Center)
| 13 | TextGadget(2, 5, 60, 30, 20, "G:", #PB_Text_Center)
| 14 | TextGadget(3, 5, 90, 30, 20, "B: ", #PB_Text_Center)
| 15 | TrackBarGadget (4, 55, 30, 240, 30, 0, 80)
| 16 | TrackBarGadget (5, 55, 60, 240, 30, 0, 80)
| 17 | TrackBarGadget (6, 55, 90, 240, 30, 0, 80)
| 18 |
| 19 | OpenSerialPort(0,"COM9",9600,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,512,512)
| 20 | TxByte=0
| 21 | WriteSerialPortData(0,@TxByte,1)
| 22 | TxByte=81
| 23 | WriteSerialPortData(0,@TxByte,1)
| 24 | TxByte=162
| 25 | WriteSerialPortData(0,@txbyte,1)
| 26 | Repeat
| 27 | Select WaitWindowEvent()
| 28 | Case #PB_Event_Gadget
| 29 | Select EventGadget()
| 30 | Case 4
| 31 | TxByte = GetGadgetState(4)
| 32 | WriteSerialPortData(0, @TxByte, 1)
| 33 | Case 5
| 34 | TxByte=GetGadgetState(5)+81
| 35 | WriteSerialPortData(0,@TxByte,1)
| 36 | Case 6
| 37 | TxByte=GetGadgetState(6)+162
| 38 | WriteSerialPortData (0,@TxByte,1)
| 39 | EndSelect
| 40 | Case #PB_Event_CloseWindow:CloseSerialPort(0):End
| 41 | EndSelect
| 42 | ForEver
|
Das ist bestimmt nicht alles elegant gelöst, aber es funktioniert und
man sieht bei drei PWM-Werten den Vorteil des Software-timers.
Gruß
Thomas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|