Forum: Mikrocontroller und Digitale Elektronik Hard-und Software Uart zwischen zwei ATmega8, Empfang funktioniert nicht: (Bascom)


von Matthias B. (matthias_b14)


Angehängte Dateien:

Lesenswert?

Hallo

Ich ärger mich heut schon den ganzen Tag mit der Software Uart rum. Ich 
möchte mit meinem Programm Daten via RS232 vom PC empfangen sowie 
auswerten und danach kommandos als String über die Software-Uart an den 
zweiten ATMega8 schicken. Das senden klappt dabei problemlos, die 
Zeichen werden via SoftwareUART übertragen. Der Slave scheint auch etwas 
zu empfangen.
Das Problem welches ich nun habe ist jedoch das von der übertragenen 
Zeichenkette scheinbare kein Byte außer <CR> ankommt. Habe mal nen HTerm 
schirm rangehangen zum nachvollziehen. Gesendet wurde immer "#001adr".

Der code des Masters:
1
 $regfile = "m8def.dat"
2
 $crystal = 8000000
3
 $hwstack = 100
4
 $swstack = 100
5
 $framesize = 100
6
 $baud = 9600
7
8
 Declare Sub Serial0charmatch()
9
 Declare Sub Antwortavr()
10
 Declare Sub Cmdadr()
11
12
'########[ Variables ]#####################################################
13
  Dim New_command As String * 10 , A As String * 3 , Command As String * 3
14
  Dim Antwort As String * 10
15
16
'########[ Constants ]#####################################################
17
 Const Adresse = "001"
18
19
'########[ Hardware Configuration ]########################################
20
 Config Portd.4 = Output
21
 Senden Alias Portd.4
22
 Config Serialin = Buffered , Size = 10 , Bytematch = 13
23
24
'########[ Initialisation ]################################################
25
 Open "comd.6:9600,8,N,1" For Output As #1                  'TXD
26
 Open "comd.7:9600,8,N,1" For Input As #2                   'RXD
27
 Enable Interrupts
28
 Senden = 0
29
30
'########[ Main Code ]#####################################################
31
Do
32
!nop
33
Loop
34
End
35
36
'########[ Subroutines ]###################################################
37
 Sub Serial0charmatch()
38
   Input New_command Noecho
39
   Clear Serialin
40
   If Instr(new_command , "#") = 1 Then    'Suchen nach Startzeichen (#)
41
      A = Mid(new_command , 2 , 3)         'Abtrennen der Adresse
42
      Command = Mid(new_command , 5 , 3)   'Abtrennen des Befehls
43
      Command = Ucase(command)             'Umwandeln in Großbuchstaben
44
45
      Select Case A
46
         Case Adresse
47
            Select Case Command             'Selektion nach kommando
48
               Case "ADR"
49
                    Call Cmdadr
50
            Case Else
51
               Print "Unbekanntes Kommando"
52
               End Select
53
         Case Else
54
               Print "Unbekannte Adresse"
55
      End Select
56
57
   A = "" : Command = ""
58
59
   Else
60
   New_command = ""
61
62
   End If
63
 End Sub
64
65
66
 Sub Cmdadr()
67
 Senden = 1
68
   Print #1 , A + Command
69
   Print "gesendet: " ; A + Command
70
 Senden = 0
71
   Call Antwortavr
72
 End Sub
73
74
75
 Sub Antwortavr()
76
  Input #2 , Antwort
77
  Print "Antwort von AVR: " ; Antwort   'Antwort von AVR an RS232 übergeben
78
 End Sub

und hier der Code des Slave:
1
$regfile = "m8def.dat"
2
 $crystal = 8000000
3
 $hwstack = 100
4
 $swstack = 100
5
 $framesize = 100
6
 $baud = 9600
7
8
 Declare Sub Serial0charmatch()
9
10
'########[ Variables ]#####################################################
11
 Dim New_command As String * 10
12
13
'########[ Hardware Configuration ]########################################
14
 Config Serialin = Buffered , Size = 10 , Bytematch = 13
15
 Config Portb.0 = Output
16
 Enable Interrupts
17
18
'########[ Main Code ]#####################################################
19
Do
20
!nop
21
Loop
22
End
23
24
'########[ Subroutines ]###################################################
25
Sub Serial0charmatch()
26
Toggle Portb.0                       'anzeigen ob etwas empfangen wurde
27
   Waitms 100
28
   Input New_command Noecho          'Einlesen in new_command
29
30
   Print "Empfangen: " ; New_command         'Ausgabe zur kontrolle
31
32
 End Sub

Der Printbefehl des slave liefert immer nur "Empfangen: " zurück. 
Kommentiere ich die waitms 100 zeile aus, erhalte ich gar keine Antwort.
Warum enthält er nicht auch die entsprechenden Kommendos? Was habe ich 
falsch konfiguriert? Kann mir bitte jemand helfen?

von xfred (Gast)


Lesenswert?

wh. sendest du CR+LF, sodass dann nur das LF empfangen wird

von Matthias B. (matthias_b14)


Lesenswert?

> wh. sendest du CR+LF, sodass dann nur das LF empfangen wird

Nun wenn das das problem ist weiß ich aber dummerweise nicht wie ich das 
abstellen kann das <CR><LF> gesendet werden. Könnte mir da jemand bitte 
einen Tipp geben. Ich hab jetzt beim Slave auch schon versucht Bytematch 
auf 10 zu setzen, Ergebnis ist exakt das selbe:(.

von weinbauer (Gast)


Lesenswert?

<cr><lf> unterdrückst DU indem Du am Ende der Printanweisung ein 
Semikolon ";" setzt.

Prints haben in der ISR aber nicht viel zu suchen, ... ohne CR geht aber 
auch der Input nicht, der braucht das Endzeichen oder nen $timeout, 
sonst hängt die Geschichte im Input bis in alle Ewigkeit

von weinbauer (Gast)


Lesenswert?

was ich auch nicht sehe ... wo ist denn das Call Serial0charmatch() ??

von Matthias B. (matthias_b14)


Lesenswert?

weinbauer schrieb:
> was ich auch nicht sehe ... wo ist denn das Call Serial0charmatch() ??

Nun das brauche ich in dem Fall nicht weil ich gepuffert einlese. Beim 
Config wurde der Bytematch auf 13 gesetzt. Das bedeutet das das Programm 
sobald chr(13) (bzw. <CR>) empfangen wird zu Serial0charmatch() hüpft 
und dort den zuvor gepufferten String in die Variable new_command 
schreibt. Das klappt beim Master auch wunderbar nur leider habe ich bei 
Slave das problem das der Puffer leer zu sein scheint:(.
Ich vermute mitlerweile das ich aus irgend einen Grund <CR> vor dem 
eigentliche String an den Slave schicke und dieser daraufhin 
unterbricht. Da aber außer dem <CR> nix weiter im Sendepuffer vorhanden 
ist bleibt die variable new_command des slave leer. Alle weiteren 
zeichen die noch rein rauschen würden dann vermutlich übersehen 
werden... Kann das sein? Wenn dem so ist ha einer nen konkreten Tipp wie 
man das verhindert bzw. erstmal prüfen kann (Habe keiin Oszi;))? Danke 
weiterhin:).

von rs232 master (Gast)


Lesenswert?

Hallo,

mach das alles nochmal neu und dann auch gleich "richtig" über reine 
Interruptsteuerung.

Wie man es sauber und strukturiert macht erklärt
http://www.rowalt.de/mc/index.htm

im Kapitel "Einführung 6".

Ferner solltetst Du den Empfänger und den Sender erst einmal gegen ein 
Terminalprogramm kommunizieren lassen.
Das hilft sehr beim debuggen und Du kannst schrittweise vorgehen und 
Fehler vermeiden.

Serielle Kommunikation benötigt sauberes Grundlagenwissen und eine 
konzentrierte Herangehensweise mit einem klaren Konzept !


LG

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.