Accenter
02.06.2013, 19:52
Ich habe Probleme über den Input Capture ICP einen Funkempfänger auszuwerten und mir das Ergebnis über den UART ausgeben zu lassen.
Gleichzeitig möchte ich alles was am UART über ein Terminal reinkommt auch 1:1 wieder ausgeben.
Einzeln klappt sowohl die Ausgabe des Funkmoduls so wie auch die Rückgabe von am Terminal eingegeben "Texten". Mein Funkempfänger am Input Capture spuckt mir die richtigen Werte über Print #2 aus und auch der UART sendet alle Eingaben vom Terminal 1:1 korrekt zurück. Ich bekomme es nur NICHT gleichzeitig zum laufen!
Sobald ich aus der Hauptschleife "Gosub Empfang868mhz" rausnehme bekomme ich alle Terminal Eingaben korrekt zurück.
Füge ich es wieder ein, empfange ich nur noch die Funkbefehle vom Input Capture und das Terminal sendet nach Eingabe von Enter ins leere (ich bekomme dann die Eingabe bei "Print #2, Uart2eingang" nicht mehr zurück und weiß nicht warum.
Woran kann das liegen? Verträgt sich der Input Capture mit dem UART aus irgend einem Grund nicht? Manchmal wird mir nach der Ausgabe des Funkempfanges ein zuvor eingegebener Text über das Terminal sehrwohl mit ausgegeben (aber selten und auch nur zufällig leider). Bin am Ende meiner Weisheit und bitte um Hilfe. Hab den Code stark reduziert und nur die relevanten Teile gepostet.
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 9600
$framesize = 550
$swstack = 550
$hwstack = 550
Config Pind.4 = Input '868Mhz Input, direkt vom Empfänger.
Config Portd.5 = Output 'Enable 868Mhz Empfänger'
Config Porte.7 = Output 'led gelb led1'
Config Porte.6 = Output 'led grün led2'
Config Porte.5 = Output 'led rot led3'
Config Porte.4 = Output 'led blau led4'
Config Porta.0 = Output '433Mhz Sender'
Config Portb.7 = Output '868Mhz sender'
Config Portb.6 = Output 'Enable 868Mhz Sender'
Config Portb.5 = Output 'Speaker'
Config Portc.7 = Output 'LAN Modul Reset'
Config Portd.6 = Output 'LAN Modul Config'
Funkpinit Alias Porta.0 '433Mhz Sender'
Funkpinfs20 Alias Portb.7 '868Mhz Sender'
Enablefs20tx Alias Portb.6 '868Mhz Sendefreigabe Enable'
Enablefs20rx Alias Portd.5 '868Mhz Empfängerfreigabe Enable'
Icp1 Alias Pind.4 '868Mhz Input, direkt vom Empfänger.
Led Alias Porte.7 'gelbe LED'
Ledgruen Alias Porte.6 'grüne LED'
Ledrot Alias Porte.5 'rote LED'
Ledblau Alias Porte.4 'blaue LED'
Speaker Alias Portb.5 'Piezo'
Lanreset Alias Portc.7 'LAN Modul Reset'
Lanconfig Alias Portd.6 'LAN Modul Config'
Config Sda = Portd.1 'DS1307'
Config Scl = Portd.0
I2cinit
Config Twi = 100000
Waitms 100
Dim Ds1307w As Byte , Ds1307r As Byte : Ds1307w = &B11010000 : Ds1307r = &B11010001
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin1 = Buffered , Size = 150
Config Serialout1 = Buffered , Size = 150
Open "Com2:" For Binary As #2 'UART 2 wird aktiviert. Schicken mit Print #2 , "text"'
Clear Serialin1
Enable Interrupts
Waitms 100
Dim Buffer As Byte , Uart2eingang As String * 152
Dim _weekday As Integer
Dim _wochentag As String * 2 , _day As Byte , _month As Byte , _monat As String * 3 , _year As Byte , _sec As Integer , _min As Integer , _hour As Integer
Dim Sec_str As String * 2 , Min_str As String * 2 , Hour_str As String * 2 , Day_str As String * 2 , Year_str As String * 2 'Variablen für mehrtsellige Ausgabe'
'Timer1: resolution = 1ms
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising 'bei 8Mhz Quarz'
Timer1 = 0
On Icp1 Icp_int 'Input Capture an dem das 868Mhz Funkmodul betrieben wird'
Enable Icp1
Wait 3 'Wartezeit bis LAN Modul bereit ist'
Print #2 , "Programm start"
Waitms 200
Gosub Speakersound
Waitms 200
Gosub Speakersound
'##################### Hauptschleife #######################'
Hauptschleife:
Do
If Ischarwaiting(#2) = 1 Then 'Wenn über den UART2 was reinkommt springe zur UART Auswertung'
Gosub Uart2auswertung
End If
Gosub Empfang868mhz 'Gehe zum 868Mhz Funkempfang'
Loop
'############## UART Auswertung ###############'
Uart2auswertung: 'Zeichen werden zusammengesetzt und bei 13 ausgewertet'
Disable Interrupts
Buffer = Inkey(#2)
If Buffer >= 13 Then
If Buffer = 13 Then
Gosub Auswertung
Else
If Len(uart2eingang) < 149 Then
Uart2eingang = Uart2eingang + Chr(buffer)
Else
Uart2eingang = ""
Clear Serialin1
End If
End If
End If
Enable Interrupts
Return
Auswertung:
Print #2 , Uart2eingang 'Gebe alles 1:1 aus was am UART reingekommen ist zum Test'
Gosub Uhrzeitlesen
Print #2 , Hour_str ; ":" ; Min_str ; ":" ; Sec_str 'Zeitstempel ebenso ausgeben'
Uart2eingang = ""
Clear Serialin1
Return
'#################### Input Capture 868Mhz Empfänger #############################'
Icp_int:
Fs20cycle1 = Timer1
Timer1 = 0
Select Case Fs20cycle1
Case Is < 599 'below 600µs, reset bitcounter
Count1 = 1
Case 600 To 1000 '600-1000µs, 0-bit
Rxbit1 = 0
Rdy1 = 1
Case 1001 To 1400 '1000-1400µs, 1-bit
Rxbit1 = 1
Rdy1 = 1
Case Is > 1401 'over 1400µs, reset bitcounter
Count1 = 1
End Select
Return
'#################### Funk Empfang 868Mhz #############################'
Empfang868mhz:
'Hier findet die Auswertung vom Input Capture ICP1 statt und wird der Variablen "Gesamtcode" übergeben'
'Der Code ist umfangreich, mehrfach getestet und funktioniert. Habe ihn entfernt damit der Code fürs Forum nicht zu Umfangreich wird'
Gosub Speakersound
Print #2 , Gesamtcode1 'Alles was über 868Mhz empfangen wird, wird hier ausgegeben zum Test'
Waitms 100
Return
'##################################### DS1307 ######################################'
Datumschreiben:
_day = 31 : _month = 05 : _year = 13
Uhrzeitschreiben:
_sec = 00 : _min = 13 : _hour = 23
Gosub Uhrumrechnung
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) : _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart : I2cwbyte Ds1307w : I2cwbyte 0 : I2cwbyte _sec : I2cwbyte _min : I2cwbyte _hour : I2cstop : I2cstart : I2cwbyte Ds1307w
I2cwbyte 3 : I2cwbyte _weekday : I2cwbyte _day : I2cwbyte _month : I2cwbyte _year : I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) : _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Uhrzeitlesen: 'Lese Zeit und Datum aus dem DS1307'
I2cstart
I2cwbyte Ds1307w : I2cwbyte 0 : I2cstop : I2cstart : I2cwbyte Ds1307r : I2crbyte _sec , Ack : I2crbyte _min , Ack : I2crbyte _hour , Ack
I2crbyte _weekday , Ack : I2crbyte _day , Ack : I2crbyte _month , Ack : I2crbyte _year , Nack : I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) : _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Gosub Uhrumrechnung
Return
Uhrumrechnung:
Select Case _weekday
Case Is = 1 : _wochentag = "Mo"
Case Is = 2 : _wochentag = "Di"
Case Is = 3 : _wochentag = "Mi"
Case Is = 4 : _wochentag = "Do"
Case Is = 5 : _wochentag = "Fr"
Case Is = 6 : _wochentag = "Sa"
Case Is = 7 : _wochentag = "So"
End Select
Select Case _month
Case Is = 1 : _monat = "Jan"
Case Is = 2 : _monat = "Feb"
Case Is = 3 : _monat = "Mar"
Case Is = 4 : _monat = "Apr"
Case Is = 5 : _monat = "Mai"
Case Is = 6 : _monat = "Jun"
Case Is = 7 : _monat = "Jul"
Case Is = 8 : _monat = "Aug"
Case Is = 9 : _monat = "Sep"
Case Is = 10 : _monat = "Okt"
Case Is = 11 : _monat = "Nov"
Case Is = 12 : _monat = "Dez"
End Select
Sec_str = Str(_sec) '2-stellig'
Sec_str = Format(sec_str , "00")
Min_str = Str(_min)
Min_str = Format(min_str , "00")
Hour_str = Str(_hour)
Hour_str = Format(hour_str , "00")
Day_str = Str(_day)
Day_str = Format(day_str , "00")
Year_str = Str(_year)
Year_str = Format(year_str , "00")
Return
'################################## Sound ##################################'
Speakersound:
Sound Speaker , 25 , 300
Return
End
Gleichzeitig möchte ich alles was am UART über ein Terminal reinkommt auch 1:1 wieder ausgeben.
Einzeln klappt sowohl die Ausgabe des Funkmoduls so wie auch die Rückgabe von am Terminal eingegeben "Texten". Mein Funkempfänger am Input Capture spuckt mir die richtigen Werte über Print #2 aus und auch der UART sendet alle Eingaben vom Terminal 1:1 korrekt zurück. Ich bekomme es nur NICHT gleichzeitig zum laufen!
Sobald ich aus der Hauptschleife "Gosub Empfang868mhz" rausnehme bekomme ich alle Terminal Eingaben korrekt zurück.
Füge ich es wieder ein, empfange ich nur noch die Funkbefehle vom Input Capture und das Terminal sendet nach Eingabe von Enter ins leere (ich bekomme dann die Eingabe bei "Print #2, Uart2eingang" nicht mehr zurück und weiß nicht warum.
Woran kann das liegen? Verträgt sich der Input Capture mit dem UART aus irgend einem Grund nicht? Manchmal wird mir nach der Ausgabe des Funkempfanges ein zuvor eingegebener Text über das Terminal sehrwohl mit ausgegeben (aber selten und auch nur zufällig leider). Bin am Ende meiner Weisheit und bitte um Hilfe. Hab den Code stark reduziert und nur die relevanten Teile gepostet.
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 9600
$framesize = 550
$swstack = 550
$hwstack = 550
Config Pind.4 = Input '868Mhz Input, direkt vom Empfänger.
Config Portd.5 = Output 'Enable 868Mhz Empfänger'
Config Porte.7 = Output 'led gelb led1'
Config Porte.6 = Output 'led grün led2'
Config Porte.5 = Output 'led rot led3'
Config Porte.4 = Output 'led blau led4'
Config Porta.0 = Output '433Mhz Sender'
Config Portb.7 = Output '868Mhz sender'
Config Portb.6 = Output 'Enable 868Mhz Sender'
Config Portb.5 = Output 'Speaker'
Config Portc.7 = Output 'LAN Modul Reset'
Config Portd.6 = Output 'LAN Modul Config'
Funkpinit Alias Porta.0 '433Mhz Sender'
Funkpinfs20 Alias Portb.7 '868Mhz Sender'
Enablefs20tx Alias Portb.6 '868Mhz Sendefreigabe Enable'
Enablefs20rx Alias Portd.5 '868Mhz Empfängerfreigabe Enable'
Icp1 Alias Pind.4 '868Mhz Input, direkt vom Empfänger.
Led Alias Porte.7 'gelbe LED'
Ledgruen Alias Porte.6 'grüne LED'
Ledrot Alias Porte.5 'rote LED'
Ledblau Alias Porte.4 'blaue LED'
Speaker Alias Portb.5 'Piezo'
Lanreset Alias Portc.7 'LAN Modul Reset'
Lanconfig Alias Portd.6 'LAN Modul Config'
Config Sda = Portd.1 'DS1307'
Config Scl = Portd.0
I2cinit
Config Twi = 100000
Waitms 100
Dim Ds1307w As Byte , Ds1307r As Byte : Ds1307w = &B11010000 : Ds1307r = &B11010001
Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin1 = Buffered , Size = 150
Config Serialout1 = Buffered , Size = 150
Open "Com2:" For Binary As #2 'UART 2 wird aktiviert. Schicken mit Print #2 , "text"'
Clear Serialin1
Enable Interrupts
Waitms 100
Dim Buffer As Byte , Uart2eingang As String * 152
Dim _weekday As Integer
Dim _wochentag As String * 2 , _day As Byte , _month As Byte , _monat As String * 3 , _year As Byte , _sec As Integer , _min As Integer , _hour As Integer
Dim Sec_str As String * 2 , Min_str As String * 2 , Hour_str As String * 2 , Day_str As String * 2 , Year_str As String * 2 'Variablen für mehrtsellige Ausgabe'
'Timer1: resolution = 1ms
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising 'bei 8Mhz Quarz'
Timer1 = 0
On Icp1 Icp_int 'Input Capture an dem das 868Mhz Funkmodul betrieben wird'
Enable Icp1
Wait 3 'Wartezeit bis LAN Modul bereit ist'
Print #2 , "Programm start"
Waitms 200
Gosub Speakersound
Waitms 200
Gosub Speakersound
'##################### Hauptschleife #######################'
Hauptschleife:
Do
If Ischarwaiting(#2) = 1 Then 'Wenn über den UART2 was reinkommt springe zur UART Auswertung'
Gosub Uart2auswertung
End If
Gosub Empfang868mhz 'Gehe zum 868Mhz Funkempfang'
Loop
'############## UART Auswertung ###############'
Uart2auswertung: 'Zeichen werden zusammengesetzt und bei 13 ausgewertet'
Disable Interrupts
Buffer = Inkey(#2)
If Buffer >= 13 Then
If Buffer = 13 Then
Gosub Auswertung
Else
If Len(uart2eingang) < 149 Then
Uart2eingang = Uart2eingang + Chr(buffer)
Else
Uart2eingang = ""
Clear Serialin1
End If
End If
End If
Enable Interrupts
Return
Auswertung:
Print #2 , Uart2eingang 'Gebe alles 1:1 aus was am UART reingekommen ist zum Test'
Gosub Uhrzeitlesen
Print #2 , Hour_str ; ":" ; Min_str ; ":" ; Sec_str 'Zeitstempel ebenso ausgeben'
Uart2eingang = ""
Clear Serialin1
Return
'#################### Input Capture 868Mhz Empfänger #############################'
Icp_int:
Fs20cycle1 = Timer1
Timer1 = 0
Select Case Fs20cycle1
Case Is < 599 'below 600µs, reset bitcounter
Count1 = 1
Case 600 To 1000 '600-1000µs, 0-bit
Rxbit1 = 0
Rdy1 = 1
Case 1001 To 1400 '1000-1400µs, 1-bit
Rxbit1 = 1
Rdy1 = 1
Case Is > 1401 'over 1400µs, reset bitcounter
Count1 = 1
End Select
Return
'#################### Funk Empfang 868Mhz #############################'
Empfang868mhz:
'Hier findet die Auswertung vom Input Capture ICP1 statt und wird der Variablen "Gesamtcode" übergeben'
'Der Code ist umfangreich, mehrfach getestet und funktioniert. Habe ihn entfernt damit der Code fürs Forum nicht zu Umfangreich wird'
Gosub Speakersound
Print #2 , Gesamtcode1 'Alles was über 868Mhz empfangen wird, wird hier ausgegeben zum Test'
Waitms 100
Return
'##################################### DS1307 ######################################'
Datumschreiben:
_day = 31 : _month = 05 : _year = 13
Uhrzeitschreiben:
_sec = 00 : _min = 13 : _hour = 23
Gosub Uhrumrechnung
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour) : _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart : I2cwbyte Ds1307w : I2cwbyte 0 : I2cwbyte _sec : I2cwbyte _min : I2cwbyte _hour : I2cstop : I2cstart : I2cwbyte Ds1307w
I2cwbyte 3 : I2cwbyte _weekday : I2cwbyte _day : I2cwbyte _month : I2cwbyte _year : I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) : _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Uhrzeitlesen: 'Lese Zeit und Datum aus dem DS1307'
I2cstart
I2cwbyte Ds1307w : I2cwbyte 0 : I2cstop : I2cstart : I2cwbyte Ds1307r : I2crbyte _sec , Ack : I2crbyte _min , Ack : I2crbyte _hour , Ack
I2crbyte _weekday , Ack : I2crbyte _day , Ack : I2crbyte _month , Ack : I2crbyte _year , Nack : I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) : _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Gosub Uhrumrechnung
Return
Uhrumrechnung:
Select Case _weekday
Case Is = 1 : _wochentag = "Mo"
Case Is = 2 : _wochentag = "Di"
Case Is = 3 : _wochentag = "Mi"
Case Is = 4 : _wochentag = "Do"
Case Is = 5 : _wochentag = "Fr"
Case Is = 6 : _wochentag = "Sa"
Case Is = 7 : _wochentag = "So"
End Select
Select Case _month
Case Is = 1 : _monat = "Jan"
Case Is = 2 : _monat = "Feb"
Case Is = 3 : _monat = "Mar"
Case Is = 4 : _monat = "Apr"
Case Is = 5 : _monat = "Mai"
Case Is = 6 : _monat = "Jun"
Case Is = 7 : _monat = "Jul"
Case Is = 8 : _monat = "Aug"
Case Is = 9 : _monat = "Sep"
Case Is = 10 : _monat = "Okt"
Case Is = 11 : _monat = "Nov"
Case Is = 12 : _monat = "Dez"
End Select
Sec_str = Str(_sec) '2-stellig'
Sec_str = Format(sec_str , "00")
Min_str = Str(_min)
Min_str = Format(min_str , "00")
Hour_str = Str(_hour)
Hour_str = Format(hour_str , "00")
Day_str = Str(_day)
Day_str = Format(day_str , "00")
Year_str = Str(_year)
Year_str = Format(year_str , "00")
Return
'################################## Sound ##################################'
Speakersound:
Sound Speaker , 25 , 300
Return
End