- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Atmega8 soll auf Zeichen reagieren

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    05.08.2007
    Ort
    Frankfurt/Oder
    Alter
    44
    Beiträge
    40
    Anzeige

    Praxistest und DIY Projekte
    Hallo Oberallgeier

    Wenn ich dich richtig verstanden habe. sendet du also nen Zeichen z.b. 1
    Und wenn das immer so weitergeht bis der string einen bestimmtem Kriterium enspricht wird die entsprechende Routine aufgerufen.

    Oder habe ich das falsch verstanden??

    kann der µC nebenbei noch andere Sachen machen oder wartet er immer solange bis ein String kommt??


    @ Neutro genau danach habe ich gesucht.

    MFG

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von MDKMurdoc
    er soll ja z.b. bei 1 soll er das machen bei 2 das oder bei xy das sowas meine ich. das er je nachdem welches signal oder zeichen kommt soll er was bestimmtes machen
    Es kommt da schon ein wenig auf die Feinheiten an.
    Wenn der µC eine 1 bekommt und dann sofort irgendetwas machen soll, dann wird er niemals auf eine 10 reagieren können, weil dann bei Auftreten der 1 schon etwas gemacht wird.
    Ich habe es so gemacht, dass jeder Befehl an den µC mit einem <CR> abgeschlossen wird. Dann können die Befehle unterschiedlich lang sein. Außerdem kann man den ganzen Befehl in einem Puffer schreiben lassen und beim Auftreten des Zeichens <CR> einen Interrupt ausgelöst bekommen.
    All dies wird automatisch gemacht, du brauchst das nur zu konfigurieren, ohne in deinem Programm auf etwas zu warten.
    Wenn dann der Interrupt ausgelöst wird, liest du den Puffer ein uand kannst ihn dann in aller Ruhe - in deinem Hauptprogramm - verarbeiten und die entsprechende Aktion ausführen.
    Vielleicht ist das eine Alternative:
    Code:
    Config Serialin = Buffered , Size = 20 , Bytematch = 13   'maximal 20 Zeichen empfangen, beim Zeichen 13 (<CR>) eine ISR ausführen.
    Dim Command_string as String * 20    'hier wird der Befehl reingeschrieben
    Dim Command_count As byte              'dies ist die Länge des Befehls
    Dim Command_key As byte               'dies ist ein eingelesenen Zeichen
    Dim Command_flag As Byte               'wenn dies 1 ist, Befehl im Hauptprogramm verarbeiten
    
    Do
       If Command_flag = 1 Then
          Command_flag=0
          'hier kommen deine Aktionen für die jeweiligen Befehle
       End If
    ...
    Loop
    
    End 
    
    Serial0charmatch:                                 'dieses Label muss genau so heißen
       Command_count = 0
       Command_string = ""
       While Ischarwaiting() = 1                    'nur weiter einlesen, wenn noch Zeichen im Puffer sind
          Command_key = Inkey()                 'nächstes Zeichen einlesen
          If Command_key <> Chr(13) Then   'wenn es kein <CR> war
             Incr Command_count
             If Command_count < 20 Then
                Command_string = Command_string + Chr(command_key)  Zeichen an den Befehl hängen
             End If
          End If
       Wend
       Print Command_string                       'zur Kontrolle noch mal ausgeben
       Clear Serialin                                   'Puffer löschen
       Command_flag = 1                          
    Return
    Gruß

    Rolf

  3. #13
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Zitat Zitat von MDKMurdoc
    ... Wenn ich dich richtig verstanden habe. sendet du also nen Zeichen z.b. 1 Und wenn das immer so weitergeht bis der string einen bestimmtem Kriterium enspricht wird die entsprechende Routine aufgerufen ...
    Ich sende im Extremfall "viele" Zeichen - Theoretisch ist eine ganze Litanei möglich. Wenn die Steuerzeichen-Markierung kommt - die steht am Anfang einer Steuersequenz - dann wird das erste Steuerzeichen-flag gesetzt und der folgende String in einem separaten Empfangsfeld abgelegt. Dieses Feld ist größer als die längste Steuersequenz. Wird das Steuerstring-Ende erkannt, wird das zweite Steuerzeichenflag gesetzt.

    Der Steuerstring bleibt im Empfangsfeld stehen bis er von einer Routine ausgelesen wird. Nach dem Auslesen werden die Steuerzeichenflags zurückgesetzt. Damit ist gesichert, dass ein empfangener String ausgelesen wird. >>> Kommt ein neuer Steuerstring an, bevor der alte ausgelesen wird, dann wird der nicht mitgeschnitten ! ! <<< Das ist aber bei der Schnelligkeit meiner main-Routine (und deren Unterroutinen) kaum möglich.

    Zitat Zitat von MDKMurdoc
    ... kann der µC nebenbei noch andere Sachen machen ...
    Natürlich, sonst wär das Ganze ja witzlos. Ich empfange die Zeichen mit einer Interruptroutine. >>> Daher auch die Geschichte mit den Steuerflags - die u.a. auch verhindern, dass während des Lesens ein neuer Steuerstring eingeschrieben wird - oder dass nur ein Teilstring ausgewertet wird.<<< Damit umgehe ich auch das von for_ro dargestellte Problem mit 1 und 10. Übrigens hat for_ro ja auch ein Merkmal um einen vollständigen String zu erkennen. Allerdings mache ich das eben in C und for_ro beschreibt ja eine Lösung, die in Basic funktioniert und auch interruptgesteuert abläuft. Ich kann kein Bascom - hatte ich ja geschrieben.
    Ciao sagt der JoeamBerg

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    05.08.2007
    Ort
    Frankfurt/Oder
    Alter
    44
    Beiträge
    40
    hallo

    @for_ro

    irgendwie seh ich bei deinem quellcode noch nicht durch.

    Code:
       If Command_flag = 1 Then
          Command_flag=0
          'hier kommen deine Aktionen für die jeweiligen Befehle
       End If
    Was ist damit gemeint??
    wenn ein bestimmtes Zeichen kommt dann gehe zur subroutine xy und mache das und das oder wie??

    und wozu ist dieses Serial0charmatch da


    MFG

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress