Zum Glück regnet es heute mal!
Das Programm habe ich mal korrigiert und es funktioniert auch:
CodeBox Assembler
// Dem Rest der Schaltung ein paar Zyklen Zeit geben um aktiv zu werden
ldi temp, $FF
l1: dec temp
brne l1
// Address-Ports + ALE auf Ausgabe
ldi temp, $ff
out DDRA, temp
out DDRC, temp
out DDRD, temp
out DDRE, temp
// Datenrichtung vom Datenswitch A-->B
cbi PORTE, 0
// MC6847 auf TriState
cbi PORTD, 0 ; MS6847 weg vom Speicher
// /WR auf High
sbi PORTD, 6 ; /WR high
// $8001 auf die Adress-Leitungen
ldi temp, $80
ldi temp1, $01
out PORTA, temp1 ;Low-Byte der Adresse
out PORTC, temp ;High-Byte der Adresse
// ALE an, Adresse auf Bus und Latch
sbi PORTE, 1 ; Latch enabled
ldi temp, $41
l2: dec temp
brne l2
cbi PORTE, 1 ; Latch disabled
// Daten für die Speicherstelle $8001
cbi PORTD, 0 ; Schreiben = /WR Low
ldi temp, $41 ; "A"
out PORTA, temp ; ausgeben
sbi PORTD, 6 ; Nicht mehr schreiben = /WR High
// Adresse 0 auf Port A + C, und Ports auf Eingang
ldi temp, $00
out PORTA, temp
out PORTC, temp
out DDRA, temp
out DDRC, temp
// MC6847 online
sbi PORTD, 0 ; MC6847 online!
always: jmp always
Gestern hatte ich beschrieben, dass das Testprogramm auch tatsächlich den Buchstaben "A" ausgibt, die Schaltung diese Ausgabe jedoch vervielfacht und den ganzen Bildschirm füllt. Dieser Effekt entsteht auch, wenn ich den Videospeicher aus der Schaltung entferne. Der Rückschluss, dass dann wohl das Datenbyte auf dem Bus bleibt und bei der Reaktivierung des MC6847, der dann ja Adressen auf den Adressbus legt, munter durch die Gegend geschleudert wird, scheint sich zu bestätigen.
Ich bin mir ziemlich sicher, dass mein grundsätzliches Schaltungsdesign in Ordnung ist und Programm und Schaltung grundsätzlich funktionieren (müssten). Die Tests zeigen aber, dass hier irgendwo ein Pegelproblem besteht, weil (mindestens) der Datenbus des AVR nicht ordentlich vom Videospeicher und dem MC6847 abgekoppelt wird.
Ich habe in dem Zusammenhang das Datenblatt des Octal-Switch 74HC245 gewälzt und ein wenig gegoogelt und bin dabei auf den Artikel zum Thema
TriState bei WikiPedia gestoßen. Dort wird beschrieben, dass wenigstens ein Ausgang mit einem Pulldownwiderstand auf ein definiertes Potenzial gelegt werden muss. Der Octal-Switch kann mit einem Low-Pegel an Pin 19 auf TriState gestellt werde, was ich tue, um den Adress- und Datenbus des AVR vom Videospeicher und dem MC6847 zu trennen. Meine Schaltung sieht an dieser Stelle keinen Pulldownwiderstand vor, da ich der Meinung war, dass es genügt, einen definierten Pegel an den Eingängen der Switche zu haben. Interpretiere ich nun den Artikel auf Wikipedia falsch? Oder muss ich meine Schaltung tatsächlich um mindestens einen Pulldownwiderstand pro Octal-Switch erweitern?
Wenn die Octal-Switche in der aktuellen Schaltung tatsächlich nicht richtig auf TriState gehen, dann muss ich mich wohl nicht wundern, warum da so einiges nicht funktioniert.
Schon mal recht herzlichen Dank für Eure Einschätzung.
Uni