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