PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 soll auf Zeichen reagieren



MDKMurdoc
28.10.2008, 16:20
Hallo zusammen

Ich hoff euch geht es gut??

Ich grübel mal wieder über ein kleines Problem nach.

Ich möchte gern das mein ATMega8 auf bestimmte Zeichen reagieren soll.
Z.B. Wenn eine 1 gesendet wird, dann mache z.b das und das.

ich habe bis jetzt immernur die Befehle Read und Input gefunden.
Aber beides hilft mir irgendwie nicht weiter.

Habt ihr da eine Idee.




MFG



P.S. bin immernoch Anfänger

for_ro
28.10.2008, 17:27
Wie willst du dem µC die Zeichen schicken, auf die er reagieren soll?

Gruß

Rolf

Lemonsquash
28.10.2008, 17:36
Prinzipiell reicht dir doch da auch input?

Per selbigem den seriellen Port abfragen und mit einer select-case schleife das empfangene Zeichen auswerten.

Oder hab ich das falsch verstanden und du willst garnicht die uart-verbindung verwenden?

MDKMurdoc
28.10.2008, 17:57
Hallo

Doch. Das Zeichen/Signal nennen wir es mal soll vom Rechner geschickt werden.

Ich hatte hier schon nen Codeschnipsel gefunden. Aber so richtig zufrieden
bin ich damit nicht denn Es muss da immer ne Kette von einer bestimmten Längfe gesendet werden. Und das passt mir überhaupt net. Es soll dann z.b. so sein. wenn Zeichen A dann mache das und das und so weiter. is ja nur nen beispiel.

HIer mal der Codeschnipsel


$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600


Dim S As String * 10
Dim B(11) As Byte At S Overlay
Dim N As Byte

On Urxc Onrxd
Enable Urxc
Enable Interrupts



Main:

If N > 9 Then
Print S
N = 0
End If

Goto Main




Onrxd:
Incr N
B(n) = Udr
Return



Und so ganz steigt ich dabei noch net hinter. Was z.b. das Onrxd macht.


mfg

for_ro
28.10.2008, 18:21
Wenn du bei dem Code bleiben willst, dann schreib halt einfach
If N > 0 Then
...

Dann macht er was bei jedem Zeichen, das reinkommt.

Gruß

Rolf

MDKMurdoc
28.10.2008, 19:34
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

peterfido
28.10.2008, 20:31
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600

$hwstack = 40 ' Stack für Gosubs...
$swstack = 40


Dim S As String * 10
Dim B(11) As Byte At S Overlay
Dim N As Byte
config portx = output


Do

n = inkey
If N > 0 Then
gosub empfangen
End If

Loop
end

empfangen:

select case n
case 49
reset portx ' port x komplett abschalten, wenn eine 0 empfangen wurde.
case 49
set portx.y 'portx.y stzen, wenn eine 1 empfangen wurde
case 50
set portx.y 'portx.y setzen, wenn eine 2 empfangen wurde
end select
print n
return

Neutro
28.10.2008, 20:32
Hallo,
ich glaube das folgende WIKI hilft die weiter:
https://www.roboternetz.de/wissen/index.php/Windows_Programm_zum_Steuern_des_AVR%27s
Ich arbeite übrigens auch immer nach diesem Grudprinzip wenn ich mit einer
Windows Anwendung einen Controller steuern will. Sharp develop ist auch gut geeignet und einfach zu erlernen.

Für alle die keine Lust haben das WIKI zu lesen A=InKEY (),
wobei "A" oder eine andere Variable zunächst entsprechend als DIM A as BYTE oder Integer etc deklariert werden muss.
Ich hoffe ich konnte weiterhelfen.

MfG

Neutro

thewulf00
29.10.2008, 09:40
@peterfido: 2x case 49 -< ist das Absicht?

oberallgeier
29.10.2008, 10:11
... Es muss da immer ne Kette von einer bestimmten Längfe gesendet werden ... soll ... so sein. wenn Zeichen A dann mache das und das und so weiter ...Ich habe so etwas auf (m)einem µC laufen, Programmiersprache (für Dich: leider) ist C.

Dabei prüfe ich in der Interruptroutine, die beim Empfang eines Zeichens aufgerufen wird, welches Zeichen angekommen ist. Wird in einem beliebigen Strom von Zeichen ein (vorher bestimmbares) Zeichen entdeckt (z.B. Paragraph §), dann werden die folgenden Zeichen in einem speziellen String mit max. 10 Zeichen Länge abgelegt (wenn das entsprechende Flag nicht gesetzt ist). Wenn der String gefüllt ist, wird ein Flag gesetzt. Dieser String wird im main oder entsprechenden Routinen ausgewertet und das Flag zurückgesetzt. So kann ich Ziffern oder kurze Strings im Controller auswerten und entsprechend reagieren. Vielleicht geht so etwas auch in Basic?

MDKMurdoc
29.10.2008, 16:44
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

for_ro
29.10.2008, 18:37
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:

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

oberallgeier
29.10.2008, 22:56
... 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.


... 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.

MDKMurdoc
31.10.2008, 11:41
hallo

@for_ro

irgendwie seh ich bei deinem quellcode noch nicht durch.



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