PIC, Byte seriell asugeben

Gast #1587137
Lesenswert?

Hallo,
ich habe vor mir eine LED-MATRIX-LAUFSCHRIFT zu bauen. Nachdem die 
ersten Buchstaben auch erfolgreich angezeigt werden (habe für jeden 
Buchstaben ein eigenes Programm geschrieben), möchte ich die Daten für 
die Buchstaben nun aus eine Tabelle auslesen. Doch leider funktioniert 
es nicht.
Ich versuche es nach dem Prinzip, dass das Byte (bzw. nur 6 Bits) 
komplett ins W-REgister geladen werden und dann rotieren. Dabei wird 
jedesmal das C-Flag abgefrat und bei "1" bzw. "0" die entsprechende 
Flanke ans Schieberegister 4094 ausgegeben. Doch leider funktioniert es 
nicht. Weiß vielleicht jemand warum? Oder mache ich vielleicht einen 
Grundlegenden Fehler? Wenn jemand eine effektivere Idee hat, die Daten 
ans Schiebe-register zu senden, nur her damit...

Gruß
Moritz

P.S.: Assemberlcode hängt an!
Angehängte Dateien:
#1587865
Lesenswert?

Hallo Moritz,

Du lädst 1 in das Arbeitsregister und führst dann folgende Befehle aus:

DATEN_ZEILE1
  addwf  PCL, 1        <- Programmzähler +1
  retlw  b'11111'      <- dieser Befehl wird übersprungen

DATEN_ZEILE2
  addwf  PCL, 1        <- Programmzähler +1
  retlw  b'10001'      <- dieser Befehl wird übersprungen
u.s.w. dein Programm läuft hier schon ins leere.


Rotate funktioniert nicht mit dem Arbeitsregister.
  rfl  W, 0
Verwende eine Variable:
  rfl  Variable, 1


Die Zählervariable speicher2 wird nur einmal am Anfang des Programms 
gesetzt. Sie muss aber für jede Zeile gesetzt werden.


Weiter hab ich es mir nicht angesehen.

Gruß
John
#1587925
Lesenswert?

Tippfehler:
der Rotate-Befehl ist 'rlf' und nicht 'rfl'.

Mach die Tabelle so:

DATEN_ZEILE
   addwf  PCL, 1       ;Sprung zu den Zeilen bei:
   retlw   b'11111'    ;W=0
   retlw   b'10001'    ;W=1
   retlw   b'10001'    ;W=2
   retlw   b'11111'    ;W=3
   retlw   b'10001'    ;W=4
   retlw   b'10001'    ;W=5
   retlw   b'10001'    ;W=6

(Seitengrenze beachten)
Gast #1587948
Lesenswert?

Hallo John,
vielen Dank schonmal. Habe deine "Beanstandungen" geändert, doch leider 
funktioniert es noch immer nicht.
Ich vermute ja, dass der Fehler in der "seriell-Umwandlung" liegt, denn 
wenn ich die Spalten-PINs der Matrix (welche vom Schieberegister kommen) 
"analog" mit Masse verbinde, funktioniert es.

Und an den Schieberegistern liegt es wohl auch nicht, denn auch diese 
funtionieren. Es scheint also ein Softwarefehler zu sein.

Gruß Moritz
Angehängte Dateien:
#1588117
Lesenswert?

Hallo Moritz,
im Programmkopf steht, dass Port A 0:Daten und 1:Clock sind. Daten und 
Clock werden aber auf Port B (0 und 1) ausgegeben.

Da nur die linken sechs Bit ausgegeben werden (Rotate Left), musst Du 
die Daten linksbündig spreichern: rechts bis 8 bit mit Nullen füllen.
  retlw  b'11111000'

Nur nach Aufruf von DATEN_ZEILE7 wird das Datenbyte in speicher1 
gespeichert. Nach den anderen Aufrufen nicht.

Gruß
John
Angehängte Dateien:
Gast #1588735
Lesenswert?

Hey John,
viele Dank :-) Es funktioniert.
Ist natürlich höchst ärgerlich einen solchen Fehler zu machen (Port A 
benutzt und Port B programmiert), aber manchmal sieht man eben den Wald 
vor lauter Bäumen nicht...

Gruß Moritz

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