-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Schieberegister...

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2008
    Ort
    Pohlheim
    Alter
    27
    Beiträge
    240

    Schieberegister...

    Anzeige

    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:
    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ß

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2008
    Ort
    Pohlheim
    Alter
    27
    Beiträge
    240
    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ß

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2008
    Ort
    Pohlheim
    Alter
    27
    Beiträge
    240
    ok ich hab das jetzt ein bischen geändert und mal den LS verwendet (ist das richtig?)

    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 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.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2008
    Ort
    Pohlheim
    Alter
    27
    Beiträge
    240
    ja ok das meinte ich schon ich wusste jetzt nur nicht welches von links nach rechts und welches von rechts nach links ist.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    also brachst du msb wenn das register 24 zuerst raus muss und reg 1 zuletzt.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2008
    Ort
    Pohlheim
    Alter
    27
    Beiträge
    240
    ok dank dir

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    15.10.2008
    Beiträge
    23
    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?

    Code:
    $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

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    rotate ist der passende befehl, damit kannste das byte rechts
    oder link rotieren lassen
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •