Hallo zusammen, ich hoffe auf einen Tipp von Euch. Der MC empfängt über URAT definierte Daten, wärend er in der Schleife 'Warten' läuft. Die Ports steuern eine LED-Matrix. In der Variabel 'Empfangen' werden die Daten gesammelt. So lange ich über RS232 die Daten sende, ist alles OK. keine Fehler. Folgendes Problem: Bei Empfang von den Daten über ein Funkmodul, kommen auch andere Daten an welche nicht für mich bestimmt sind. Diese können sehr unterschiedlich aussehen. Jetzt wird die Wartenschleife nicht mehr verlassen und ich muss ein Reset auslösen. Doch das ist nicht sinn der Sache. Wie also in diesem Fall die Variabel 'Empfangen' löschen. Vieleicht nach Zeit? Lücken größer einer Länge von einem Byte auswerten und die Variabel 'Empfangen' löschen (Empfangen = ""). Ich habe mir die Timer-Funktionen mal angesehen, aber habe nichts auf deutsch gefunden. Hatte mal vor 40 Jahren englisch, doch nie wieder gebraucht. Nur was ich so für den Umgang mit Technik brauchte. Vieleicht gibt es auch noch andere Möglichkeiten. Ich bin dankbar für jeden Tip. Programmausschnitte: $regfile = "m16def.DAT" 'ATmega16-Deklarationen $crystal = 16000000 'Quarz: 16 MHz $hwstack = 40 $swstack = 16 $framesize = 32 $baud = 19200 ' use baud rate Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 Config Porta = Output Config Portb = Output Config Portc = Output On Urxc Onrxd Enable Urxc Enable Interrupts Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim F As Byte Dim E As Byte Dim Z As Byte Dim H As Byte Dim Ab As Byte Dim T As Byte Dim Empfangen As String * 14 Dim Namen As String * 9 Dim Hu As Byte Dim Ze As Byte Dim Ei As Byte Dim Abc As Byte Dim Tex As Byte Dim Hun As String * 1 Dim Zeh As String * 1 Dim Ein As String * 1 Dim Abcd As String * 1 Dim Text As String * 1 Dim Pixel As Byte Dim I As Byte Dim Eingabe As String * 1 Dim Zähler As Byte Dim Länge As Byte Starten: Porta = 0 Portb = 0 Portc = 0 Wait 1 Portc.7 = 1 Empfangen = "" Print " Start " 'Rückmeldungstest '------------------------------------------------ Warten: Namen = Left(empfangen , 9) Länge = Len(empfangen) If Namen = "abcdefghi" And Länge = 14 Then 'codierung Print Namen : Print 'Rückmeldungstest Print Länge : Print 'Rückmeldungstest Namen = "" Länge = 0 Gosub Los 'Sprung in ein Auswerteprogramm End If $timeout = 100000 'aussieben von falschen Paketen Goto Warten '------------------------------------------------ Los: Print "Empfangen -> " ; Empfangen : Print Portc.7 = 0 ' 1-9 = Codierung ' 10-12 = Liednummer ' 13 = Liedindex ' 14 = Liedsammlung '------------------------------------------------ ' Anzeige des Liedindexes ob a, b, c, oder nichts. 'a = 9 'b = 3 'c = 7 'nichts = 0 '------------------------------------------------ Hun = Mid(empfangen , 10 , 1) 'Liednummer Hunderter Stelle Hu = Val(hun) Zeh = Mid(empfangen , 11 , 1) 'Liednummer Zehner Stelle Ze = Val(zeh) Ein = Mid(empfangen , 12 , 1) 'Liednummer Einer Stelle Ei = Val(ein) Abcd = Mid(empfangen , 13 , 1) 'Zusatz a, b, c oder Nicht Abc = Val(abcd) Text = Mid(empfangen , 14 , 1) 'Anzeige Vorlagenvariante Texte Tex = Val(text) '------------------------------------------------ ' Liednummer Hunderter=H, Zehner=Z, Einer=E, Ab=Zusatz a, b, c H = Hu + 32 Z = Ze + 16 E = Ei Ab = Abc + 64 '------------------------------------------------ ' Ist die hunderter Ziffer nicht Null, dann schalte die ' Nullunterdrückung für die zehner Ziffer aus. F = H - 32 If F <> 0 Then Portc.6 = 1 '------------------------------------------------ Print "-- 2 --" : Print 'Rückmeldungstest Empfangen = "" If Tex = 1 Then Goto Prog1 If Tex = 2 Then Goto Prog2 If Tex = 3 Then Goto Prog3 If Tex = 4 Then Goto Prog4 If Tex = 5 Then Goto Prog5 If Tex = 6 Then Goto Prog6 If Tex = 7 Then Goto Prog7 If Tex = 8 Then Goto Prog8 If Tex = 9 Then Goto Test If Tex = 0 Then Goto Starten Return '======================================================================= ======== Prog1: Print "Programm 1 -> Mappe 1" : Print 'Rückmeldungstest Do Namen = Left(empfangen , 9) Länge = Len(empfangen) If Namen = "abcdefghi" And Länge = 14 Then 'Codierung Print Namen : Print 'Rückmeldungstest Print Länge : Print 'Rückmeldungstest Namen = "" Länge = 0 Gosub Los End If 'aussieben von falschen Paketen Restore Map1 For T = 1 To 73 Read Pixel : Portb = Pixel Waitus 40 Next T Portc.7 = 1 Gosub Lied Portc.7 = 0 '------------------------------------------------ ' Ende nach Zeit '------------------------------------------------ ' Ende auf Befehl '------------------------------------------------ Loop '======================================================================= ======== Lied: ' Liedanzeige zum Pot A schicken Print "Lied" : Waitms 10 'Rückmeldungstest Porta = E + 128 Waitus 600 Porta = Z + 128 Waitus 600 Porta = H + 128 Waitus 600 Porta = Ab + 128 Waitus 600 Porta = 0 Return '======================================================================= ======== Onrxd: Empfangen = Empfangen + Chr(udr) Return '======================================================================= ======== End Map1: '1-73 ' Zu Programm 1 Data 000 , 003 , 014 , 023 , 032 , 033 , 034 , 035 , 040 , 041 , 042 , 046 Data 054 , 055 , 064 , 066 , 067 , 072 , 075 , 085 , 087 , 096 , 099 , 101 Data 102 , 103 , 104 , 107 , 108 , 109 , 110 , 112 , 113 , 114 , 115 , 119 Data 128 , 131 , 132 , 135 , 136 , 137 , 138 , 140 , 143 , 144 , 145 , 146 Data 147 , 151 , 160 , 163 , 164 , 167 , 168 , 172 , 175 , 176 , 183 , 192 Data 195 , 197 , 198 , 199 , 200 , 204 , 205 , 206 , 208 , 209 , 210 , 211 Data 215
Ralf - Rainer R. schrieb: > ich hoffe auf einen Tipp von Euch. Suchen und schauen wie andere das machen. Kein goto verwenden. Stichwort: Ringpuffer etc. > Ich habe mir die Timer-Funktionen mal angesehen, aber habe nichts auf > deutsch gefunden. Hatte mal vor 40 Jahren englisch, doch nie wieder Unbedingt Englisch lernen wieder aufnehmen. Bei diesem Hobby muß man da durch. Bis dahin: http://halvar.at/elektronik/kleiner_bascom_avr_kurs/timer_counter/?PageSpeed=noscript
@ Ralf - Rainer Ratke (ralf_r26) >ich hoffe auf einen Tipp von Euch. Netiquette. Lange Quelltexte gehören in den Anhang. >Der MC empfängt über URAT definierte Daten, >wärend er in der Schleife 'Warten' läuft. >Die Ports steuern eine LED-Matrix. Machen Millionen so. >In der Variabel 'Empfangen' werden die Daten gesammelt. Welche Daten? Eine Variable hat meist nur 8 oder 16 Bit. Dein "Empfangen" ist aber ein String mit 14 Zeichen. >So lange ich über RS232 die Daten sende, >ist alles OK. keine Fehler. dann bleib dabei ;-) >Jetzt wird die Wartenschleife nicht mehr verlassen und ich muss ein >Reset auslösen. Doch das ist nicht sinn der Sache. Nein. >Wie also in diesem Fall die Variabel 'Empfangen' löschen. >Vieleicht nach Zeit? Lücken größer einer Länge von einem Byte >auswerten und die Variabel 'Empfangen' löschen (Empfangen = ""). Kann man machen. Besser ist es aber, ein Befehlsendezeichen zu erkennen und passend zu reagieren, z.B. RETURN \r >Ich habe mir die Timer-Funktionen mal angesehen, aber habe nichts auf >deutsch gefunden. Hatte mal vor 40 Jahren englisch, doch nie wieder >gebraucht. Nur was ich so für den Umgang mit Technik brauchte. Hmm. >Vieleicht gibt es auch noch andere Möglichkeiten. Ja, gescheit programmieren. Das Ding da oben ist typsicher BASCOM-Bastelmurks. Für eine GESCHEITE LED-Matrix nimmt man einen Timer-Interrupt, auch bei BASCOM. Und im RXC Interrupt kann man nicht einfach blind ein Zeichen an "Empfangen" dranhängen! Denn das geht bisweile ewig und drei Tage! Man muss prüfen, ob noch Platz im String ist! Und wenn dieser voll ist oder das Befehlsendezeichen erkannt wurde, setzt man ein Flag (Variable) um der Verarbeitungsfunktion im Hauptprogramm eben genau DAS zu signalisieren! Hier muss man einiges umschreiben.
Erstmal vielen Dank für Eure Antworten. Eure Anregungen werde ich alle durcharbeiten. Eins ist klar, Ihr seid die Profis. Ich bin nur Laie. Das letzte mal hab ich Mitte bis Ende der 70ger Jahre ähnliche Sachen in BASIC programmiert. Da gab es noch keinen C64. Also erstmal vielen Dank. Ralf
Falls Du einen 433 MHz UART Sender / Empfänger nutzt: Sobald Dein naher Sender aufhört zu senden, kommen unzählige Daten anderer Sender rein. Dummerweise senden die anderen auch, wenn Dein Sender sendet. - Datenkollision. Deswegen senden z.B. Funkgeschaltete Steckdosen ihr Signal zig-Mal hintereinander, in der Hoffnung, dass eines schon durchkommt. Ich habe meine Sender/Empfänger Kombi zwischenzeitlich ausgemustert. Für meine Zwecke, wo die Kommunikation zuverlässig sein muss, war es ungeeignet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.