Bytes empfangen über FT232RL - Bascom

Gast #1599195
Lesenswert?

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

--
Gast #1599247
Lesenswert?

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.
Gast #1599263
Lesenswert?

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).
Gast #1599300
Lesenswert?

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).
Gast #1599358
Lesenswert?

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 ...
Gast #1599967
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren