Atmega328p Zeitintervall passt nicht

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • 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 Source Code: 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
      Display All
      Falls jemand noch was benötigt, gerne stelle ich es rein.

      Gruß Wasi
    • Wasi wrote:

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

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

      BASCOM Source Code

      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 Source Code

      1. Config PIND.0 = Input

      Wasi wrote:

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

      Wasi wrote:

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

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

      BASCOM Source Code

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

      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.
    • Michael wrote:

      Wasi wrote:

      Ich nutze den Atmega328p 28DIP, von Haus aus ist der ja, so wie ich das in den FuseBits gesehen habe mit 8Mhz eingestellt.
      Ja, und der interne Teiler von 8 ist aktiv.Damit hat er 1 MHz Takt.
      Das solltest du auch oben in deinem Programm eintragen und dann stimmen die Wartezeiten wieder.

      Alternativ Fuse DIV8 ausschalten.
      OK, danke.

      Werde ich nachher noch machen.
    • Hab es jetzt mal abgeändert und im Compiler auch auf 1Mhz gestellt.

      BASCOM Source Code

      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
      Display All
    • Wasi wrote:

      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 Source Code

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

      BASCOM Source Code

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

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

      BASCOM Source Code

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

      Wasi wrote:

      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 Source Code

      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
      Display All
      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 Source Code

      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
      Display All
    • Hallo @Wasi

      probiere es mal so

      BASCOM Source Code

      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
      Display All
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Versteh ich jetzt nicht ganz.

      Vom Bewegungsmelder werden 3,3V auf PortD.0 geschickt wenn er auslößt.
      Und jetzt soll ich 10KOhm von PortD.0 auf GND noch zusätzlich löten?

      Von PinD.0 ein Kabel auf GND dann 10KOhm und dann die 3,3V vom Bewegungsmelder?
      Richtig???
    • stefanhamburg wrote:

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

      Wasi wrote:

      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 Source Code

      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
      Display All
      :-)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • djmsc wrote:


      Wasi wrote:

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


      Das Problem ist, das der High Pegel erst bei auslösung High liefert, sonst liegt ein Low an.
    • Wasi wrote:

      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.

      The post was edited 1 time, last by djmsc ().