Atmega328p Zeitintervall passt nicht

    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!

    • Atmega328p Zeitintervall passt nicht

      Gruß in die Runde.

      Meine Zeitintervalle passen einfach nicht und ich seh nicht woran das liegen könnte.
      Ich nutze den Atmega328p 28DIP, von Haus aus ist der ja, so wie ich das in den FuseBits gesehen habe mit 8Mhz eingestellt.
      Ich hab Port B als Ausgang und Port D als Eingang.
      Wenn also bei Port D ein High anliegt soll Port B auch auf High gehen und 3 sec warten, dann die Schleife nochmals durchlaufen, ansonsten soll Port B auf Low.
      Der Port D wird durch einen Bewegungssensor auf High gebracht, der auch Messbar mit 3,3 Volt kommt, so wie ich das verstanden habe langen 3,3 Volt dafür aus.
      Port B wird aber nicht auf High gebracht, vielleicht liegts ja an meinem Programm?
      Aber nach gerraumer Zeit (Gefühlt ewig) Schaltet das Relais doch noch. Warum auch immer???
      Ich stell mal den Code rein, für Eventuelle andere fragen, Tips ect. bin ich gerne offen.

      BASCOM-Quellcode: Relais schalten mit dem mega328p

      1. 'Relais schalten mit dem mega328p
      2. $regfile = "m328pdef.dat"
      3. $crystal = 8000000
      4. $hwstack = 32
      5. $swstack = 8
      6. $framesize = 24
      7. Dim Var As Byte
      8. Config Portb.0 = Output 'Ausgang, Relais schalten High / Low
      9. Config PORTD.0 = Input 'Eingang, Liegt ein High an, Relaise Schalten
      10. Portb.0 = 0 'Schalte PINB auf Low
      11. Waitms 3000 'Warte 3sec
      12. Do
      13. If PIND = 1() Then 'Liegt Spannung an PIND, dann
      14. Portb.0 = 1 'Relais schalten
      15. Waitms 3000 'Warte 3sec
      16. ELSE
      17. Portb.0 = 0 'Relais schalten auf Low
      18. End If
      19. Loop
      20. End 'end program
      Alles anzeigen
      Falls jemand noch was benötigt, gerne stelle ich es rein.

      Gruß Wasi
    • Wasi schrieb:

      von Haus aus ist der ja, so wie ich das in den FuseBits gesehen habe mit 8Mhz eingestellt.
      Klares NEIN. Jeder AVR ist bei Auslieferung auf 1 MHz eingestellt.

      Wasi schrieb:

      Config PORTD.0 = Input
      Hier fehlt noch der Pull-Up. Den schaltest du mit

      BASCOM-Quellcode

      1. PORTD.0 = 1

      ein. Man sollte einen Taster immer gegen GND schalten.

      Und es muss auch die Config für den Eingang geändert werden:

      BASCOM-Quellcode

      1. Config PIND.0 = Input

      Wasi schrieb:

      If PIND = 1() Then
      Gibt es hier keine Fehlermeldung?

      Warum benutzt du nicht die Debounce Funktion von Bascom?
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • djmsc schrieb:

      Wasi schrieb:

      von Haus aus ist der ja, so wie ich das in den FuseBits gesehen habe mit 8Mhz eingestellt.
      Klares NEIN. Jeder AVR ist bei Auslieferung auf 1 MHz eingestellt.

      Wasi schrieb:

      Config PORTD.0 = Input
      Hier fehlt noch der Pull-Up. Den schaltest du mit

      BASCOM-Quellcode

      1. PORTD.0 = 1
      ein. Man sollte einen Taster immer gegen GND schalten.

      Und es muss auch die Config für den Eingang geändert werden:

      Wasi schrieb:

      If PIND = 1() Then
      Gibt es hier keine Fehlermeldung?
      Warum benutzt du nicht die Debounce Funktion von Bascom?
      Taster??? Gilt das für den Bewegungs Sensor auch? Da kein Taster vorhanden.

      Nein da gab es keine Fehlermeldung.
    • Hab es jetzt mal abgeändert und im Compiler auch auf 1Mhz gestellt.

      BASCOM-Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 1000000
      3. $hwstack = 32
      4. $swstack = 8
      5. $framesize = 24
      6. Dim Var As Byte
      7. Config PINb.0 = Output 'Ausgang, Relais schalten High / Low
      8. Config PIND.0 = Input 'Eingang, Liegt ein High an, Relaise Schalten
      9. Portb.0 = 0
      10. PortD.0 = 1
      11. Waitms 3000 'Warte 3sec
      12. Do
      13. If PIND = 1() Then 'Liegt High an PIND, dann
      14. PINb.0 = 1 'Relais schalten auf High
      15. Waitms 3000 'Warte 3sec
      16. ELSE
      17. PINb.0 = 0 'Relais schalten auf Low
      18. End If
      19. Loop
      20. End 'end program
      Alles anzeigen
    • Wasi schrieb:

      Config PINb.0 = Output 'Ausgang, Relais schalten High / Low
      Config PIND.0 = Input 'Eingang, Liegt ein High an, Relaise Schalten

      Portb.0 = 0
      PortD.0 = 1
      Nochmal zu dem Config Input und Output. Bei einen Input nimmt man

      BASCOM-Quellcode

      1. Config PINX.Y = Input
      2. PORTX.Y = 1 'schaltet den Pullup ein
      und für einen Output nimmt man

      BASCOM-Quellcode

      1. Config PORTX.Y = Output
      Dabei steht X für den Port z.B. PORTD und Y für den Pin z.B. PORTD.2

      Wasi schrieb:

      If PIND = 1() Then
      Hier sollte übrigens auch die Nummer vom Pin angegeben werden

      BASCOM-Quellcode

      1. If PIND.0 = 1 then
      und die Klammer kannst du weg lassen.

      Wasi schrieb:

      Gilt das für den Bewegungs Sensor auch?
      Sorry das hatte ich überlesen :(

      Da dein Sensor auf High geht, solltest du aber den interen Pullup (Portd.0 = 1) weg lassen und einen Pulldown anschließen.
      Vom Pind.0 einen 10 Kiloohm Widerstand gegen Masse schalten.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo @'djmsc

      hab das jetzt wie folgt abgeändert:


      BASCOM-Quellcode

      1. 'Relais schalten mit dem mega328p
      2. 'Die 2te
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 32
      6. $swstack = 8
      7. $framesize = 24
      8. Dim Var As Byte
      9. Config PIND.0 = Input
      10. Config PORTB.0 = Output
      11. PORTD.0 = 1 'schaltet den Pullup ein
      12. Waitms 3000 'Warte 3sec
      13. DO
      14. If PIND.0 = 1 then
      15. Waitms 10000
      16. Else
      17. PINb.0 = 0 'Relais schalten auf Low
      18. End If
      19. Loop
      20. End
      Alles anzeigen
      Ich hoffe das alles richtig gemacht zu haben, vielleicht kannst du ja mal drüberschauen.

      Die Fusebits hab ich nun auf 8Mhz laufen und den Teiler Disabelt.
    • In etwa so?

      BASCOM-Quellcode

      1. 'Relais schalten mit dem mega328p
      2. 'Die 2te
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 32
      6. $swstack = 8
      7. $framesize = 24
      8. Dim Var As Byte
      9. Config PIND.0 = Input
      10. Config PORTB.0 = Output
      11. PORTD.0 = 1 'schaltet den Pullup ein
      12. Waitms 3000 'Warte 3sec
      13. DO
      14. If PIND.0 = 0 then
      15. PINb.0 = 1 'Relais schalten auf Low
      16. Waitms 10000
      17. Else
      18. PINb.0 = 0 'Relais schalten auf Low
      19. PORTD.0 = 1 'schaltet den Pullup ein
      20. End If
      21. Loop
      22. End
      Alles anzeigen
    • Hallo @Wasi

      probiere es mal so

      BASCOM-Quellcode

      1. 'Relais schalten mit dem mega328p
      2. 'Die 2te
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 32
      6. $swstack = 8
      7. $framesize = 24
      8. Dim Var As Byte
      9. Config PIND.0 = Input
      10. Config PORTB.0 = Output
      11. 'PORTD.0 = 1 Weg lassen und externen PullDown Widerstand (10 KiloOhm) gegen GND anschließen // 'schaltet den Pullup ein
      12. Waitms 3000 'Warte 3sec
      13. DO
      14. If PIND.0 = 0 then
      15. Portb.0 = 1 'Relais schalten auf Low
      16. Waitms 10000 'Hier würde ich einen Timer verwenden
      17. Else
      18. Portb.0 = 0 'Relais schalten auf Low
      19. 'Portd.0 = 1 'schaltet den Pullup ein
      20. End If
      21. Loop
      22. End
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • stefanhamburg schrieb:

      If PIND.0 = 1 then
      Sorry ich habs nur so von original-Code übernommen.

      Wasi schrieb:

      Der Port D wird durch einen Bewegungssensor auf High gebracht, der auch Messbar mit 3,3 Volt kommt,
      Es soll aber ein High-Pegel anliegen, wenn der Bewegungsmelder aktiv ist.
      Muss also so aussehen:

      BASCOM-Quellcode

      1. 'Relais schalten mit dem mega328p
      2. 'Die 2te
      3. $regfile = "m328pdef.dat"
      4. $crystal = 8000000
      5. $hwstack = 32
      6. $swstack = 8
      7. $framesize = 24
      8. Dim Var As Byte
      9. Config PIND.0 = Input
      10. Config PORTB.0 = Output
      11. 'PORTD.0 = 1 Weg lassen und externen PullDown Widerstand (10 KiloOhm) gegen GND anschließen // 'schaltet den Pullup ein
      12. Waitms 3000 'Warte 3sec
      13. DO
      14. If PIND.0 = 1 then
      15. Portb.0 = 1 'Relais schalten auf Low
      16. Waitms 10000 'Hier würde ich einen Timer verwenden
      17. Else
      18. Portb.0 = 0 'Relais schalten auf Low
      19. 'Portd.0 = 1 'schaltet den Pullup ein
      20. End If
      21. Loop
      22. End
      Alles anzeigen
      :-)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Wasi schrieb:

      Von PinD.0 ein Kabel auf GND dann 10KOhm und dann die 3,3V vom Bewegungsmelder?
      Richtig???
      Ja damit ein definiertes Signal anliegt. Ein Input ist immer Tri-State. Also offen und mit dem Pulldown ziehst du den Eingang auf Masse.
      Wenn jetzt ein High-Signal kommt wird es auch registriert.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von djmsc ()