Hallo,ich versuche gerade mit einem Atmega32 ein 74HC165 aus zu lesen.Ich möchte jeden Taster definieren und aus lesen.Aber irgendwie geht das nicht so richtig.Taster1 zeigt er an aber die anderen nicht, geschweige die anderen 2 74HC165.Liege ich bei denn Code auf dem Holzweg?Ein Tipp wäre nicht schlecht.Gruß PeterSchieberegister Taster.bas
74HC165 Atmega32 mit 24 Taster
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
-
-
Quellcode
- $regfile = "m32def.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- Dim Sr1 As Long
- Dim Sr2 As Byte
- Dim Sr3 As Byte 'Schieberegister 1
- Declare Sub Populate_shift_register()
- Sr_data Alias Pina.6 'Schieberegister DATA
- Config Sr_data = Input
- Sr_clock Alias Porta.4 'Schieberegister CLOCK
- Config Sr_clock = Output
- Sr_load Alias Porta.5 'Schieberegister STROBE
- Config Sr_load = Output
- Sr_load_port Alias Portb
- Const Sr_Load_pin = 5
- 'Alias für die angeschlossenen LEDs
- Taster1 Alias Sr1.0
- Taster2 Alias Sr1.1
- Taster3 Alias Sr1.2
- Config Lcdbus = 4
- Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
- , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
- Config Lcd = 16 * 2
- Do
- 'Schieberegister auswärten
- Call Populate_shift_register()
- 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
- If Taster1 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster1 "
- End If
- If Taster2 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster2 "
- End If
- If Taster3 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster3 "
- End If
- Wait 1
- Loop
- End
- Sub Populate_shift_register()
- Shiftin Sr_data , Sr_clock , Sr1
- Shiftin Sr_data , Sr_clock , Sr2
- Shiftin Sr_data , Sr_clock , Sr3
- Pulseout Sr_load_port , Sr_load_pin , 10000
- End Sub
-
ariel6 schrieb:
Sr_data Alias Pina.6 'Schieberegister DATA
Config Sr_data = Input
Porta.6 = 1Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem. -
@ariel6 deine sub 'populate...' passt nicht. Wenn du 3x 74165 auslesen willst, brauchst du 3 byte. Dann solltest du 'sr1'..sr3' auch als byte dimen, nicht als long.
Den 'sr_load-pin' solltest du vor dem shiftout verwenden. Dieses Signal übernimmt die Pegel an den Eingängen der 165er in den internen Speicher.
Wenn du Taster an den Eingängen hast, solltest du mit pulldowns bzw pullups auch dann für stabile Pegel an den Eingängen sorgen, wenn kein Taster gedrückt wird. Es wird auch nur der Tastendruck erfasst, der zum Zeitpunkt der sr_load-Flanke gedrückt war. Es wird nix gepuffert. Du hast diese Flanke alle 1 Sekunde, wenn du einen Taster nur 1/2 Sekunde drückst, ist es Zufall, wenn er registriert wird.
Ein 'pulseout' ist nicht erforderlich, es reicht, wenn sr_load_pin=0 und gleich danach =1 gesetzt wird. Alias entsprechend zuweisen!
Es fehlt bei shiftin auch noch die Angabe der Option, die in diesem Fall eine 2 wäre.Raum für Notizen
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von tschoeatsch ()
-
Hallo,
Danke für die Schnelle Antwort.
Habe es schnell geändert.
Das ist erstmal nur ein versuch mit 1 Sekunde, das wird nach her noch alles geändert.
Bei den Atmega32 is kein Pullup dran, habe es mit rein genommen.
Bei den 74HC165 gehen die Taster an GND und ein 10K an VCC.
aber es geht nicht auf alle.
Guß Peter
Quellcode
- $regfile = "m32def.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- Dim Sr1 As Byte
- Dim Sr2 As Byte
- Dim Sr3 As Byte 'Schieberegister 1
- Declare Sub Populate_shift_register()
- Sr_data Alias Pina.6 'Schieberegister DATA
- Config Sr_data = Input
- Porta.6 = 1
- Sr_clock Alias Porta.4 'Schieberegister CLOCK
- Config Sr_clock = Output
- Sr_load Alias Porta.5 'Schieberegister STROBE
- Config Sr_load = Output
- Sr_load_port Alias Portb
- Const Sr_Load_pin = 5
- 'Alias für die angeschlossenen LEDs
- Taster1 Alias Sr1.0
- Taster2 Alias Sr1.1
- Taster3 Alias Sr1.2
- Config Lcdbus = 4
- Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
- , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
- Config Lcd = 16 * 2
- Do
- 'Schieberegister auswärten
- Call Populate_shift_register()
- 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
- If Taster1 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster1 "
- End If
- If Taster2 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster2 "
- End If
- If Taster3 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster3 "
- End If
- Wait 1
- Loop
- End
- Sub Populate_shift_register()
- Pulseout Sr_load_port , Sr_load_pin , 10000
- Shiftin Sr_data , Sr_clock , Sr1
- Shiftin Sr_data , Sr_clock , Sr2
- Shiftin Sr_data , Sr_clock , Sr3
- End Sub
-
dein Befehl shiftin ist noch nicht korrekt, es fehlt die Angabe der 'Option'. Vergleiche malmit hier
avrhelp.mcselec.com/shiftin.htm
die Option '2' halte ich für richtig, hat bei mir zumindest funktioniert.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Oder '0', musst du probieren, dass halt deine Nummerierung der Taster mit den bits zusammen passt.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Hallo,
Also meintest du
Shiftin Sr_data , Sr_clock , Sr1 2 + 32 + 16 , 3
Gruß Peter -
nee, shiftin sr_data, sr_clock, sr1, 0
Soweit ich im Kopf hab, quillt das bit vom Eingang8 zuerst hinten raus, dann sollte man das auch als bit7 im byte ablegen, also MSB firstRaum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Hallo,
aber jetzt sagt er Taster3 ist an auf Pin0 vom 74HC165. Auf alle anderen reagiert er garnicht.
Gruß Peter
Quellcode
- $regfile = "m32def.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- Dim Sr1 As Byte
- Dim Sr2 As Byte
- Dim Sr3 As Byte 'Schieberegister 1
- Declare Sub Populate_shift_register()
- Sr_data Alias Pina.6 'Schieberegister DATA
- Config Sr_data = Input
- Porta.6 = 1
- Sr_clock Alias Porta.4 'Schieberegister CLOCK
- Config Sr_clock = Output
- Sr_load Alias Porta.5 'Schieberegister STROBE
- Config Sr_load = Output
- Sr_load_port Alias Portb
- Const Sr_Load_pin = 5
- 'Alias für die angeschlossenen LEDs
- Taster1 Alias Sr1.0
- Taster2 Alias Sr1.1
- Taster3 Alias Sr1.2
- Config Lcdbus = 4
- Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
- , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
- Config Lcd = 16 * 2
- Do
- 'Schieberegister auswärten
- Call Populate_shift_register()
- 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
- If Taster1 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster1 "
- End If
- If Taster2 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster2 "
- End If
- If Taster3 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster3 "
- End If
- Wait 1
- Loop
- End
- Sub Populate_shift_register()
- Pulseout Sr_load_port , Sr_load_pin , 10000
- Shiftin Sr_data , Sr_clock , Sr1 , 0
- Shiftin Sr_data , Sr_clock , Sr2 , 0
- Shiftin Sr_data , Sr_clock , Sr3 , 0
- End Sub
-
ich tippe auf den 'sr_load_pin'. Wenn dieser pin am 165 auf low ist, dann werden die Pegel der Eingänge in dem Speicher übernommen, wird dieser pin high, wird nix mehr übernommen und man kann auslesen. Dein puseout macht, so meine ich, derzeit kurze Impulse auf high und ist danach wieder auf low.
Probier mal
sr_load_pin alias portb.5
config sr_load_pin=output
Sub populate_shift_register()
sr_load_pin =0
sr_load_pin=1
shiftin sr_data, sr_clock, sr1, 0
shiftin sr_data, sr_clock, sr2, 0
shiftin sr_data, sr_clock, sr3, 0
end subRaum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Hallo,
habe ich ,mal mit rein genommen.
Aber er nimmt immer nur Pin0 am 74HC165.
Am LCD steht dann aber Taster8 immer und alle anderen Pins null Reagtion.
Gruß Peter
Quellcode
- $regfile = "m32def.dat"
- $crystal = 16000000
- $hwstack = 100
- $swstack = 100
- $framesize = 100
- Dim Sr1 As Byte
- Dim Sr2 As Byte 'Schieberegister 1
- Dim Sr3 As Byte
- Declare Sub Populate_shift_register()
- Sr_data Alias Pina.6 'Schieberegister DATA
- Config Sr_data = Input
- Porta.6 = 1
- Sr_clock Alias Porta.4 'Schieberegister CLOCK
- Config Sr_clock = Output
- Sr_load_pin Alias Portb.5
- config sr_load_pin=output
- Sr_load_pin = 0
- Sr_clock = 0
- 'Alias für die angeschlossenen LEDs
- Taster1 Alias Sr1.0
- Taster2 Alias Sr1.1
- Taster3 Alias Sr1.2
- Taster4 Alias Sr1.3
- Taster5 Alias Sr1.4
- Taster6 Alias Sr1.5
- Taster7 Alias Sr1.6
- Taster8 Alias Sr1.7
- Config Lcdbus = 4
- Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
- , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
- Config Lcd = 16 * 2
- Do
- 'Schieberegister auswärten
- Call Populate_shift_register()
- 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
- If Taster1 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster1 "
- End If
- If Taster2 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster2 "
- End If
- If Taster3 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster3 "
- End If
- If Taster4 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster4 "
- End If
- If Taster5 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster5 "
- End If
- If Taster6 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster6 "
- End If
- If Taster7 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster7 "
- End If
- If Taster8 = 0 Then
- Cls
- Locate 1 , 1
- Lcd " Taster8 "
- End If
- Wait 1
- Loop
- End
- Sub Populate_shift_register()
- Sr_load_pin = 0
- sr_load_pin=1
- Shiftin Sr_data , Sr_clock , Sr1 , 0
- Shiftin Sr_data , Sr_clock , Sr2 , 0
- Shiftin Sr_data , Sr_clock , Sr3 , 0
- End Sub
-
ariel6 schrieb:
Aber er nimmt immer nur Pin0 am 74HC165.
Am LCD steht dann aber Taster8
Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Hallo,
ich habe Hardware noch mal kontroliert und alles Io.
Atmega32 auch getauscht und den 74HC165 auch.
Es bleibt alles so.
Gibt es nicht noch eine andere möglichkeit zum Programieren?
Gruß Peter -
Ich sehe aber auch ein Problem bei den ganzen if-Abfragen. Ich würde es so machen
BASCOM-Quellcode
- Cls
- Locate 1 , 1
- Select Case Sr1
- Case %B11111110 : Lcd "Taster1"
- Case %B11111101 : Lcd "Taster2"
- Case %B11111011 : Lcd "Taster3"
- Case %B11110111 : Lcd "Taster4"
- Case %B11101111 : Lcd "Taster5"
- Case %B11011111 : Lcd "Taster6"
- Case %B10111111 : Lcd "Taster7"
- Case %B01111111 : Lcd "Taster8"
- Case Else : Lcd " "
- End Select
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem. -
ariel6 schrieb:
ich habe Hardware noch mal kontroliert und alles Io.
Ich sehe im Programm kein Problem, wüsste auch nicht, wie man es anders machen sollte, außer den Befehl shiftin in Einzelbefehle aufzudröseln. Wenn der eine Taster sicher erkannt wird, dann liegt es auch nicht am Programm.
Wie schaut denn dein Aufbau aus? Steckbrett?Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
ariel6 schrieb:
den 74HC165 auch
Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Hallo,
Ich hatte mal nur ein und auch 3.
Naja nicht ganz mit Taster 1.
Er hat immer das letzte genommen was im Do und Loop war.
Wenn ich Taster 1 gedrückt hatte.
Dann weiß ich auch nicht so richtig weiter.
Ein Lay habe ich auch noch von der Platine.
Mit Case is auch eine Gute Idee.
Gruß Peter -
ariel6 schrieb:
Er hat immer das letzte genommen was im Do und Loop war.
Wenn ich Taster 1 gedrückt hatte.
Was passiert denn, wenn du auf dem display sr1, sr2 und sr3 anzeigen lässt? Das ist eine bessere Anzeige, um die Schaltung zu testen.Raum für Notizen
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()
-