PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieberegister...



Felix H.
06.04.2008, 15:47
Hi Leute,

also ich will für mein nächstes Projekt drei Schieberegister verwende. Sprich das ich 24 Ausgänge mit 3 I/O´s am AVR hinbekomme. Soweit so gut. Jetzt will ich mir die Fuktion selber schreiben weil ich im internet nichts finde. Würde ich jedes Bit einzeln einlesen ist der Code extrem lang. Is allerdings nicht so schlimm wegen der größe des Speichers beim 128er ;-) Aber es soll ja übersichtlich bleiben. Dazu hatte ich mir folgendes gedacht:

Ich mache einzelne Bits für den jeweiligen Ausgang. 24 an der Zahl.

Pinbelegung:

Pine.0 = SER
Pine.1 = SCK
Pine.2 = RCK

Ich geb euch erst mal den Code:
$regfile = "m128def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000

Config Pine.0 = Output
Config Pine.1 = Output
Config Pine.2 = Output

Dim Anfang As Word
Dim Register As Word
Dim Register1 As Bit
Dim Register2 As Word
Dim 1 As Bit
Dim 2 As Bit
Dim 3 As Bit
Dim 4 As Bit
Dim 5 As Bit
Dim 6 As Bit
Dim 7 As Bit
Dim 8 As Bit
Dim 9 As Bit
Dim 10 As Bit
Dim 11 As Bit
Dim 12 As Bit
Dim 13 As Bit
Dim 14 As Bit
Dim 15 As Bit
Dim 16 As Bit
Dim 17 As Bit
Dim 18 As Bit
Dim 19 As Bit
Dim 20 As Bit
Dim 21 As Bit
Dim 22 As Bit
Dim 23 As Bit
Dim 24 As Bit

Anfang:

Do
'hier ist platz für den anderen code =)
Loop

Register:

Porte.2 = 0
Porte.1 = 0

Register1 = 24

Porte.1 = 1 'Bereit zum Einlesen des 1. Bit
Porte.0 = Register1 'Schreibe ersten Bit
Porte.1 = 0 'Beende Einlesen des 1.Bit

Register1 = Register1 - 1

If Register1 = 0 Then
Gosub Register2
Else
End If

Gosub Register

Register2:

Porte.2 = 1 'Übernehmen der neuen Einstellungen
Porte.2 = 0

Gosub Anfang

Ok. Ich möchte damit bezwecken die einzelnen Bits als Zahlen zu configurieren, damit ich diesen Wert runte zählen kann und somit nur einmal den code aufbauen muss. Ich erläuter mal kurz ;-)

Porte.2 = 0
Porte.1 = 0

Die beiden Ausgänge werden auf logisch 0 gesetzt. Jetzt kann es los gehen.

Register = 24

Wir beginnen mit der letzten pineinstellung an den Registern. Sprich ausgang 24.

Porte.1 = 1
Porte.0 = Register
Porte.1 = 0

e.1 wird auf High gelegt, das signalisiert dem register das der erste bit kommt. e.0 wird gleich mit dem Wert "register" gesetzt der momentan auf dem wert des Bit 24 liegt. e.1 wird wieder auf 0 gesetzt. Das Register weiss es ist fertig mit dem schreiben des 1. Bit

Register = Register - 1

Die einzelnen Bit werden nun nacheinander heruntergezählt.

If Register = 0 Then
Gosub Register2
Else
End If

Wenn der wert Register auf 0 liegt, also alle Ausgänge durchgearbeitet sind springt er über den Gosub Register Befehl drüber nach "Register2"

Register2:

Porte.2 = 1
Porte.2 = 0

Gosub Anfang

Pine.2 wird kurz auf High gelegt und die Register übernehmen die zuvor durchgegebenen Daten. Der code beginnt von vorne.

Mein frage ist. Kann ich das so machen? also zahlen als Bit nehmen.
Oder wird bei dem befehl Pine.0 = Register der pine.0 auf 24, 23, 22 usw gesetzt? Dann müsste ich doch den langen code nehmen =(

Gruß

helimike0705
06.04.2008, 15:57
schaue dir mal den befehl " shiftout " an.ist prima zu steuern von registern geeignet. habe selbst ein programm wo 8 cd4094 geladen werden und funzt wunderbar.

mike

Felix H.
06.04.2008, 16:09
das sieht gut aus =) sowas hatte ich gesucht danke. Werde das gleich nochmal posten. Ist MS oder LS das richtige was ich brauche? Ich muss ja den letzten Bit als erstes übertragen.

Gruß

Felix H.
06.04.2008, 16:24
ok ich hab das jetzt ein bischen geändert und mal den LS verwendet (ist das richtig?) 8-[


$regfile = "m128def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000

Config Pine.0 = Output
Config Pine.1 = Output
Config Pine.2 = Output


Dim Register As Word
Dim Registerwert As Long


Do
'Hauptprogramm
Loop


Register:

Porte.1 = 0
Porte.2 = 0

Shiftout Porte.0 , Porte.1 , Registerwert , 3 [ , 24 , 1000]

Porte.2 = 1
Porte.2 = 0

Return

Der Code ist ja mal wirklich supigeil kurz geworden :)

Ich habe mal 1000µs als Delay eingestellt. Kann ja nicht schaden.

helimike0705
06.04.2008, 16:26
was meinst du mit ms oder ls ,falls du die 4094 meinst ist das egal,es liegen definierte zustände an den pins an.oder meist du die einstellung,was ich für eher halte , dann must du es dir so einstellen wie du es brauchst ,ich habe msb eingestellt ,da mein bytes von rechts nach links laufen müssen "&B00001111". also erst die einsen dann die nullen.

mike

Felix H.
06.04.2008, 17:21
ja ok das meinte ich schon ;-) ich wusste jetzt nur nicht welches von links nach rechts und welches von rechts nach links ist. ](*,)

helimike0705
06.04.2008, 17:24
also brachst du msb wenn das register 24 zuerst raus muss und reg 1 zuletzt.

Felix H.
06.04.2008, 18:46
ok dank dir :-)

nF!n!ty
06.11.2008, 15:40
Hallo,

mache jetzt nicht extra einen neuen Thread auf, da es auch zum Thema Schieberegister in Bascom ist.
Hab einen 74HC595 hier und wollte damit mal einwenig experimentieren.
Habe den nun an meinem ATMEGA8 angeschlossen und Eingänge ein und ausschalten können mit untenstehendem Code. Funktioniert auch soweit. Nun wollte ich mal ein kleines Lauflicht damit machen. Wie mach ich das am besten?


$regfile = "m8def.dat"
$crystal = 3686400

Config Pind.2 = Input
Taster Alias Pind.2
Portd.2 = 1

Dim A As Byte

Sclk Alias Portc.1
Seriell Alias Portc.0

A = &B00000001

Do
If Taster = 0 Then
Waitms 150
Shiftout Seriell , Sclk , A , 0 , 8 , 0
Portc.2 = 1
Waitms 1
Portc.2 = 0
End If
Loop

Schonmal danke für Eure Hilfe.

Grüße

Vitis
06.11.2008, 16:27
rotate ist der passende befehl, damit kannste das byte rechts
oder link rotieren lassen

nF!n!ty
06.11.2008, 18:45
rotate ist der passende befehl, damit kannste das byte rechts
oder link rotieren lassen

Hi,
erstmal danke für deine Antwort.

Ich habe aber doch noch ein paar Probleme mit der Ansteuerung.
Oben gepostetes Programm von mir sollte doch Ausgang QH auf 1 machen, oder seh ich das falsch? Macht es aber komischerweise nur manchmal, oder es sind direkt mehrere Ausgänge auf 1.
Zusätzlich flackern LED's, wenn ich sie an die Ausgänge mache, beim Einschalten wie verückt. Aber ganz zufällig. Ohne System. Stimmt etwas an meiner Ansteuerung nicht?

PIN14 ist bei mir C.0
PIN11 ist bei mir C.1
PIN12 ist bei mir C.2
PIN10 hab ich an VCC
PIN13 an GND

Datenblatt ist angehängt. Verwendeter Code ist in meinem ersten Posting.

Danke schonmal.
Grüße