Hallo,
ich mühe mich seit einigen Tagen mit einer Routine für eine Softwareuart. Irgendwie läuft sie ja auch aber mich macht eine Sache stutzig. Der Sprung zurück in die Do Loop kommt nach dem Senden der Daten und dann springt der Kontroller wieder raus, aber wohin?? Ich erkenne das an LED_2. Nach einem Reset blinkt sie, sobald Daten übertragen werden geht sie dauerhaft aus. Bei der nächsten Übertragung geht sie dauerhaft an. LED_3 und LED_5 sind zur Kontrolle ob die Routine angesprungen wird. Was hab ich falsch gemacht?
Alles anzeigen
Gruß, Martin
ich mühe mich seit einigen Tagen mit einer Routine für eine Softwareuart. Irgendwie läuft sie ja auch aber mich macht eine Sache stutzig. Der Sprung zurück in die Do Loop kommt nach dem Senden der Daten und dann springt der Kontroller wieder raus, aber wohin?? Ich erkenne das an LED_2. Nach einem Reset blinkt sie, sobald Daten übertragen werden geht sie dauerhaft aus. Bei der nächsten Übertragung geht sie dauerhaft an. LED_3 und LED_5 sind zur Kontrolle ob die Routine angesprungen wird. Was hab ich falsch gemacht?
Quellcode
- $regfile = "m328pdef.dat"
- $crystal = 8000000
- $hwstack = 100
- $swstack = 80
- $framesize = 700
- $baud = 9600
- On Urxc Onrxd
- Enable Urxc
- 'Ports out gesamten Port c als Ausgabeport
- Config Portc = Output
- Led_5 Alias Portc.5
- Led_4 Alias Portc.4
- Led_3 Alias Portc.3
- Led_2 Alias Portc.2
- Led_1 Alias Portc.1
- Config Int0 = Falling
- On Int0 Serielle_lesen
- Open "comd.2:9600,8,n,1" For Input As #1
- Open "comd.7:9600,8,N,1" For Output As #2
- Enable Int0
- 'Timer
- Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1
- Ocr1a = 31250 - 1
- Enable Oc1a
- Enable Interrupts
- Dim A As String * 30
- Dim Int0_flag As Bit
- Dim C As Byte
- Dim S As String * 220
- Dim Empfangene_daten As String * 220
- Dim N As Byte
- Dim Flag_gefunden As Byte
- Dim Flag_text_senden As Byte
- Led_1 = 1 : Led_2 = 0 : Led_3 = 0 : Led_4 = 0 : Led_5 = 0 : Waitms 100
- Led_1 = 0 : Led_2 = 1 : Led_3 = 0 : Led_4 = 0 : Led_5 = 0 : Waitms 100
- Led_1 = 0 : Led_2 = 0 : Led_3 = 1 : Led_4 = 0 : Led_5 = 0 : Waitms 100
- Led_1 = 0 : Led_2 = 0 : Led_3 = 0 : Led_4 = 1 : Led_5 = 0 : Waitms 100
- Led_1 = 0 : Led_2 = 0 : Led_3 = 0 : Led_4 = 0 : Led_5 = 1 : Waitms 100
- Led_1 = 0 : Led_2 = 0 : Led_3 = 0 : Led_4 = 0 : Led_5 = 0 : Waitms 100
- On Oc1a Anzeigen
- N = 0
- Do
- Toggle Led_2
- Waitms 100
- If Int0_flag = 1 Then Gosub Daten_einlesen
- Loop
- End
- Daten_einlesen:
- Disable Int0
- Led_3 = 1
- Do
- Get #1 , C
- If C <= 13 Then Exit Do
- A = A + Chr(c)
- Loop
- Print#2 , A;
- A = ""
- Int0_flag = 0
- Enable Int0
- Return
- 'Timer Betriebsanzeige
- Anzeigen:
- Toggle Led_1
- Led_5 = 0
- Led_3 = 0
- Return
- '##################################### Soft uart #########################
- Serielle_lesen:
- Led_5 = 1
- Int0_flag = 1
- Return
- '##################################### uart ##############################
- Onrxd:
- Incr N
- S = S + Chr(udr)
- If Udr = $3e Then Flag_text_senden = 1
- If Udr = 13 Then
- If N < 3 Then
- N = 0 : S = ""
- Else
- Empfangene_daten = S
- Flag_gefunden = 1
- N = 0 : S = ""
- End If
- End If
- If N > 220 Then Decr N
- Return