PIC, Byte seriell asugeben

Gast #1587137
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.