Forum: Mikrocontroller und Digitale Elektronik PIC, Byte seriell asugeben


von byte seriell ausgeben (Gast)


Angehängte Dateien:

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!

von John B. (johnbauer)


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

von John B. (johnbauer)


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)

von byte seriell ausgeben (Gast)


Angehängte Dateien:

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

von John B. (johnbauer)


Angehängte Dateien:

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

von byte seriell ausgeben (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.