Forum: Mikrocontroller und Digitale Elektronik Timer soll Variabel löschen in Bascom.


von Ralf - Rainer R. (ralf_r26) Flattr this


Lesenswert?

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

von kürbis (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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.

von Ralf - Rainer R. (ralf_r26) Flattr this


Lesenswert?

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

von peterfido (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.