Liste der Anhänge anzeigen (Anzahl: 4)
Portbeschaltung nach Timing Diagram HILFE!
Hallo Leute!
Ich soll mit C über einen 8bit Port einen RCT Chip ansteuern habe aber schon mit der Initialisation so Probleme. :cry: Portbeschaltung is mir an sich klar, macht man PortA = Hexwert und dann läuft das aber bisher waren die Schaltungen ziemlich billig (Led Leiste oder so). Mit dem Timing Diagram vom RCT komm ich jetzt gar nicht klar, hoffe ihr könnt da helfen.
Erster Schritt im Dateblatt ist das hier
Bild hier
Beschaltung ist bei uns so;
PortA0: Adr0, Dat0
PortA1: Adr1, Dat1
PortA2: Adr2, Dat2
PortA3: Adr3, Dat3
PortA4: ChipSel0
PortA5: ALE (??)
PortA6: Reat
PortA7: Write
Als Beipiel hier die Registers:
Bild hier
Hab mit das etwa so gedacht in Pseudocode:
Code:
1111 an PA0 bis PA3 legen (-> Reg. F wählen)
speicher die Addresse
0100 an PA0 bis PA3 legen (-> Reg setzen)
1110 an PA0 bis PA3 legen (-> Reg E wählen)
speicher die Addresse
0110 an PA0 bis PA3 legen (-> Reg setzen)
.....
Das Speichern versteh ich aber nicht also ich muss ja irgendwie umschalten und dem Controller sagen "nimm die Addresse" und "schreibe da dabb die und die Daten hin". :( Wie mache ich das??
Hier das Timing Diagram aber da versteh ich gar nix von:
Bild hier
Das muss ja auch alles über den Port nur wie und wann?? Da ist ja alles gleichzeitig und mal so verstetzt und mal so.
Fals es nötig ist hier auch noch ein Schaltbild:
Bild hier
Das Proggen in C ist so kein Prob. nur das mit dem Timing versteh ich nicht. Kann mir vielleicht wer sagen wie der 1. Schritt in C aussehen müsste? Das Doofe ist dass ich erst alles coden muss bevor ich das richtig testen kann. :-(
Hoffe mir kann wer helfen. Wär echt cool!
mfg
Mika
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo werwurm!
Echt super erklärt, so ist das mir schon einiges klarer. Paar Fragen hab ich aber doch noch. Also mein Code ist dann erstmal so:
Code:
/* PA0 bis PA7 auf Ausgang schalten */
PortA = 0b11110011; /* Adresse fuer Register F anlegen */
PortA = 0b11111011; /* Chip selektieren */
PortA = 0b11111111; /* Impuls Anfang: Adresse in int. Buffer uebernehmen */
PortA = 0b11111011; /* Impuls Ende */
/* Hier zum Lesen jetzt PA0 bis PA4 auf Eingang umschalten!!! */
...
PortA = 0b11111001; /* Read auf Low, warten bis Daten anliegen (siehe Diagram) */
/* Dann die Daten von PA0 bis PA3 auslesen */
daten = PortA; /* ersten vier Bit weiter isolieren... */
PortA = 0b11111011; /* Lesen abschliessen */
PortA = 0b11110011; /* Chip Select loesen */
/* Jetzt erst PA0 bis PA4 wieder auf Ausgang schalten */
PortA = 0b00000011;
Wie ist das mit dem zzzz aber gemeint?? PA0-PA3 auf Eingang ist mir klar aber bei dem Zuweisen an PortA kann ich ja nicht 0bzzzz0000 oder so machen. Muss das dann alles auf 1 oder 0 oder wie? Schätz ma 0 oder?
Und eigentlich muss ich erstmal in die Registers schreiben und nicht lesen, aber das versuch ich mir mal selbst herzuleiten und poste es noch mal hier. Muss ich dann wieder ein Impuls auf ALE geben zum Übernehmen der Daten? Also Addresse anlegen, ALE up + down, Daten anlegen und dann Write auf 0 nehm ich mal an (-> Diagramm). Also das Anlegen der Daten überschreibt die Adresse nicht irgendwie?
Zitat:
das nur so nebenher da das ganze gemultiplexe vermutlich der grund für deine verwirrung war schätze ich...
Ja genau das mit dem ALE und Adresse und Daten am selben Pin war bissl komisch. Glaub aber jetzt hab ichs verstanden wenn das mit dem zzzz noch mal wer erläutern kann.
Danke noch mal, meld mich mit dem Schreiben dann wieder.
mfg
Mika
ps: Zu den Timings ist noch diese Tabelle im Datenblatt. Mein Mikro hat 500 ns Taktzyklus dann ist nur das Chip Select kritisch oder? Also muss ich da dann ein delay einbauen, right?