Hallo,
folgendes Programm (Teile davon habe ich mal weggelassen, da die
funktionieren) lässt den Prozessor bei einem bestimmten empfangenen
Zeichen 14 Bytes mittels UART einlesen.
Diese Zeichenkette wird anschließend zerlegt, das klappt leider nur
teilweise.
Aus irgend einem Grund ist der Inhalt von Sb3 und Sb4 immer 0, auch wenn
der UART etwas anderes zu sehen bekommt.
Sb1 und Sb2 lassen sich problemlos auslesen.
Dem Stck habe ich mal sicherheitshalber so viel Platz zugewiesen, aber
das ändert nichts an dem Fehler.
1
$regfile = "m16def.dat" ' Atmega 16
2
$crystal = 8000000 ' 8 MHz Takt
3
$hwstack = 165 'Stackdimensionierung
4
$swstack = 150
5
$framesize = 150
6
7
$baud = 2400 ' 2400 Baud
8
9
'Watchdog
10
11
Config Watchdog = 2048 ' watchdog auf 2048 mSec setzten
Das ist nicht gut durchdacht.
Deine zeitkritischen Anforderungen liegen beim UART Empfang und der
sollte dann auch mittels Interrupt sauber aufgesetzt werden.
Displayausgaben sind "sekundär".
Schau Dir dazu mal Kapitel 6 an.
http://www.rowalt.de/mc/index.htm
Da sieht man wieder, wie lange ich nicht mehr mit Bascom gearbeitet habe
;)
Ich wollte die UART-Geschichte interruptgesteuert ablaufen lassen und
dachte, Bytematch würde eben einen sowas nutzen.
Wieder was gelernt^^
Die Displayausgabe würde ich gerne weiterhin interruptgesteuert arbeiten
lassen, ich weiß nicht wie sich das sonst auf das Aussehen der geMUXten
Siebensegmetanzeigen auswirken würde.
Ich sollte vielleicht noch erwähnen, dass die Datenpakete immer gleich
lang sind und dazwischen immer eine Pause von knapp einer Sekunde ist.
Nur in extrem seltenen Fällen kann diese Pause kürzer sein, dann ist
aber keine kontinuierliche Anzeige nötig und der Watchdogreset aus
Nutzersicht okay.
Ich habe nun mal
Src: ' Wartet auf
den Dezimalwert 13 für Serielle Eingabe
Pushall
If Udr = 43 Or Udr = 45 Then
Input D
End If ' schreibe
den Input in D
Popall
Return
Da wird sich überhaupt nichts auf Deine Muxerei auswirken.
Die ISR wird in ein paar us abgearbeitet.
Lass die Displayroutine einfach permanent im Hauptprogramm per do loop
laufen.
In der ISR nur das Nötigste machen und fertig.
DS
^Das war wohl nix -.-
Das da oben führt der Controller aus, wenn ein Zeichen empfangen wurde.
Lässt die Anzeige aber übelst flackern, die Werte stimmen nicht mehr
(okay, er fängt ja auch woanders an)
Die 13 steht weiter hinten im String, ist aber konstant, im Gegensatz zu
dessen Anfang, an dem 45 oder 43 steht.
arbeite ich damit, fehlt natürlich immer der Rest vom Paket, der vom
nächsten nachgeholt werden muss.
Das führt zu einer periodisch für locker ne Sekunde einfrierenden
Anzeige.
Jetzt lassen sich die Interrupts ja anscheinend nicht priorisieren...
verdammt -.-