Forum: Mikrocontroller und Digitale Elektronik Daten auslesen soft uart und Variablen zuweisen


von Kalle K. (kalle100)


Lesenswert?

Hallo Bascom Kenner,
habe leider ein riesiges Problem mit dem auslesen der soft uart!
FOLGENDER CODE:
1
 rem die eingelesenen Daten werden den Variablen  nicht zugewiesen???
2
$regfile = "m644Pdef.dat "
3
 $crystal = 8000000
4
  $baud = 9600
5
  $hwstack = 100
6
    $swstack = 100
7
     $framesize = 100
8
9
$baud = 9600
10
 Baud = 9600
11
  Config Pind.5 = Input
12
    Config Pind.6 = Input
13
14
   Open "comd.6:9600,8,n,1" For Input As #1
15
   Open "comd.5:9600,8,n,1" For Input As #2
16
17
Declare Sub Serial1charmatch()
18
Declare Sub Serial2charmatch()
19
20
    Enable Interrupts
21
22
      Dim Xsoll As Integer
23
      Serialin2_data Alias Xsoll
24
      Dim Xist As Integer
25
      Serialin1_data Alias Xist 
26
......................................................
27
do
28
print xsoll
29
if......
30
loop
31
end
32
........................................................
33
  Sub Serial1charmatch()
34
         Local Xist As Integer
35
        Input Serialin1_data Noecho
36
    End Sub Serial1charmatch()
37
38
 Sub Serial2charmatch()
39
    Local Xsoll As Integer
40
     Input Serialin2_data Noecho
41
    End Sub Serial2charmatch()
Leider werden keine Daten erkannt oder zB. Xsoll zugewiesen ?!?!?
Was mache ich blos falsch ?
mit der Bitte um Hiiiiiiilfe

Kalle (Bascom Neuer)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Ich würde halt mal hier
1
 Sub Serial2charmatch()
2
    Local Xsoll As Integer
3
     Input Serialin2_data Noecho

die lokale Variable Xsoll rausnehmen.
Auch wenn Serialin2_data ein Alias für Xsoll ist und dieses Xsoll 
eigentlich hier
1
      Dim Xsoll As Integer
2
      Serialin2_data Alias Xsoll
gelten sollte, so würde ich da Bascom nicht über den Weg trauen. Da sind 
auch noch andere seltsame Dinge augefallen. Es würde mich nicht wundern, 
wenn der Compiler den Alias so auflöst, dass er bei der Verwendung von 
SerialIn2_data sich erneut auf die Suche macht, mit welcher anderen 
Variablen der Alias verknüpft werden soll. Und dann stösst er halt auf 
die lokale Variable als erster Kandidat für die Auflösung des Alias.
Das ist jetzt allerdings mehr geraten als gewusst.


Wozu eigentlich der Alias?
Ja, gut man kann das natürlich machen. Man kann aber auch sich selbst 
ins Bein schiessen und solange Aliase einführen, bis kein Schwein 
(inklusive Compiler) mehr durchblickt, welche Variable jetzt welche ist 
und wo zugewiesene Daten dann eigentlich tatsächlich landen.

was spricht gegen?
1
 Sub Serial2charmatch()
2
   Input Xsoll Noecho
3
 End Sub Serial2charmatch()
Wäre das zu einfach? Zu durchschaubar? Zu naheliegend? Zu leicht 
nachzuvollziehen?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Ausserdem:
Serialcharmatch ist eine Sub, die aufgerufen wird, wenn im Eingabestrom 
ein bestimmtes Zeichen auftritt, wobei man das Zeichen, auf welches 
reagiert werden soll, konfigurieren kann/muss.

Aus der BASCOM Hilfe
1
Config Serialin1 = Buffered , Size = 20 , Bytematch = 65
2
Config Serialin2 = Buffered , Size = 20 , Bytematch = 66
3
Config Serialin3 = Buffered , Size = 20 , Bytematch = All
4
5
....
6
7
'Label called when UART1 received an A
8
Serial1charmatch:
9
Print #2 , "we got an A"
10
Return
11
 
12
 
13
'Label called when UART2 received a B
14
Serial2charmatch:
15
Print #3 , "we got a B"
16
Return
17
 
18
 
19
'Label called when UART3 receives a char
20
Serial3bytereceived:
21
Print #4 , "we got a char"
22
Return

(Der ASCII Code von 'A' ist 65. Der ASCII Code von 'B' ist 66. Daher die 
Zahlen in den Bytematch Angaben)

Ich kann bei dir weder eine entsprechende Konfiguration mit einem 
Bytematch entdecken, noch wäre der Name der Sub im anderen Falle 
korrekt. Man beachte, dass bei der UART2 das Label "Serial2charmatch" 
heißt, bei der UART3, die aber laut Kommentar auf alle Zeichen reagieren 
soll, heisst das Label "Serial3bytereceived".

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Vielleicht doch ein bischen besser die Doku studieren?
http://avrhelp.mcselec.com/index.html?config_serialin.htm

und ein wenig studieren und überlegen, was man in den jeweiligen 
Demo-Codes so alles sieht, warum das dort ist und was der Ersteller des 
Demo Codes damit beispielhaft zeigen möchte?

: Bearbeitet durch User
von Kalle K. (kalle100)


Lesenswert?

Danke Karl-Heinz !!!
Mache es wohl zu kompliziert?!!!!!

Habe ich das jetzt richtig verstanden ?:
Durch
Sub Serial2charmatch()
   Input Xsoll Noecho
 End Sub Serial2charmatch()

werden die empfangenden Daten der Variablen Xsoll zugewiesen, nach 
eingang von CR?
Kalle

von Kalle K. (kalle100)


Lesenswert?

sorry!!
Danke für den Hinweis.

Die Doku habe ich immer wieder gelesen, ich mache wohl einen ganz blöden 
,einfachen Fehler ??!
Habe ich leider aus Versehen  nicht mit in die Frage  kopiert!
Ist aber auch drin im code:
Config Serialin1 = Buffered , Size = 20 , Bytematch = 13
Config Serialin2 = Buffered , Size = 20 , Bytematch = 13

.....................
Ist die Sub jetzt besser,richtig ?:

  Sub Serial1charmatch()
         Local Xist As Integer
        Input Xist Noecho
     End Sub Serial1charmatch()
....................
Leider werden daten trotzdem nicht, zB Xist, zugewiesen.
Ob von eineim anderen µC gesendet oder von einem Terminalprogramm, 
leider hat Xist und Xsoll immer den Wert Null????!
sorry!

von mue-c (Gast)


Lesenswert?

Hallo Kalle,
hier der erste Satz aus der Hilfe zu Config SerialIn:

Configures the hardware UART to use a buffer for input

Die beiden HW UARTS kannst du nicht verwenden?
Senden geht mit Soft UART immer noch relativ gut, aber empfangen ist 
dann schon etwas aufwändiger. Du wirst nicht von der HW über eingehende 
Zeichen informiert. Du könntest höchstens den PCINT von D.5 und D.6 
benutzen.

von mue-c (Gast)


Lesenswert?

Du musst dann übrigens in Input, Inputbin und ähnlichen Befehlen wieder 
den Kanal angeben, den du im Open Befehl zugewiesen hast.
Ansonsten wird der HW UART abgehört.

von Kalle K. (kalle100)


Lesenswert?

Hallo my gast,
brauche den HW uart für eine sichere Ausgabe!
Hat der at644 zwei HW uarts ?
Wie mache ich das ?:
"Du musst dann übrigens in Input, Inputbin und ähnlichen Befehlen wieder
den Kanal angeben, den du im Open Befehl zugewiesen hast."

Lese ich den Wert nicht durch Local im Sub ein ?
Danke schön , schonmal !!
Kalle

von Peter D. (peda)


Lesenswert?

Ich würde mir erstmal ein Protokoll überlegen, wie man zuverlässig 
Paketanfang und -ende erkennen kann.
Und dann immer ein komplettes Paket in einem Puffer ablegen.
Und dann in diesem Puffer die Nachricht parsen.

Wenn Du nichtmal weißt, daß Du zum Sender synchron bist, dann hast Du 
nur einen Haufen einzelner Bytes und weißt von keinem, was es bedeuten 
soll.

von Karl H. (kbuchegg)


Lesenswert?

Kalle Kohn schrieb:

> Lese ich den Wert nicht durch Local im Sub ein ?

Äh nein.
Ein Byte kriegt man von der UART mittels eines Aufrufs von Input oder 
Inkey oder dergleichen.

Bitte STUDIER die Beispiele in der Doku!
Lies nach, was die einzelnen Befehle wirklich machen.

Du kommst auf Dauer nicht darum herum. Programmieren (auch mit BASCOM) 
ist eine der komplexesten Tätigkeiten, die es auf diesem Planeten gibt. 
Das lernt man nicht zwischen Tür und Angel. Und auch nicht durch Raten.
Egal was dir die BASCOM Verfechter einreden: Selbst wenn in BASCOM 
manche Dinge einfacher sind als in anderen Sprachen - du kommst nicht 
drum herum, die Dinge zu lernen! Und das beinhaltet auch das Studium der 
Doku und der dort angegebenen Beispiele.
Und ja - das alles beinhaltet auch Eigeninitiative und Testprogramme um 
die Dinge zu ergründen. Es ist unmöglich, alle die kleinen Details in 
Forenbeiträgen zu erklären. Du musst da auch selber soweit sein, dass du 
ein Gedankenmodell erstellst und überprüfst ob dein Modell stimmt.

: Bearbeitet durch User
von Kalle K. (kalle100)


Lesenswert?

Habe jetzt statt der soft uart die HW uart zum einlesen des Wertes 
genommen,
so klappen die Routinen.
Der gesendete Wert wird  gelesen und verarbeitet!
Vielleicht steige ich besser auf den at2560 um, der hat 4HW uarts ?!
Kann mir das jemand bestätigen dass dies einfacher/sicherer  sein wird?
danke für die bisherigen Tipps!
Kalle

von Peter D. (peda)


Lesenswert?

Kalle Kohn schrieb:
> Kann mir das jemand bestätigen dass dies einfacher/sicherer  sein wird?

Da niemand weiß, was Du mit den 4 UARTs machen willst: Nein

Ohne ein geeignetes Protokoll ist sämtliche Übertragung unsicher.

Ein Protokoll muß mindestens:
- unterbrochene oder fehlerhafte Nachrichten erkennen können
- sich auf die nächste fehlerfreie Nachricht synchronisieren können

: Bearbeitet durch User
von Kalle K. (kalle100)


Lesenswert?

Danke für die ehrliche Antwort Peter.

Mein Anwendung ist ein soll-/ist- Wert vergleich mit Steuerung einer 
Motorhardeware (Ausgabe der Steuerbefehle muss über RS232 erfolgen).
Der Ist Wert kommt von einem anderen µC, der Soll Wert über USB von 
einem PC.
Die eingegangen Werte sollen zwischen gespeichert werden , soweit 
erforderlich?!
mfG Kalle

von Kalle K. (kalle100)


Lesenswert?

Noch ein VERSUCH ;
MAN OH MAN OH MAN; Ich empfange einfach kein Zeichen über die soft 
uart!!!

Was mach ich bloß falsch? Kann mir niemand dabei helfen ?
Gesendet wird laufend Xist von einem µC mit folgendem Code:
1
$regfile = "m644Pdef.dat "
2
 $crystal = 16000000
3
  $baud = 9600
4
  $hwstack = 32
5
    $swstack = 32
6
    $framesize = 32
7
    $baud = 9600
8
9
Rem  TASTER1 an PD2
10
Taster1 Alias Pind.2
11
Config Taster1 = Input
12
Portd.2 = 1                              'PullUp-Widerstand einschalten
13
14
Rem  Taster2 An Pd3
15
Taster2 Alias Pind.3
16
Config Taster2 = Input
17
Portd.3 = 1        
18
 Do
19
     If Taster1 = 0 Then Print 100
20
     If Taster2 = 0 Then Print 500
21
   Loop
22
 End
Empfangen möchte ich laufend den Xist Wert über eine soft uart ,zum 
Vergleich mit Xsoll,
mit folgendem Code:
1
Rem $sim
2
$regfile = "m644Pdef.dat "
3
 $crystal = 8000000
4
  $baud = 9600
5
  $hwstack = 32
6
    $swstack = 32
7
     $framesize = 32
8
      $baud = 9600
9
Rem Pind5 als erste soft uart eingang xist
10
11
 Config Pind.5 = Input
12
 Open "comd.5:9600,8,n,1" For Input #2
13
 Config Serialin1 = Buffered , Size = 20 , Bytematch = 13
14
15
 Declare Sub Serial1charmatch()
16
 Enable Interrupts
17
      Dim Xsoll As Integer
18
      Dim Xist As Integer
19
 Xsoll = 200
20
 Set Xsoll
21
22
    Do    
23
     IF Xsoll>Xist Then...........
24
       Print Xsoll
25
       Print Xist     
26
     Loop
27
28
       End
29
Rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30
31
 Sub Serial1charmatch()           
32
      Local Xist As Integer      
33
      Print Xist
34
    End Sub Serial1charmatch()
------------------------------------------------------------------------ 
---
Fehler bei den Interups? Oder den Integer Variablen ?Oder beim senden 
des Wertes Xist ? CR und LF falsch gesendet ?
Mit der Bitte um Hilfe........und freundlichem Gruß
Kalle

: Bearbeitet durch User
von mue_c (Gast)


Lesenswert?

Nach dem kleinen Ausrutscher über den funktionierenden HW UART bist du 
jetzt wieder beim Soft UART angekommen.
Da gelten die Regeln wie oben beschrieben, falls du dich erinnerst:

Config Serialin = Buffered

funktioniert nur beim HW UART. Gehe 7 Beiträge zurück.

von Kalle K. (kalle100)


Lesenswert?

Danke für den Hinweis mue_c !
Die HW uart brauche ich für die Motosteurung weil sie scheinbar darüber 
viel schneller anzusprechen ist  und die Geschwindigkeit hier massgebend 
ist.

Wenn es mit der soft uart nicht geht muss ich es wohl drauf ankommen 
lassen und den Motor (Antrieb einer Pumpe) viel langsamer laufen lassen.
Ist denn sonst noch ein Fehler vorhanden ?

Ist das senden und das laufende empfangen  des Xist Wertes auf diesem 
Weg  möglich ?(Wenn der Code richtig an die HW uart angepasst ist ?

mfG
Kalle

von mue_c (Gast)


Lesenswert?

Ich sage ja nicht, dass es über einen Soft UART nicht geht, aber du 
kannst dafür keine Funktionen nutzen, die den HW UART erfordern.
Wenn du z.B. über den PCInt feststellst, dass Daten kommen, liest du 
über inkey(#x) ein byte ein. x steht dabei für den zugewiesenen Kanal.

von Kalle K. (kalle100)


Lesenswert?

Danke nochmals!!
Werde ich morgen mal versuchen. Sorry , dass die Komunikation zwischen 
µC "s doch nicht so einfach ist habe ich nicht gewusst und die 
Problematik unterschätzt .
Hoffe ich kann weiter Hilfe bekommen , auch wenn meine Anfägerfragen 
nerven und ich mich scheinbar im Kreise drehe ?????!!!!!!!!!!!!
schönen Sonntag
Kalle

von Kalle K. (kalle100)


Lesenswert?

Hallo zusammen,
sehe ich das richtig:
ischarwaiting klappt nicht mit der SW uart?
inkey kann den Wert Null nicht empfangen um ihn weiter zu verarbeiten ?

Kalle

von mue_c (Gast)


Lesenswert?

Kalle Kohn schrieb:
> Hallo zusammen,
> sehe ich das richtig:
> ischarwaiting klappt nicht mit der SW uart?
Ja.
> inkey kann den Wert Null nicht empfangen um ihn weiter zu verarbeiten ?
Wie kommst du da drauf?
Inkey gibt eine 0 zurück, wenn kein Char eingetroffen ist und du kannst 
am Ergebnis nicht unterscheiden, ob nichts oder der Wert 0 empfangen 
wurde.
Deshalb wird beim HW UART vorher IsCharWaiting aufgerufen. Beim SW UART 
musst du das anders erkennen, z.B. über einen ausgelösten PCInt.

von Kalle K. (kalle100)


Lesenswert?

sorry, gerade erst deine Antwort entdeckt.
Kann ich (oder muss )also den Pin der als eingang für die soft uart 
gewählt ist für pcint nehmen?
mfg
Kalle

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.