Hallo, ich wollte um Hilfe bitten. Ich mache ein Schulprojekt indem ich LEDs(max7219) mit dem Mikrocontroller(Atmel 89C5131A) verbinde. Ich wollte verschieden Muster ausgeben mit den LEDs, jedoch habe ich nicht viel wissen darüber wie ich ihn ansteuern kann. Es sollte ein Assembler Code sein. Ich bitte nicht um ein ganzes Projekt oder ähnliches sondern wollte fragen, ob mit jemand zeigen könnte wie ich z.B. einen Pin ansteuern könnte oder eine Zeile damit ich weis wie ich vorgehen muss. Ich weis nicht ob es relevant ist aber ich habe folgendes verbunden: - CLK --> P2.0 - DIN --> P2.1 - CS --> P2.2 dann noch VCC an 5V und GND an 0V. Es leuchten immer alle LEDs rot. (include datei c51rd2) Ich würde mich über eine kleine Hilfestellung freuen.
Wenn ich das Datenblatt [1] richtig lese, ist es wie bei anderen 8051: Es gibt keine Umschaltung der Datenrichtung am Port. Man schreibt eine '0' und der Ausgang wird auf 0V geschaltet. Wenn man eine '1' schreibt, ist der schwache Pullup aktiv. Unter [2] gibt es eine deutschsprachige Einführung in die 8051-Programmierung. Mit den folgenden Befehlen sollten sich die Pins manipulieren lassen: [asm] clr P2.1 cpl P2.0 setb P2.2 [/asm] Um den MAX7219 anzusteuern müssen jetzt die richtigen Steuersequenzen ausgegeben werden. [1] http://ww1.microchip.com/downloads/en/DeviceDoc/doc4337.pdf [2] https://web.archive.org/web/20170817150719fw_/http://www1.hft-leipzig.de/buchmann/microcontroller/index.htm
Sinnvollerweise solltest du die vorhandene on-chip-SPI nehmen. Heisst aber umverdrahten auf die entsprechenden Pins. Kann man zwar auch mit Pinwackeln machen, muss man aber nicht.
Im Datenblatt auf Seite 6 und 7 stehen die relevanten Angaben. Es werden 16 Bit seriell nacheinander übertragen. Die ersten 4 Bit sind uninteressant, dann 4 Bit Adresse, dann 8 Bit Daten. Die Adressen stehen in Tabelle 2. Adresse 0 ist unbelegt, also muss hier ein Wert ungleich 0 stehen. Register 12 ist das Shutdown-Register. Wenn da nach Reset eine 0 drin steht, dann macht der Chip außen gar nichts. Also wäre der erste Test, da mal den Wert 00000001b rein zu schieben. Danach in die Adresse 1 irgend einen beliebigen Wert, dann sollten die ersten 8 LEDs was anzeigen. Fange ruhig mit "Bit-Banging" an. Den SPI-Bus des 5131 kannst du später noch untersuchen. Für die Übertragung von 16 Bit macht man sinnvollerweise 2 kleine Schleifen für je 8 Bit. Der Akku hält die zu sendenden Daten, da hier MSB zuerst gesendet wird, rotiert der Akku nach links durch das Carry-Bit.
1 | Init: setb P2.2 |
2 | clr P2.0 ; Takt auf 0 |
3 | Sende16Bit: |
4 | mov a, #12 ; Register 12 |
5 | mov R0, #8 ; Schleife 8x durchlaufen |
6 | clr P2.2 ; /CS auf 0, Baustein aktivieren |
7 | Schleife1: |
8 | rlc a ; oberstes Bit aus dem Akku in C |
9 | mov P2.1, c ; und als Daten ausgeben |
10 | setb P2.0 ; Ein Taktimpuls erzeugen |
11 | clr P2.0 |
12 | djnz R0, Schleife1 ; Schleife 8 mal, Akkuinhalt rausschieben |
13 | |
14 | ; jetzt kommen 8 Bit Daten, hier 01h zur Aktivierung |
15 | mov a, #00000001b |
16 | mov R0, #8 ; Schleife 8x durchlaufen |
17 | Schleife2: |
18 | rlc a ; oberstes Bit aus dem Akku in C |
19 | mov P2.1, c ; und als Daten ausgeben |
20 | setb P2.0 ; Ein Taktimpuls erzeugen |
21 | clr P2.0 |
22 | djnz R2, Schleife2 ; Schleife 8 mal, Akkuinhalt rausschieben |
23 | |
24 | setb P2.2 ; /CS auf 1, Baustein deaktivieren |
Das ganze kannst du jetzt Quick'n'Dirty ein paar mal hintereinander kopieren oder an der Stelle, wo der Akku seinen Inhalt bekommt z.B. R7 für die Adresse und R6 für die Daten nutzen (z.B. mov a, R7). Dann kannst du daraus ein Unterprogramm mit 2 Parametern machen, die man vor dem Aufruf in R7 (z.B. mov R7, #12) und R6 setzen muss.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.