Guten Abend,
ich versuche vergeblich, mit einem Atmega88 + FT232RL Bytes zu
empfangen, die von einem PC gesendet werden. Zu Testzwecken habe ich
folgenden Code geschrieben und lasse den PC alle 33ms ein "S" (ASCII
115) senden. Demnach sollte die Steuerungssoftware des PCs alle 33ms
"01110011" ausgeben.
Sobald der uC irgendetwas empfängt, sollte die LED an Pinb.1 an bzw
ausgehen. Im Hyperterminal tut sie das. Nicht aber, wenn ich sie an die
Steuerungssoftware anschließe.
Wäre klasse, wenn mir jemand einen Tipp geben könnte, wo es klemmt.
--
$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
Config Serialin = Buffered , Size = 20
Config Pinb.1 = Output
Led Alias Portb.1
Dim A As Byte
Enable Interrupts
Do
A = Inkey()
If A <> 0 Then
Toggle Led
End If
Loop
End
--
Lazlo Panaflex schrieb:
> Im Hyperterminal tut sie das. Nicht aber, wenn ich sie an die> Steuerungssoftware anschließe.
dann dürfte der Fehler aber doch eher in deiner Steuerungssoftware
liegen und nicht im µC-Code...
Hallo,
hast Du geprüft, ob die Steuer-Software tatsächlich Daten auf der
seriellen PC-Schnittstelle ausgibt (Schnittstellen-Tester, Scope)? Und
wenn ja, was kommt am RX-Pin des Controllers an? (am besten mit Scope
prüfen)
BTW: Die Taktfrequenz von 8MHz deutet ein wenig auf die Benutzung des
internen RC-Oszillators vom AVR hin. Dieser hat allgemein aber eine zu
hohe Toleranz für serielle Übertragungen; hier wäre ein externer
(Baudraten-) Quarz deutlich besser, insbesondere bei längeren
Telegrammen.
Der uC läuft tatsächlich mit dem internen RC. Ich wusste nicht, dass das
bei serieller Übertragung eine Rolle spielt. Werde ihn "fusen" und einen
Quarz anstecken.
Ein Scope müsste ich mir von der Arbeit mitnehmen, was aber kein Problem
darstellt.
Aber am Code liegts nicht? Keine groben Schnitzer drin? Oder gibt es
noch eine elegantere Methode, als Inkey (welche ich aus der BASCOM Hilfe
habe).
Um festzustellen, ob ein Zeichen empfangen wurde, ist "Inkey" geeignet;
nur wenn das empfangene Zeichen eine binäre Null ist, kann "Inkey"
dieses Zeichen nicht erkennen. Dann geht man anders vor; dies ist in der
BASCOM-Hilfe bei "Inkey" unter dem Verweis "Ischarwaiting" zu finden.
Damit liegt man dann auf der sicheren Seite.
Für Deine Tests (Senden des ASCII-Zeichens "S") reicht das Programm
allemal (zumal der serielle Buffer von BASCOM, also interrupt-
gesteuerter Empfang, aktiviert ist).
Bitte noch mal folgendes prüfen:
Da Deine Tests mit Hyperterminal funktioniert haben, mit der
Steuersoftware aber nicht, probiere mal dort eine kleinere Wiederholrate
des Telegramms (z.B. 200ms). Wird dann etwas vom Controller erkannt?
Ich schätze mal, dass mit dem HyperTerminal von Hand keine 33ms
Wiederholrate hinzubekommen ist ...
Wenn da auch nichts erkannt wird, kommen wir ums Scope nicht herum ...
Hi,
also ich würde das ja so lösen, das ich den Empfang per Interrupt
auswerte.
Warten und nachschauen ob was per RS232 reinkommt ist
Resourcenverschwendung.
Gruß
Hallo,
> also ich würde das ja so lösen, das ich den Empfang per Interrupt> auswerte.
Genau das macht BASCOM ja mit dem Befehl "Config Serialin = Buffered,
Size = ... ".
Normalerweise muss man selbst (per Polling) die Schnittstelle nach Bytes
abfragen. Durch diesen Befehl wird die BASCOM-Empfangs-Routine auf eine
ISR umgeschaltet, die im Hintergrund serielle Daten empfängt und sie im
definierten Buffer ablegt.
Im Hauptprogramm (das ja in der Regel zyklisch abläuft) wird mittels
einer Funktion geprüft, ob Daten im Buffer sind. Wenn ja, kann man sie
einlesen und bei Bedarf auswerten.
> Warten und nachschauen ob was per RS232 reinkommt ist> Resourcenverschwendung.
Gewartet wird hier bei der Funktion überhaupt nicht; sie prüft ein Flag,
das die ISR setzt, wenn Daten im Buffer sind.
BASCOM bildet hier einen seriellen FIFO nach, in dem die per Interrupt
eingelesenen Daten gesammelt werden. Die Grösse des FIFO wird beim
Config-Kommando übergeben.