Hallo Besucher, der Thread wurde 29k mal aufgerufen und enthält 23 Antworten

letzter Beitrag von spieler am

RS232 mit cc65

  • Hallo, jetzt geht es weiter mit cc65 für die RS232.
    Wo gibt es dort ein Beispiel für Daten senden über die serielle Schnittstelle.
    Dieses unten möchte ich gerne in cc65 so umsetzen, das es läuft. Finde aber den cc65-Befehl "open/close" nicht :


  • Wie wird eine Struct aufgerufen?


    Die "serial.h" sieht so aus:



    Mein Programm sieht so aus zur Zeit :


    Wenn ich diese Struct :


    mit : ser_params.baudrate=SER_BAUD_300; anspreche, wird es nicht compiliert, nur wenn ich vorher die Struct umbenenne :


    struct ser_params z;


    und dann diese Werte reinsetze:


    z.baudrate=SER_BAUD_300;


    wird das Programm compiliert.


    Wie wird jetzt diese Struct aufgerufen aus meinem Programm :
    ser_open (const struct ser_params* params);


    Mit "ser_open(z);" wird es wieder nicht umgesetzt bzw compiliert:


    Wer kann weiterhelfen?


    mfg

  • Ich kenne mich mit dem CC65 nicht so aus. Aber es sieht eigentlich ganz easy aus:



    Du musst die Struktur deklarieren und befülen und dem open übergeben. Etwa so:


    Code
    1. const struct ser_params k = {SER_BAUD_300, SER_BITS_8, SER_STOP_1, SER_PAR_NONE, SER_HS_NONE};
    2. ser_open ((const struct ser_params*)&k);
  • Ist im Emu VICE.
    Im Basic wird die serielle Schnittstelle in Vice 2.1 wunderbar angesprochen und funktioniert.
    Im cc65 gibt es noch Schwierigkeiten. Dort gibt es 2 Rs232-haeder, einmal "rs232.h" und die "serial.h".
    Bloss in der rs232.h stimmen die einzelnen Werte-Zahlen für den c64 nicht um die Schnittstelle anzusprechen.


    Ein Beispiel für die baudrate:
    rs232.h > #define RS_BAUD_300 0x03
    serial.h >#define SER_BAUD_300 0x06


    Also 2 verschiedene Angaben...hmmm..


    Der Wert 0x06 ist gemäss Wiki richtig für 300 baud.



    mfg

  • Irgendwie ist der seriell treiber nicht aktuell: c64-swlink.ser


    Hallo sauhund, kannst du irgend wie mal rausbekommen ob der Treiber vom cc65 aktuell und funktionsfähig ist.


    Oder wie kann man das in ASM umsetzen, ich meine dieses "open ...., print#2 usw... :

  • Habe ich hier mal versucht, nur einen wert "65" ausgeben, wenn ich das Programm starte, wird kein Wert an die serielle Schnittstelle ausgegeben sondern nur 1 "A" auf dem Bildschirm .


    Das einfache Beispiel in Basic :


    200 open 2,2,0, 6 : rem chr$(br+db+sb) + chr$(hs+ua+pr) ergibt als Summe den Wert "6"
    210 print#2,chr$(65);
    220 close 2


    Wer kann weiterhelfen?


  • Wenn ich mir das ROM Listing des C64 so anschaue, dann sehe ich dass es schon gehen müsste mit standard open/close/bsout.


    Du setzt die Geräteadresse korrekt mit jsr $ffba und erreichst so das RS232 Open auf $f409, aber du vergisst den Dateinamen:


    Code
    1. FFBA 4C 00 FE JMP $FE00 ; set file parameters
    2. FFBD 4C F9 FD JMP $FDF9 ; set filename parameters



    Setze den Open String in deinen Assembler Code (.byte data) und übergib die Adresse in X/Y und die Länge im AC. Danach jsr $FDF9 und gut.


    Der Filename ist chr$(br+db+sb) + chr$(hs+ua+pr), nur damit wir uns richtig verstehen ... :winke:

  • Geht noch nicht, oder habe ich deine Hilfe falsch verstanden ?


    Der Filename ist chr$(br+db+sb) + chr$(hs+ua+pr), nur damit wir uns richtig verstehen


    Der Filename ist ja der Wert 6, der sich aus der gesamten Summe ergibt, oder müssen da 2 Werte stehen, ohne die beiden chr$ zu addieren? chr$(br+db+sb) ergibt "6" und chr$(hs+ua+pr) ergibt "0".
    Oder muss das irgendwie als Text gesetzt werden?


    Schau doch mein Code nochmal durch und verbesser ihn mal.


    Danke.


    mfg



  • In Basic ergibt das einen String der Länge 2. chr$(65) + chr$(66) ist dasselbe wie "AB". Es müsste also in etwa so aussehen:


  • Geht noch nicht.
    Der Wert wird als "A" auf dem Screen ausgegeben.


    Hier eine komische Sache:

    Code
    1. 200 open 2,2,0,chr$(6)+chr$(0)
    2. 220 for a=65 to 70
    3. 225 for b=0 to 1000
    4. 226 next b
    5. 230 print#2,chr$(a);
    6. 240 next a
    7. 250 close 2


    Das Basicprogramm läuft oben und gibt den Wert über die serielle Schnittstelle aus, aber wenn ich dieses :
    "200 open 2,2,0,chr$(6)+chr$(0)"durch "200 open 2,2,0,6,0" ersetze, passiert das gleiche bei im ASM-Progamm, es werden die Buchstaben nur auf dem Screen ausgegeben.
    Also muss es doch eine Möglichkeit geben chr$(6)+chr$(0) in ASM durchzuführen.


    !byte geht nicht, !text "60" und !text "6","0" geht auch nicht. Wird zwar compiliert, aber wird immer der Buchstabe auf dem Screen ausgegeben.



    mfg

  • Zitat

    Hallo sauhund, kannst du irgend wie mal rausbekommen ob der Treiber vom cc65 aktuell und funktionsfähig ist.


    an der stelle würde ich empfehlen mal auf der cc65 mailingliste zu fragen... die rs232 treiber wurden zu irgendeinem zeitpunkt mal komplett überarbeitet, daher kommen auch die zwei unterschiedlichen header files die du gefunden hast ... eins davon ist veraltet. ist aber schon viel zu lange her das ich damit rumgemacht hab als das ich mich an details erinnern würde :)

  • Die serielle Unterstützung im C64 ist rein durch Software umgesetzt, der C64 hat keinen UART (6551).


    Die standardmäßige Unterstützung: Ja, nur per Software.


    Es gibt allerdings auch Module, die einen 6551 nachbilden. VICE 2.1 kann das auch. In WinVICE im Menü per: Settings / Cartridge I/O Settings / ACIA settings, dann "Enable ACIA".


    Allerdings funktionieren damit die Kernel-Routinen nicht mehr, man muss den 6551 per Hand programmieren. Die Zuverlässigkeit ist es aber wert!


    Gruß,
    Spiro

  • Wer kann mir mal meinen Code oben als ASM zum laufen bringen.


    Ich bekomme es nicht hin. Habe schon zig mal das ASM-File umgestellt, die "jsr" vertauscht.
    Ich weiss auch nicht genau, in welcher Reihenfolge das alles aufgerufen werden muss.


    Kann das mal als Lauffähig erstellt werden.


    Der ASM-Code ist ja nicht lang, bekomm es nicht gebacken.
    Die ganze choose läuft unter Basic mit dem Vice hervorragend.



    Danke.


    mfg

  • Jetzt erscheint der Buchstabe nicht mehr auf dem Screen, gesendet über die serielle Schnittstelle wird er auch nicht.
    Hmm...., woran liegt das.


    Habe alle erdenklichen Vorschläge eingearbeitet. Oder ist da noch ein Fehler drin?


    Kann das einer mal bitte von Null an Erbauen von meinem ASM-Code?


    Danke.


    mfg

  • Oder ist da noch ein Fehler drin?


    Ja, aber einer, den ich selbst erst länger suchen mußte. Der Debugger in VICE hat mich dann letztendlich weitergebracht.



    Das relevante hier ist die zusätzliche Wartezeit, die ich durch die Schleife um Loop herum aufbaue.


    Der KERNAL des C64 wartet nämlich nicht, bis das aktuelle Zeichen gesendet wurde. Stattdessen wird beim CLOSE einfach die Übertragung mittendrinnen abgebrochen - IMHO ein klarer Bug des KERNALs.


    Dir wäre das möglicherweise aufgefallen, wenn du mehr als ein Zeichen senden willst - dann wären nämlich wohl die ersten durchgekommen, aber hinten einige weggefallen.


    Meine obige Warteschleife um 50ms, die ich ergänzt habe, muss nur einmal, vor dem Schließen des Kanals, kommen - also nicht etwa zwischen den Zeichen.


    Wenn jemand eine Möglichkeit kennt festzustellen, ob die RS232-Übertragung fertig ist: Bitte melden! Auf die Schnelle habe ich nichts gefunden... Bei mehr als einem Zeichen kann man testen, ob $029D und $029E gleich sind - falls nicht, dann gibt es noch mehr als ein Zeichen zu lesen. Das mache ich in ab WaitForChar oben - obwohl es bei *diesem* Beispiel keinen Sinn macht, sondern nur dann, wenn mehr als ein Zeichen zu senden ist.


    In BASIC fällt das Problem übrigens nicht auf, weil BASIC "langsam genug" ist, so dass die notwendige Verzögerung immer da ist.


    HTH,
    Spiro