Hallo, als Anfänger habe ich eine für euch wohl simple Frage, also bitte nicht totlachen. Ich habe aus dem Tut die Kaskadierung nachgebaut. Hardware: Atmega 8 , 3 x 74595 , 24 x LED LOW Current , 24 x 330 Ohm Um keinen statischen Ausgang zu haben, hab ich das Programm so abgeändert, dass ein ständiger Laufeffekt entsteht. .include "m8def.inc" .def temp1 = r16 .equ SCHIEBE_DDR = DDRB .equ SCHIEBE_PORT = PORTB .equ RCK = PB2 ; SS .equ SCK = PB5 ; SCK .equ SIN = PB3 ; MOSI main: ldi temp1, LOW(RAMEND) out SPL, temp1 ldi temp1, HIGH(RAMEND) out SPH, temp1 ; ; SCK, MOSI, SS als Ausgänge schalten ; in temp1,SCHIEBE_DDR ori temp1,(1<<SIN) | (1<<SCK) | (1<<RCK) out SCHIEBE_DDR,temp1 ; ; SPI Modul konfigurieren ; ldi temp1, 0b01010000 out SPCR, temp1 ; keine Interrupts, MSB first, Master ; CPOL = 0, CPHA =0 ; SCK Takt = 1/2 XTAL ldi temp1,1 out SPSR,temp1 ; double speed aktivieren out SPDR,temp1 ; Dummy Daten, um SPIF zu setzen ; ; Ein Datenbyte ausgeben ldi temp1, 0x01 Ausgabe: rcall Schiebe ; Daten schieben rcall SchiebeOut ; Daten in Ausgangsregister übernehmen dly: dec r20 ; von mir geändert brne dly ; dec r21 ; brne dly ; rol temp1 ; cpi temp1, 0xFF ; rjmp ausgabe ; bis hierhin loop: rjmp loop SchiebeOut: sbis SPSR,7 rjmp SchiebeOut sbi SCHIEBE_PORT, RCK cbi SCHIEBE_PORT, RCK ret Schiebe: sbis SPSR,7 rjmp Schiebe out SPDR,temp1 ret Das funktioniert soweit alles. Nun würde ich gern folgendes realisieren wollen: Eine einzelne LED durchlaufen lassen von 1 - 24, also immer nur eine LED ON alle anderen OFF. So wie ich es jetzt habe laufen alle 3 74595 synchron also sind immer min. 3 Led'S ON. Kann mir hier jemand, unter Berücksichtigung das ich Anfänger bin, einen Tipp oder noch besser eine Lösung mitteilen? Vielleicht habe ich den Gaul auch von der falschen Seite aufgezäumt :-) Gruß Peter
Hallo! Wie hast Du denn die drei Schieberegister angeschlossen? Wenn Du sie alle tatsächlich parallel angeschlossen hast, leuchten auch mindestens immer drei LEDs. Wenn Du sie kaskadiert hast, musst du alle Bits durch alle SRs durchschieben, bei drei 8Bit-SRs also 24Bits. Alternativ kannst Du aber z.B. auch die Datenleitungen aller SR miteinander verbinden und z.B. die Clock-Leitungen einzeln an den uP legen. Dann taktest Du nur in das gewünschte SR. Es gibt viele Möglichkeiten... Hast Du noch ein paar zusätzliche Infos, z.B. mal den Schaltplan DEINER Schaltung? Dann könnte man besser helfen. Viele Grüße Marcel
Hallo, danke für die schnelle Reaktion. Anbei das Schaltbild aud dem Tut. Gruß Peter
@ Peter Bednarz (pebez) >Das funktioniert soweit alles. Schön zu hören. >Nun würde ich gern folgendes realisieren wollen: >Eine einzelne LED durchlaufen lassen von 1 - 24, also immer nur eine >LED ON alle anderen OFF. Kein Problem. Man muss nur den Schiebebefehl auf drei Register ausweiten. >Kann mir hier jemand, unter Berücksichtigung das ich Anfänger bin, einen >Tipp oder noch besser eine Lösung mitteilen?
1 | ; oben reinschreiben. |
2 | |
3 | .def temp2 = r17 |
4 | .def temp3 = r18 |
5 | .def temp4 = r19 |
6 | .def cnt = r20 |
7 | |
8 | Anfang: |
9 | ldi temp2, 0x01 ; Anfangsmuster laden |
10 | ldi temp3, 0x00 |
11 | ldi temp4, 0x00 |
12 | ldi cnt, 24 ; Schleifenzähler laden |
13 | Ausgabe: |
14 | mov temp1, temp2 |
15 | rcall Schiebe ; Daten schieben |
16 | mov temp1, temp3 |
17 | rcall Schiebe ; Daten schieben |
18 | mov temp1, temp4 |
19 | rcall Schiebe ; Daten schieben |
20 | rcall SchiebeOut ; Daten in Ausgangsregister übernehmen |
21 | |
22 | dly: |
23 | dec r20 ; von mir geändert |
24 | brne dly ; |
25 | dec r21 ; |
26 | brne dly ; |
27 | ; schieben über drei Byte |
28 | lsl temp2 ; |
29 | rol temp3 |
30 | rol temp4 |
31 | dec cnt ; Schleifenzähler verringern |
32 | brne ausgabe |
33 | rjmp Anfang ; neuer Durchlauf |
Hallo Falk, Danke, funktioniert einwandfrei. Im nächten Schritt werde ich die dly durch ein Timer Interrupt ersetzen. Gibt es noch andere Möglichkeiten dieses "Lauflicht" mit den 74595 zu realisieren, wobei so wenig Portpins benötigt werden? Hintergedanke ist ein Sekundenkreis einer Uhr. Bei der jetzigen Methode würden ja 9 Register benötigt werden, was man aber auch mit einer .include Datei bewerkstelligen könnte. Werde mal ein wenig weiter forschen. Dir nochmals vielen Dank. Gruß Peter
Hallo, der Sekundenkreis ist mit der entsprechenden Anzahl Schieberegister kein Problem. Das Programm dazu ist auch recht einfach, weil Du ja nicht den Inhalt einzelner Variablen in die SR schieben musst. Du musst ja nur bei "0 Sekunden" ein 1-Bit in das erste Schieberegister schieben und danach immer nur 0-Bits. Dass machst du dann 59 Sekunden lang, bis das 1-Bit im 8. SR verschwindet. Dann musst Du pünktlich zur 0. Sekunde wieder ein 1-Bit reinschieben. Von den 64 Datenleitungen der acht kaskadierten SR schließt Du eben nur die ersten 60 an. Das Vorgehen unterscheidet sich dabei nur geringfügig, wenn Du nur 59 LEDs benutzen möchtest und bei 0 Sekunden alle Lampen aus sein sollen. Dann schiebst Du das 1-Bit eben bei Beginn der 1. Sekunde rein. Aber egal welche Variante Du haben möchtest: Du musst jede Sekunde ein Bit weiterschieben. Viele Grüße Marcel
@ Peter Bednarz (pebez) >Gibt es noch andere Möglichkeiten dieses "Lauflicht" mit den 74595 zu >realisieren, wobei so wenig Portpins benötigt werden? Sind dir die drei Pins schon zuviel? >Hintergedanke ist ein Sekundenkreis einer Uhr. Bei der jetzigen Methode >würden ja 9 Register benötigt werden, was man aber auch mit einer >.include Datei bewerkstelligen könnte. Was haben Schieberegister mit Includefiles zu tun? >Werde mal ein wenig weiter forschen. Tu das. MfG Falk
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.