Mit BASCOM habe ich nur minimale Erfahrung. Die Suche im Netz liefert viel "Beiwerk" aber kaum Substanz. Daher meine Frage: Hat jemand einen Link auf eine gepufferte Empfangsroutine für einen ATmega32, die per Interrupt unter BASCOM läuft? Ein Ringpuffer mit 16 Bytes wäre ausreichend, damit auch höhere Baudraten nicht zu Zeichenverlust führen.
Sieh Dir mal die Dokumentation zu "CONFIG SERIALIN" an. So, wie ich das interpretiere, kann die eingebaute UART-Unterstützung von BASCOM das von Hause aus.
"CONFIG SERIALIN" sieht schon mal gut aus! Da wird wohl mit Interrupt gearbeitet.
Beitrag #5512532 wurde von einem Moderator gelöscht.
Buch Walter Rowalt: Wer das Vorgehen String=String+Zeichen nicht mag, kann mit einem kleinen Trick optimal vorgehen: In Bascom ist es möglich, ein und denselben SRAM-Platz mit mehreren Variablen zu belegen. Wir können z.B. anweisen, daß unsere String-Variable auf Adresse &H60 gesetzt werden soll. Gleichzeitig können wir ein Feld mit 11 Bytes dimensionieren, das auf der gleichen Adresse liegen soll (ein 10 Byte langer String benötigt 11 Bytes Platz). Damit können wir ganz einfach und effizient über völlig verschiedene Methoden auf denselben Speicher zugreifen. Schauen Sie sich bitte das folgende Listing an. '0011.BAS: Optimierter String-Empfang $Regfile = "2313def.dat" $Crystal = 3686400 $Baud = 9600 Dim s As String*10 At &H60 Dim b(11) As Byte At &H60 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 Der String wird auf Adresse &H60 im AVR abgelegt. Dies ist die Adresse des ersten Bytes im SRAM (da der AT90S2313 über 128 Bytes SRAM vefügt, ist die höchste SRAM-Adresse &HDF). Quasi "darüber", also auf die selbe Adresse, legen wir ein Feld, das genauso lang wie der String ist. Das ist alles. Der Trick ist nur, daß wir beim Füllen des Strings in unserem Anwendungsfall am effizientesten mit einem Feld arbeiten können, während in anderen Fällen die Arbeit mit einem String günstiger sein kann. Welche Wege man in der Praxis gehen will, hängt natürlich immer von der Anwendung ab. Die Anwendung des Overlay-Tricks kostet weder zusätzlichen Code, noch SRAM. Es ist vielleicht eher wie die Auswahl zwischen Buddelschippe, Schaufel und Bagger bei ein und dem selben Haufen Sand. Und noch ein drittes UART-Mißverständnis trat wiederholt auf: Der UART-Empfangs-Interrupt meldet, daß ein Zeichen empfangen wurde. In der Interrupt-Routine kann man deshalb auch immer nur ein Zeichen auslesen. Zum Beispiel macht es daher keinen Sinn, in der Interrupt-Routine den Bascom-Befehl Input einzusetzen, um doch mehrere Zeichen empfangen zu können. Jetzt aber endlich zur Fortsetzung der Serie. Die letzte Folge schloß mit dem 8-Bit-Timer ab. Wie angekündigt soll jetzt der 16-Bit-Timer beschrieben werden.
Osca schrieb: > Wer das Vorgehen String=String+Zeichen nicht mag, Ich mag es nicht, aber das ist wohl BASIC ;-) Mit Overlays zu agieren, kann schnell in die Hose gehen. Es muß ja auch kein RAM gespart werden. > OnRxD: > Incr n > b(n) = UDR > Return Das ist doch schon mal ein Ansatz, wie man es zu Fuß angehen kann. Die BASCOM internen Routinen sind wohl nicht quelloffen, weshalb deren genauer Ablauf im Dunkeln bleibt. Zur Anwendung: Im Grunde sollen per RS232 eintreffende Strings auf einem LCD angezeigt werden. Die Baudrate soll 115,2 kBd betragen und der String abhängig von der Vorgeschichte in der 1. oder 2. Zeile angezeigt werden. Mit INKEY() ist das Empfangen zu lahm.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.