Naja, selbst Dino nutzt zuweilen Bascom. Und ich hab hier auch 'ne Vollversion. Ich nutz die bloß praktisch nicht für mich. Aber die ASMler erkennt man daran, daß sie dann trotzdem ganz gern direkt auf den I/O-Registern rummachen, und weniger auf die "tollen" vorgefertigten CONFIGs und OPENs usw zurückgreifen.
Der Vorteil von ASM ist, daß man sich um jeden Mist selber kümmern kann. Der Nachteil, daß man sich um jeden Mist selber kümmern muß
. Da geht's mit Bascom halt schneller.
Wegen "...mit Gott weiß was so vollgestopft, daß..." - kannst ja spassenshalber mal folgendes compilieren lassen:
Wenn, wie im Codeschnipsel da oben noch der Software-Comport geöffnet wird (also nur der Empfang), die Schleife mit Inkey, und die Fallunterscheidung (ohne was drin, bisher) dazukommt, bist Du bei 16%. Dabei verbraucht Inkey aber 'ne Menge Zeit (bei 4800 Baud), und außerdem darf die Schleife nicht viel anderes machen (sonst übersiehst Du vielleicht ein Byte). Da Du aber den Timer für HW-PWM freihättest, ginge das meiner Meinung nach.
Zu RS232: Du brauchst einen Wandler auf TTL, genau. Ich hab hierirgendwi so'n Teil vom "blauen C", ich hatte mir auch mal 2 bei elektor bestellt - dummerweise hatten die da'n Lieferengpaß, als sie es dann verschieckt hatten, ist das irgendwie in meinem Umzug untergegangen. Rechnung und Lieferschein hab ich ordentlich abgeheftet, aber die kleinen Dinger selbst hab ich noch nicht gefunden...
Letztlich hatte ich mir bei Dirk
das hier bestellt. Den scheint's auch als 3.3V-Variante zu geben. Auf der Unterseite hat er 'ne Lötbrücke, wo man das umschalten kann. Allerdings ist der mit 'ner Leiterbahn auf 5V eingestellt - diese Bahn müßte also erstmal durchtrennt werden.
Zu der anderen Frage: Ist ja alles nur (noch nicht mal) Pseudocode. Bis jetzt hab ich was geschrieben zu:
-Synchronisation auf die erste Flanke (Startbit) durch einen externen Interrupt
-Generation der Timing-Events fürs Oversampling, die man auch für SoftPWM nutzen kann.
-Trick 17 mit dem schieben von Nullen (Idle) oder einer 1 durch ein Byte (Oversampling) in der Timer-Überlauf-ISR (bzw im CompareMatch)
-Trick 18 zum realisieren von "Majority Wins", und die Übergabe des ermittelten Bits an das Hauptprogramm
Zum Hauptprogramm selbst hab ich fast noch nichts geschrieben. Beim TTL-Uart ist das ja so:
-im Idle ist die Leitung Hi
-Das Startbit ist 'ne 0 (Lo), auf die fallende Flanke syncen wir (da das bereits der erste Oversampling-Zeitpunkt wäre, mus OSR im PinChangeInterrupt mit 2 reinitialisiert werden. es folgen 7 weitere Oversamplings (4, 8,
16,
32,
64, 128, 256=0=Überlauf, durch uns auf 1 gesetzt) das war das Startbit). Das Bit (jedes) wird in der Mitte gelesen. Mit Oversampling mehrfach ("Majority...").
-es folgen die Datenbits (AVR-HW-UART kann 5-9, Du kannst natürlich hier auch was beliebiges anderes Implementieren)
-es folgt ggf 1 Paritätsbit
-es folgt (mindestens) 1 Stopbit (ist immer 1 - die Leitung ist also bis zum nächsten Startbit wieder Hi (idle).
Du mußt also in der Hauptprogrammschleife schnell genug (mindestens einmal pro Bit) das Flag (aus der Timer ISR) pollen, und das ggf erhaltene Bit aus dem Zwischenspeicher abholen. Dabei mußt Du mitzählen, welches der Bits aus dem UART-Telegramm das ist, und behandelst es entsprechend (Startbit muß 0 sein - ansonsten hatten wir nur'ne Störung oder sowas, die Datenbits werden zu einem Byte zusamengerollt, Vergleich mit dem eventuellen Paritäsbit (vielleicht hatten wir Watte in den Ohren), beim Stopbit den Bereitschaftszustand wiederherstellen und den Flankeninterrupt für das nächste Byte (Startbit) scharfmachen.