Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
Wird der Print-Befehl per Interrupt oder per Polling abgearbeitet?
Pauschal kann man die Frage weder mit ja noch mit nein beantworten.
Der Print-Befehl ist intern sehr komplex aufgebaut und die Ausgabe und hängt davon ab, ob dein Controller einen UART enthält, ob der verwendet wird und wie der konfiguriert wird.
ich meine den HW-UART. In BASCOM kann ich ja nur die Baudrate festlegen. Im Gegensatz zum SPI, da steht auch Interrupt ON/OFF (wobei in der Hilfe steht Enable/Disable bewirken dasselbe. Dies finde ich nicht logisch denn das würde doch bedeuten das SPI immer mit Interrupt läuft)
Mach mal ein Beispiel wie die Konfiguration aussieht, dann kann man auch was konkretes dazu sagen ohne die Hilfe zu wiederholen.
Und dann die konkrete Frage dazu.
Beispiel? verstehe ich jetzt nicht. Ich meine den normalen Printbefehl (Print "Hallo") über den Hardware-UART. Läuft der nun mit Interrupt oder mit Polling
Ja, das meine ich z.B. $Baud 115200. Damit ich richtig verstanden werde: für mich heisst Polling der Controller frägt in einer Schleife das Interrup-Flag ab und "steht" solange still. Bei Interruptbetrieb arbeitet der Controller im Programm weiter und schreibt beim Interruptaufruf des UART ein Byte in den Sendepuffer.
Ich bevorzuge Interruptbetrieb.
Wenn du sowas hast, dann ist das Interrupt-Betrieb (Senden).
BASCOM-Quellcode: Senden im Interrupt-Betrieb
' Beispiel Interrupt-Betrieb
$Regfile="m8def.dat"
$HWStack=40
$SWStack40
$Framesize=40
$Crystal=3686400
$Baud=19600
Config SerialOut = Buffered , Size =64
Enable Interrupts
Do
Print"Hallo"
Waitms500
Loop
Alles anzeigen
Wenn du die Zeile 11 auskommentierst, wird die Ausgabe in Zeile 17 Zeichen für Zeichen gepollt. D.h. die Zeile 19 wird erst abgearbeitet, wenn Zeile 17 vollständig abgearbeitet ist.
Im Übrigen muss es nicht zwingend sein, dass im Pollbetrieb das Programm blockiert. Das hängt vom Code ab, wie man das löst.
Man kann auch im Pollbetrieb Senden ohne das Programm zu blockieren.
die Zeile 19 wird erst abgearbeitet, wenn Zeile 17 vollständig abgearbeitet ist.
Eigentlich schon, wenn das letzte Zeichen an den Ausgabebuffer übergeben wurde.
Das Programm läuft dann schon in Zeile 19 und der HW-UART gibt das letzte Byte aus.
Hallo
ich habe in der Zwischenzeit die Probleme gelöst. Anbei findet ihr je ein Programm für den RFM69CW als RFM12B-Ersatz als Empfänger resp. als Sender.
Die Beispiele sind als reinen Ersatz für die Funktion des RFM12B gedacht; die zusätzlichen Möglichkeiten des RFM69 sind nicht ausgeschöpft. Es sind keine automatischen Abläufe vorhanden und die interne CRC-Berechnung wird auch nicht benutzt. Wenn jemand weiss wie die interne CRC-Berechnung des RFM69 in BASCOM nachprogrammiert werden kann kann auch die interne CRC-Berechnung in Zusammenarbeit mit dem RFM12B benützt werden. Wenn kein RFM12B mit dem RFM69 benutzt wird kann auch die RFM69-interne CRC-Berechnung benutzt werden aber ev. Vorsicht, siehe Beitrag von DG7GJ siehe hier
Weiter wird auf RFM69-interne zeitliche Abläufe keine Rücksicht genommen; wer möchte kann ja die entsprechenden internen Register auslesen und auswerten. Ich vermute jedoch dass einige us Waitstates notfalls ebenfalls genügen.
Noch ein Hinweis: immer aufpassen und eine Aktion mit dem RFM69 mit Chipselect abschliessen und mit der neuen Aktion neu selektieren; Chipselect nicht einfach aktiv lassen wenn interne Register gewechselt werden.
Hallo
Leider hat sich beim Empfangsteil ein Systemfehler gezeigt. Ich habe beim Empfang die Anzahl Datenbytes begrenzt. Wenn alles richtig läuft ist alles o.k.
Wenn jedoch das Längenbyte ausserhalb der (begrenzten) Anzahl Empfangsbytes liegt wird nicht weiter empfangen. Grund ist der Interrupt "PayloadReady." Dieser wird erst zurückgesetzt wenn das FIFO leer ist. In meinem vorigen Empfangsprogramm habe ich jedoch nur den Chip-Select zurückgesetzt in der Annahme der Interrupt wird damit ebenfalls zurückgesetzt. Dem ist nicht so. Leider gibt es keinen Befehl das FIFO zurückzusetzen. Am einfachsten ist es in diesem Falle die Daten solange auszulesen bis das FIFO leer ist. Dann wird auch der Interrupt zurückgesetzt.
Anbei die korrigierte Version meines Programms: