PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR verarbeitet Daten von UART nicht?!



Feiler
16.02.2008, 20:15
Servus!

Und schon wieder habe ich ein Problem mit meinem AVR...

Das Problem ist folgendes: Ich möchte zu meinem AVR Daten senden - was auch soweit wunderbar funktioniert. Wenn ich nun die Daten auswerten möchte, sprich den Instr() Befehl nutzen will reagiert der Controller nicht mehr.
Ich habe testweise mal einen Eingang als Auswahlschalter programmiert, der mir die Variable ("Datenstring") füllt. Solange ich das mit diesem Eingang laufen lasse funktioniert alles wunderbar.
Erst wenn ich das ganze über den UART, sprich RS485/RS232 laufen lassen will macht der Controller nichts mehr. Woran könnte das liegen?

Hier noch der Quellcode (Beim Test mit dem Eingang habe ich vor Loop noch ein waitms 100 stehen gehabt):


$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600

'Port A
Config Porta = Input
Porta 0# = 1 'Setzt internen Pull-Up
Porta 0.1 = 1 'Setzt internen Pull-Up
Porta 0.2 = 1 'Setzt internen Pull-Up
Porta 0.3 = 1 'Setzt internen Pull-Up
Porta 0.4 = 1 'Setzt internen Pull-Up
Porta 0.5 = 1 'Setzt internen Pull-Up
Porta 0.6 = 1 'Setzt internen Pull-Up
Porta 0.7 = 1 'Setzt internen Pull-Up

'Port B
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output

'Port C
Config Portc = Output

'Port D
Config Portd = Output

'LightCOM! Bus (RS485) Einstellen
Rs485 Alias Portd.2
Rs485 = 0 'Karte ist als Slave geschalten

'Ports Benennen
Ausg_1 Alias Portc.7
Ausg_2 Alias Portc.6
Ausg_3 Alias Portc.5
Ausg_4 Alias Portc.4
Ausg_5 Alias Portc.3
Ausg_6 Alias Portc.2
Ausg_7 Alias Portc.1
Ausg_8 Alias Portc.0
Ausg_9 Alias Portd.7
Ausg_10 Alias Portd.6
Ausg_11 Alias Portd.5
Ausg_12 Alias Portd.4
Ausg_13 Alias Portd.3
Ausg_14 Alias Portb.4
Ausg_15 Alias Portb.3
Ausg_16 Alias Portb.2
Ausg_17 Alias Portb.1
Ausg_18 Alias Portb.0

Adr_1 Alias Pina.7
Adr_2 Alias Pina.6
Adr_4 Alias Pina.5
Adr_8 Alias Pina.4
Adr_16 Alias Pina.3
Adr_32 Alias Pina.2
Adr_64 Alias Pina.1
Adr_128 Alias Pina.0

Ausg_1 = 1
Ausg_18 = 1

'Variablen zuweisen
Dim Var_adresse As Integer 'Gibt die Adresse der Karte zurück
Dim Empfzeichen As Byte
Dim Datenstring As String * 7
Datenstring = ""


Dim Var_sucheadresse As String * 4
Dim Var_posdaten As Integer
Dim Var_pos As Integer

Do
'Boardadresse abfragen
Var_adresse = 0

Select Case Adr_1 'Adresse + 1
Case 0: Var_adresse = Var_adresse + 1
End Select
Select Case Adr_2 'Adresse + 2
Case 0: Var_adresse = Var_adresse + 2
End Select
Select Case Adr_4 'Adresse + 4
Case 0: Var_adresse = Var_adresse + 4
End Select
Select Case Adr_8 'Adresse + 8
Case 0: Var_adresse = Var_adresse + 8
End Select
Select Case Adr_16 'Adresse + 16
Case 0: Var_adresse = Var_adresse + 16
End Select
Select Case Adr_32 'Adresse + 32
Case 0: Var_adresse = Var_adresse + 32
End Select
Select Case Adr_64 'Adresse + 64
Case 0: Var_adresse = Var_adresse + 64
End Select
Select Case Adr_128 'Adresse + 128
Case 0: Var_adresse = Var_adresse + 128
End Select

'Ausgänge auswerten
Empfzeichen = Inkey()

Select Case Empfzeichen
Case 13:
Select Case Var_adresse
Case 0 To 9: Var_sucheadresse = "A00" + Str(Var_adresse)
Case 10 To 99: Var_sucheadresse = "A0" + Str(Var_adresse)
Case Is >= 100: Var_sucheadresse = "A" + Str(Var_adresse)
End Select

Var_posdaten = InStr(Datenstring, Var_sucheadresse)

If Var_posdaten > 0 Then
Var_pos = Var_posdaten + 4

If Mid(Datenstring, Var_pos, 3) = "Aus" Then
Ausg_1 = 1

ElseIf Mid(Datenstring, Var_pos, 3) = "Ein" Then
Ausg_1 = 0

End If

End If

Datenstring = ""

Case Else: Datenstring = Datenstring + Chr(Empfzeichen)
End Select
Loop


Gruß, Sven

for_ro
16.02.2008, 21:07
Porta 0# = 1 'Setzt internen Pull-Up
Porta 0.1 = 1 'Setzt internen Pull-Up
Porta 0.2 = 1 'Setzt internen Pull-Up
Porta 0.3 = 1 'Setzt internen Pull-Up
Porta 0.4 = 1 'Setzt internen Pull-Up
Porta 0.5 = 1 'Setzt internen Pull-Up
Porta 0.6 = 1 'Setzt internen Pull-Up
Porta 0.7 = 1 'Setzt internen Pull-Up
ist syntaktisch sicher falsch.
Vom Sinn her kannst du so schreiben
PORTA=255


Select Case Adr_1 'Adresse + 1
Case 0: Var_adresse = Var_adresse + 1
End Select
Select Case Adr_2 'Adresse + 2
Case 0: Var_adresse = Var_adresse + 2
End Select
Select Case Adr_4 'Adresse + 4
Case 0: Var_adresse = Var_adresse + 4
End Select
Select Case Adr_8 'Adresse + 8
Case 0: Var_adresse = Var_adresse + 8
End Select
Select Case Adr_16 'Adresse + 16
Case 0: Var_adresse = Var_adresse + 16
End Select
Select Case Adr_32 'Adresse + 32
Case 0: Var_adresse = Var_adresse + 32
End Select
Select Case Adr_64 'Adresse + 64
Case 0: Var_adresse = Var_adresse + 64
End Select
Select Case Adr_128 'Adresse + 128
Case 0: Var_adresse = Var_adresse + 128
End Select
Kannst du die Anschlüsse an PORTA genau anders herum machen, dann kannst du einfach schreiben:
Var_adresse=255-PORTA


Empfzeichen = Inkey()

Hier wir der µC stehenbleiben, wenn auf dem UART nichts anliegt.
Es sieht so aus, als würdest du immer eine kleine Anzahl Zeichen mit einem CHR(13) am Ende übertragen.
Dann kannst du auch den SerialCharMatch benutzen. Geht so:


Config Serialin = Buffered , Size = 20 , Bytematch = 13
Dim Datenstring as String * 20
Serial0charmatch:
Daten_count = 0
Datenstring = ""
While Ischarwaiting() = 1
Daten_key = Inkey()
If Daten_key <> Chr(13) Then
Incr Daten_count
If Daten_count < 20 Then
Datenstring = Datenstring + Chr(Daten_key)
End If
End If
Wend
Clear Serialin
'Print Datenstring
Return

Es werden maximal 20 Zeichen gespeichert, falls mehr entsprechend vergrößern.
Falls im Input Puffer ein CHR(13) auftaucht, wird automatisch die ISR Serial0CharMatch angesprungen. Dort werden dann die eingegangenen Zeichen an Datenstring angehängt. So wird der µC nie stehenbleiben.

Probier es mal.

Gruß

Rolf

Feiler
16.02.2008, 23:57
Servus Rolf!

Ich habe das mit dem Porta=255 und der entsprechenden Abfrage mal versucht und die Adresse via Print ausgegeben. Es kam nur 255 oder 0 an.
Die falsche Zuweisung am Anfang kam sicher daher das ich die *.bas Datei mit VB geöffnet hatte... In Bascom war die Syntax jedenfalls richtig...

Weiter habe ich mal den SerialCharMatch versucht. Aber auch hier brachte es keinen nennenswerten Erfolg.

Was ich noch dazu sagen sollte: Vom PC soll ein String mit max. 254 Stellen an den µC geschickt werden. Der String sollte dann mittels InStr() zerlegt werden.

Gruß, Sven