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

      1. $regfile = "m32def.dat"
      2. $crystal = 16000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. Dim Sr1 As Long
      7. Dim Sr2 As Byte
      8. Dim Sr3 As Byte 'Schieberegister 1
      9. Declare Sub Populate_shift_register()
      10. Sr_data Alias Pina.6 'Schieberegister DATA
      11. Config Sr_data = Input
      12. Sr_clock Alias Porta.4 'Schieberegister CLOCK
      13. Config Sr_clock = Output
      14. Sr_load Alias Porta.5 'Schieberegister STROBE
      15. Config Sr_load = Output
      16. Sr_load_port Alias Portb
      17. Const Sr_Load_pin = 5
      18. 'Alias für die angeschlossenen LEDs
      19. Taster1 Alias Sr1.0
      20. Taster2 Alias Sr1.1
      21. Taster3 Alias Sr1.2
      22. Config Lcdbus = 4
      23. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
      24. , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
      25. Config Lcd = 16 * 2
      26. Do
      27. 'Schieberegister auswärten
      28. Call Populate_shift_register()
      29. 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
      30. If Taster1 = 0 Then
      31. Cls
      32. Locate 1 , 1
      33. Lcd " Taster1 "
      34. End If
      35. If Taster2 = 0 Then
      36. Cls
      37. Locate 1 , 1
      38. Lcd " Taster2 "
      39. End If
      40. If Taster3 = 0 Then
      41. Cls
      42. Locate 1 , 1
      43. Lcd " Taster3 "
      44. End If
      45. Wait 1
      46. Loop
      47. End
      48. Sub Populate_shift_register()
      49. Shiftin Sr_data , Sr_clock , Sr1
      50. Shiftin Sr_data , Sr_clock , Sr2
      51. Shiftin Sr_data , Sr_clock , Sr3
      52. Pulseout Sr_load_port , Sr_load_pin , 10000
      53. End Sub
      Alles anzeigen
    • @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

      1. $regfile = "m32def.dat"
      2. $crystal = 16000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. Dim Sr1 As Byte
      7. Dim Sr2 As Byte
      8. Dim Sr3 As Byte 'Schieberegister 1
      9. Declare Sub Populate_shift_register()
      10. Sr_data Alias Pina.6 'Schieberegister DATA
      11. Config Sr_data = Input
      12. Porta.6 = 1
      13. Sr_clock Alias Porta.4 'Schieberegister CLOCK
      14. Config Sr_clock = Output
      15. Sr_load Alias Porta.5 'Schieberegister STROBE
      16. Config Sr_load = Output
      17. Sr_load_port Alias Portb
      18. Const Sr_Load_pin = 5
      19. 'Alias für die angeschlossenen LEDs
      20. Taster1 Alias Sr1.0
      21. Taster2 Alias Sr1.1
      22. Taster3 Alias Sr1.2
      23. Config Lcdbus = 4
      24. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
      25. , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
      26. Config Lcd = 16 * 2
      27. Do
      28. 'Schieberegister auswärten
      29. Call Populate_shift_register()
      30. 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
      31. If Taster1 = 0 Then
      32. Cls
      33. Locate 1 , 1
      34. Lcd " Taster1 "
      35. End If
      36. If Taster2 = 0 Then
      37. Cls
      38. Locate 1 , 1
      39. Lcd " Taster2 "
      40. End If
      41. If Taster3 = 0 Then
      42. Cls
      43. Locate 1 , 1
      44. Lcd " Taster3 "
      45. End If
      46. Wait 1
      47. Loop
      48. End
      49. Sub Populate_shift_register()
      50. Pulseout Sr_load_port , Sr_load_pin , 10000
      51. Shiftin Sr_data , Sr_clock , Sr1
      52. Shiftin Sr_data , Sr_clock , Sr2
      53. Shiftin Sr_data , Sr_clock , Sr3
      54. End Sub
      Alles anzeigen
    • 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

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • 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 first
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo,
      aber jetzt sagt er Taster3 ist an auf Pin0 vom 74HC165. Auf alle anderen reagiert er garnicht.
      Gruß Peter


      Quellcode

      1. $regfile = "m32def.dat"
      2. $crystal = 16000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. Dim Sr1 As Byte
      7. Dim Sr2 As Byte
      8. Dim Sr3 As Byte 'Schieberegister 1
      9. Declare Sub Populate_shift_register()
      10. Sr_data Alias Pina.6 'Schieberegister DATA
      11. Config Sr_data = Input
      12. Porta.6 = 1
      13. Sr_clock Alias Porta.4 'Schieberegister CLOCK
      14. Config Sr_clock = Output
      15. Sr_load Alias Porta.5 'Schieberegister STROBE
      16. Config Sr_load = Output
      17. Sr_load_port Alias Portb
      18. Const Sr_Load_pin = 5
      19. 'Alias für die angeschlossenen LEDs
      20. Taster1 Alias Sr1.0
      21. Taster2 Alias Sr1.1
      22. Taster3 Alias Sr1.2
      23. Config Lcdbus = 4
      24. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
      25. , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
      26. Config Lcd = 16 * 2
      27. Do
      28. 'Schieberegister auswärten
      29. Call Populate_shift_register()
      30. 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
      31. If Taster1 = 0 Then
      32. Cls
      33. Locate 1 , 1
      34. Lcd " Taster1 "
      35. End If
      36. If Taster2 = 0 Then
      37. Cls
      38. Locate 1 , 1
      39. Lcd " Taster2 "
      40. End If
      41. If Taster3 = 0 Then
      42. Cls
      43. Locate 1 , 1
      44. Lcd " Taster3 "
      45. End If
      46. Wait 1
      47. Loop
      48. End
      49. Sub Populate_shift_register()
      50. Pulseout Sr_load_port , Sr_load_pin , 10000
      51. Shiftin Sr_data , Sr_clock , Sr1 , 0
      52. Shiftin Sr_data , Sr_clock , Sr2 , 0
      53. Shiftin Sr_data , Sr_clock , Sr3 , 0
      54. End Sub
      Alles anzeigen
    • 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 sub
      Raum 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

      1. $regfile = "m32def.dat"
      2. $crystal = 16000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. Dim Sr1 As Byte
      7. Dim Sr2 As Byte 'Schieberegister 1
      8. Dim Sr3 As Byte
      9. Declare Sub Populate_shift_register()
      10. Sr_data Alias Pina.6 'Schieberegister DATA
      11. Config Sr_data = Input
      12. Porta.6 = 1
      13. Sr_clock Alias Porta.4 'Schieberegister CLOCK
      14. Config Sr_clock = Output
      15. Sr_load_pin Alias Portb.5
      16. config sr_load_pin=output
      17. Sr_load_pin = 0
      18. Sr_clock = 0
      19. 'Alias für die angeschlossenen LEDs
      20. Taster1 Alias Sr1.0
      21. Taster2 Alias Sr1.1
      22. Taster3 Alias Sr1.2
      23. Taster4 Alias Sr1.3
      24. Taster5 Alias Sr1.4
      25. Taster6 Alias Sr1.5
      26. Taster7 Alias Sr1.6
      27. Taster8 Alias Sr1.7
      28. Config Lcdbus = 4
      29. Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 _
      30. , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
      31. Config Lcd = 16 * 2
      32. Do
      33. 'Schieberegister auswärten
      34. Call Populate_shift_register()
      35. 'Status der LEDs einstellen, die über die Schieberegister angeschlossen sind
      36. If Taster1 = 0 Then
      37. Cls
      38. Locate 1 , 1
      39. Lcd " Taster1 "
      40. End If
      41. If Taster2 = 0 Then
      42. Cls
      43. Locate 1 , 1
      44. Lcd " Taster2 "
      45. End If
      46. If Taster3 = 0 Then
      47. Cls
      48. Locate 1 , 1
      49. Lcd " Taster3 "
      50. End If
      51. If Taster4 = 0 Then
      52. Cls
      53. Locate 1 , 1
      54. Lcd " Taster4 "
      55. End If
      56. If Taster5 = 0 Then
      57. Cls
      58. Locate 1 , 1
      59. Lcd " Taster5 "
      60. End If
      61. If Taster6 = 0 Then
      62. Cls
      63. Locate 1 , 1
      64. Lcd " Taster6 "
      65. End If
      66. If Taster7 = 0 Then
      67. Cls
      68. Locate 1 , 1
      69. Lcd " Taster7 "
      70. End If
      71. If Taster8 = 0 Then
      72. Cls
      73. Locate 1 , 1
      74. Lcd " Taster8 "
      75. End If
      76. Wait 1
      77. Loop
      78. End
      79. Sub Populate_shift_register()
      80. Sr_load_pin = 0
      81. sr_load_pin=1
      82. Shiftin Sr_data , Sr_clock , Sr1 , 0
      83. Shiftin Sr_data , Sr_clock , Sr2 , 0
      84. Shiftin Sr_data , Sr_clock , Sr3 , 0
      85. End Sub
      Alles anzeigen
    • ariel6 schrieb:

      Aber er nimmt immer nur Pin0 am 74HC165.
      Am LCD steht dann aber Taster8
      dann nimm mal in der sub statt der '0' eine '2'. Und messe mal nach, ob durch einen anderen Taster der Eingang auch auf 0V gezogen wird. Ist vielleicht eine Gnd-Verbindung schlecht?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich sehe aber auch ein Problem bei den ganzen if-Abfragen. Ich würde es so machen

      BASCOM-Quellcode

      1. Cls
      2. Locate 1 , 1
      3. Select Case Sr1
      4. Case %B11111110 : Lcd "Taster1"
      5. Case %B11111101 : Lcd "Taster2"
      6. Case %B11111011 : Lcd "Taster3"
      7. Case %B11110111 : Lcd "Taster4"
      8. Case %B11101111 : Lcd "Taster5"
      9. Case %B11011111 : Lcd "Taster6"
      10. Case %B10111111 : Lcd "Taster7"
      11. Case %B01111111 : Lcd "Taster8"
      12. Case Else : Lcd " "
      13. End Select
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • ariel6 schrieb:

      ich habe Hardware noch mal kontroliert und alles Io.
      Aber es wird jetzt 'Taster 1' statt 'Taster 8' gemeldet?
      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

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • 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
      Dateien
    • ariel6 schrieb:

      Er hat immer das letzte genommen was im Do und Loop war.
      Wenn ich Taster 1 gedrückt hatte.
      Öhm, das versteh' ich jetzt mal nicht, was du damit meinst. Ist das jetzt irgendwie eine Antwort auf meine Frage, ob mit der Option '2' statt der '0' jetzt 'Taster 1' ausgegeben wurde? Wenn immer 'Taster 8', das letzte der do..loop, ausgegeben wird, dann werden die möglichen anderen Anzeigen nicht zu sehen sein, weil die dann gleich mit 'Taster 8' überschrieben werden.
      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 ()