Arduino: "digitalWrite" geht. "PORTD/PORB" ist un zuverlässig?

Apr 02, 2017 49 Replies

Am 08.04.2017 um 17:45 schrieb Gerald Oppen:

P.S.: Und das hier beachtet:

Ensure that data is not being transmitted too fast to the T6963C. Always pole the BUSY flags STA0 and STA1 before sending instructions (section 9.2). If MPU is not set up to read the BUSY flag before writing instructions allow an adequate delay between instructions

gebremst bis man jede Zeile einzeln sieht, die aufgebaut wird.

dem LCD landet.

Manuel

Wieviele Nops hattest Du den verbaut? Mit 2-3 Nops ist es nicht getan

Verarbeitungszeiten von einigen Millisekunden hat. Um das herauszufinden solltest Du das Busy-flag abfragen und in eine

meldet...

Gerald

Fehlerhafte Funktion (ohne Hack):

formatting link

Und die mit Hack, die funktioniert:

formatting link

Manuel

Manuel Reimer schrieb:

Da ist zwar allerhand komisches Zeug drin, aber nicht der Assembler-Quelltext Deiner Funktion. Aber wie gesagt, mittlerweile glaube ich auch eher an ein Ansteuerproblem des LCD.

Christian

Christian Zietz - CHZ-Soft - czietz (at) gmx.net WWW: http://www.chzsoft.de/ PGP/GnuPG-Key-ID: 0x52CB97F66DA025CA / 0x6DA025CA

LCD. Meine Funktion zum Lesen war:

// Blocks until LCD reports DSP to be ready void WaitDSPReady(bool aAutoWrite = false) { ParportSetDirection(INPUT); for (int i = 0; i < 3000; i++) { digitalWrite(PIN_CD, HIGH); digitalWrite(PIN_RD, LOW); digitalWrite(PIN_WR, HIGH); digitalWrite(PIN_CE, LOW);

// In "Non-Auto-Mode" check STA0 and STA1 bool last = false; if (!aAutoWrite && digitalRead(PIN_D0) && digitalRead(PIN_D1)) last = true; // In "Auto-Mode" check STA3 if (aAutoWrite && digitalRead(PIN_D3)) last = true; digitalWrite(PIN_CE, HIGH); digitalWrite(PIN_RD, HIGH); if (last) break; } ParportSetDirection(OUTPUT); }

"Abbruch" durch Status-Bits statt.

Manuel

Dann stimmt was mit deiner Schaltung nicht, ich hab bisher bei diversen

um? Das Statusregister ist nicht das Datenregister ausgelesen sondern eins weiter. Oder ist das dein 'digitalWrite(PIN_CD, HIGH);'?

Hier ist mein 68000-Code der problemlos funktionierte:

check: ; Verwendete Register: ; d2 : Statusregister LCD

move.b adr_lcd+1, d2 ; Statusregister lesen */ andi.b #$03, d2 ; Bit 0 und 1 maskieren */ cmpi.b #$03, d2 bne.s check ; Wenn nicht BEIDE Bits gesetzt rts

check2: btst #$03, adr_lcd+1 beq check2 ; wiederholen solange Bit 3 = 0 rts

Ich hatte das LCD allerdings im Adressraum eingeblendet, ging schneller als via I/O-Baustein. :)

Gerrit

Manuel Reimer schrieb:

Dann musst Du das zum Laufen bekommen. Wie Du im Datenblatt nachlesen kannst, funktioniert der Controller nicht korrekt, wenn Du nicht an den vorgeschriebenen Stellen auch Status-Read machst: "When using the MSB=0 command, a Status Read must be performed. If a status check is not carried out, the T6963C cannot operate normally, even after a delay time. [...] If a status check is not carried out [...] before the next command is sent, there is the possibility that the command or data will not be received." MSB=0 commands sind z.B. "Register Setting" oder "Set Control Word".

Christian

Christian Zietz - CHZ-Soft - czietz (at) gmx.net WWW: http://www.chzsoft.de/ PGP/GnuPG-Key-ID: 0x52CB97F66DA025CA / 0x6DA025CA

Komischerweise funktioniert der Controller aber ohne Probleme mit den Arduino-Funktionen alleine.

Mitteln komme ich nicht drauf warum ich die Status-Infos nicht bekomme. Wenn ich versuche das zum Laufen zu bekommen werden die Ausgaben nur noch konfuser. Wenn ich die gesetzten Bits auf dem seriellen Port

Ich glaube ich gebe mich mit der geringen Geschwindigkeit erstmal zufrieden. Das ganze wird eh Open-Source und vielleicht hat jemand die Mittel, die Zeit und die Lust das mit den Registern doch noch zum Laufen

Ganz davon abgesehen, dass ich Mittel, wie z.B. einen Logik-Analyser nicht habe.

Manuel

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required