-         

Ergebnis 1 bis 3 von 3

Thema: AVR verarbeitet Daten von UART nicht?!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2008
    Ort
    Bamberg
    Alter
    29
    Beiträge
    13

    AVR verarbeitet Daten von UART nicht?!

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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):

    Code:
    $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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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:

    Code:
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2008
    Ort
    Bamberg
    Alter
    29
    Beiträge
    13
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •