Wie funktioniert ein ACIA für RS232?

Gast #6634548
Lesenswert?

Hallo, guten Tag.

Ich spiele mit dem Plus4 und dem ACIA für Rs232 im Vice.
Es hat eine Eigenart.
Es werden erst Daten vom Plus4 zurück gesendet zum Terminal wenn ich 
Daten zum  Plus4 sende. Das heisst ich sende immer zum Plus4 damit er 
aktiv wird zum zurücksenden.

Ich suche bitte mal eine Beschreibung wie der ACIA funktioniert in 
dieser Richtung. Vielleicht kann man mir das einmal erklären?

Danke.
#6634639
Lesenswert?

Hallo,

peter bierbach schrieb:
> Ich suche bitte mal eine Beschreibung wie der ACIA funktioniert in
> dieser Richtung. Vielleicht kann man mir das einmal erklären?

Deine ACIA dürfte ein MC6850 sein?
Datenblatt ist im Netz, der Chip macht da sehr wenig, Baudrate und 
Format setzen, feszlegen welche Interrupts aktiviert werden sollen und 
das war es eigentlich. Alles andere macht die Software, Statusregister 
lesen, Daten zum Senden reinschreiben oder angekommene Daten abholen 
usw. usw.
Zusätzliche Empfangs-/Sendebuffer hat er nicht, man muß also angekommene 
Bytes auch rechtzeitig abholen. Alles schon sehr lange her...

Gruß aus Berlin
Michael
#6634749
Lesenswert?

------------------------------------------------------------------------ 
--
Alles andere macht die Software, Statusregister
lesen, Daten zum Senden reinschreiben oder angekommene Daten abholen
------------------------------------------------------------------------ 
--
Da brauche ich mal bitte Info.
Welche Register werden benutzt usw : Senden und Empfangen ?

Wollte es mit dem 6502 in ASM.

Danke.
#6636858
Lesenswert?

Hallo, guten Tag.

Wer kann mir dieses bitte einmal erklären für eine Programmerstellung 
mit ASM? Was muss bitte beachtet werden?

-------------------------
Driver for the 6551 ACIA chip built into the Plus/4. Supports up to 
19200 baud, hardware flow control (RTS/CTS) and interrupt driven 
receives. Note that because of the peculiarities of the 6551 chip 
transmits are not interrupt driven, and the transceiver blocks if the 
receiver asserts flow control because of a full buffer.
--------------------------

Danke.
#6638097
Lesenswert?

Ich habe hier das nochmal übersetzt, oben muss ein Fehler sein in der 
englischen Version.

-------------------------------------
Treiber für den im Plus / 4 eingebauten 6551 ACIA-Chip. Unterstützt bis 
zu 19200 Baud, Hardware-Flusskontrolle (RTS / CTS) und 
Interrupt-gesteuerte Empfänge. Es ist zu beachten, dass aufgrund der 
Besonderheiten des 6551-Chips Übertragungen nicht 
unterbrechungsgesteuert sind und der Transceiver blockiert, wenn der 
Empfänger aufgrund eines vollen Puffers eine Flusssteuerung aktiviert.
-------------------------------------

-unterbrechungsgesteuert  ??
-Flusssteuerung aktiviert ??

Wer kann mir das bitte einmal Erkären, ich verstehe es nicht.

Was muss ich da jetzt beachten wenn ich Daten austausche mit  ASM-Code ?

Wie bekomme ich das bitte in den Griff:
...wenn der Empfänger aufgrund eines vollen Puffers eine Flusssteuerung 
aktiviert.

Danke.
#6638591
Lesenswert?

Danke für die Info.

Im Plus4 Vice macht der ACIA seine Unwesen.
Das normale RS232 funktioniert auf den anderen Geräten : C64 und VIC20.

Mir fehlt die Kenntnis wie das Senden und Empfangen abgestimmt werden 
muss.
Wenn ich Daten zum Plus4 sende kommt die Sendepflicht zurück die ich 
dort aktiviert habe um Daten auf den Notebook zu empfangen die ich haben 
möchte.
Das komische ist das ich den Empfang auf dem Plus4 noch nicht 
eingerichtet habe.

Ich muss den ACIA also Anschubsen vom Notebook sonst kommt nichts rüber 
vom Plus4.


Ich habe hier eine Demo gemacht.
Die Weile-Schleife kann immer laufen , es gibt beim ACIA kein Überlauf. 
Und  es wird auch nichts zum Notebook geschickt.
Wenn ich jetzt irgendwelche Daten rüberschicke pro Tastendruck (1 
Byte)vom Notebook zum ACIA , wird auch das ABCD... einzeln so 
zurückgeschickt vom ACIA wie ich es haben möchte.

Es kommt ein überlauf nach ca. 56 Tastendrücken auf dem Notebook.
Dann wird dauernd das ABC... zum Notebook geschickt als wer der ACIA 
irgendwie abgestürtzt.

Darum verstehe ich nicht wie das Ding arbeitet.
-------------------------
program main;

var
  i : byte;
  p : pointer;

procedure seriell_send();
begin
  asm("
  ldx #1
  jsr $ffc9
  lda $fd
  jsr $ffd2
  ");
end;

procedure seriell_open();
begin
  asm("
  lda #1
  ldx #2
  ldy #2
  jsr $ffba

  lda #2
  ldy #$c0
  ldx #$00
  jsr $ffbd

  jsr $ffc0
  ");
end;

begin
  definescreen();
  clearscreen($20, screen_char_loc);
  clearscreen(white, screen_col_loc);
  screenmemory := #screen_char_loc;

  poke(^$c000,0,22);
  poke(^$c000,1,5);
  seriell_open();

  i:=65;

  while (true) do
  begin
    wait(100);

    if(i =91) then
    begin
      i:=65;
    end;

    poke(^$fd,0,i);
    seriell_send();
    i:=i+1;
  end;

  loop();
end.
--------------------------------

Gruss
Gast #6641853
Lesenswert?

Vom 30.03.2021 10:47 ist überfällig.

Unten mit dem Programm kann ich jetzt Daten senden zum PLus4 und auch 
Daten empfangen vom Plus4 mit 9600Baud

Ein kleines Problem ist , das beim Senden vom Plus4 immer das letzte 
Byte (Ascii) 2 mal gedruckt wird am Empfänger bevor das Neue erscheint.

Beispiel:
A - wird eingeben beim Plus4 und erscheint beim Empfänger
B - sende ich , muss es 3 mal senden damit es erscheint. Es wird dann 
erst 2mal das A gedruckt und dann das B usw.


hier möchte ich das B haben
   |  hier möchte ich das C haben
   |   |
   |   |
A AAB BBC CCD  DDE ....usw.

------------------------
program seriel;

const
  EMPTY = $20;
  SCREEN_ADDR = $0c00;

var
  i,y   : byte;

procedure seriell_open(); assembler;
asm {
  lda #1
  ldx #2
  ldy #2
  jsr $ffba

  lda #2
  ldy #252
  ldx #253
  jsr $ffbd

  jsr $ffc0
 };
end;

procedure seriell_send(); assembler;
asm {
  ldx #1
  jsr $ffc9
  lda $fe
  jsr $ffd2
};
end;

procedure seriell_empfang(); assembler;
asm {
  ldx #1
  jsr $ffc6
  jsr $ffe4
  sta $ff
};
end;

procedure seriell_close(); assembler;
asm {
   lda #$01
   jsr $ffc3
};
end;

begin
    FillChar(pointer(SCREEN_ADDR), 24 * 40, EMPTY);

    seriell_open;

    pause(10);
    i:=0;

    while True do begin
      seriell_empfang();
      poke($c00+i,peek($ff)-96);

      poke($fe,peek($ff));
      seriell_send();

      i:=i+1;
    end;

    seriell_close;
end.
--------------------------------

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren