kleines Impulsmodul

    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!

    • kleines Impulsmodul

      Hallo


      Ich muss eine kleine Schaltung Bauen für eine Maschine da die Elektronik durch ein defektes Netzteil beschädigt wurde . Sie Läuft soweit wider bis auf ein kleines Modul das ich nun m.h. eines Attiny13 nachbauen will.
      Zum Verständnis die Funktion: auf einer Welle sitzt ein Magnet der einen Hallsensor bei 0° schaltet (Flanke H zu L) und bei 90° abschaltet (Flanke L zu H) ich brauche nun jeweils für 0° und 90° auf getreten Ausgängen einen Impuls von 2ms.
      Ich habe etwas gegoogelt und bin auf den PCINT gestoßen und denke das ist das was ich brauche
      Ich habe einen kleinen Programmcode gebastelt der auf dem Steckbrett schon mal zu funktionieren scheint.
      Da ich nicht der Profi bin Jetzt die Frage an die Experten ist das so richtig oder kann man noch was verbessern.?


      Gruß ronyh

      Quellcode

      1. $Regfile="attiny13a.dat"
      2. $Crystal=20000000
      3. $hwstack=8
      4. $swstack=0
      5. $framesize=0
      6. Pcmsk.1 = 1 ' PCINT für Port B.2 freigeben
      7. Gimsk.5 = 1 ' PCints aktivieren
      8. Sreg.7 = 1 ' Interrups ein
      9. On Pcint0 up
      10. Config Pinb.1 = Input ' Pin 6
      11. Portb.1 = 1
      12. Config Portb.3 = Output 'Pin 2
      13. impuls1 Alias Portb.3
      14. portb.3 = 1
      15. Config Portb.4 = Output 'Pin 3
      16. impuls2 Alias Portb.4
      17. portb.4 = 1
      18. Do
      19. reset impuls1
      20. reset impuls2
      21. Loop
      22. up:
      23. Pcmsk.1 = 0
      24. if Pinb.1=1 then
      25. set impuls1
      26. waitms 2
      27. reset impuls1
      28. endif
      29. if Pinb.1=0 then
      30. set impuls2
      31. waitms 2
      32. reset impuls2
      33. endif
      34. Pcmsk.1 = 1
      35. return
      36. end
      Alles anzeigen
      Gruß aus Thüringen
      Ronyh

      ***************
    • $Crystal=20000000
      erscheint mir falsch? Ein Tinny13 hat bei Auslieferung 1,2Mhz er kann 9.6, 4.8, 1.2 , 0.6, 0.128 und 16khz
      Oder bekommt er die 2mHz extern? Aus dem Crystall wird das waitms berechnet.
      Soll er beim Einschalten beide Ausgänge einschalten? (Zeile 24 und 30)
      Zeilen 42 und 55 sind unnötig, während der Isr (up:) sind die Interrupts sowieso gesperrt.

      ronyh schrieb:

      kann man noch was verbessern.?
      Es läuft so wie es ist (vorausgesetzt die 2Mhz stimmen)
      anders geht immer; aber was wäre (für Dich) besser? Man könnte Flash sparen - wozu wenn er nichts anderes tun muß? Die 2ms und deren Beginn präziser einhalten - machts nen Unterschied? Vielleicht nen Watchdog - der schadet nie.
      Ein End in Zeile 39 würde auch nicht schaden Es verringert die Change das er beim Abschalten in die up: auskommt.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pluto25 ()

    • Danke für deine Hilfe

      $Crystal=20000000 ist falsch mal wieder ohne nachzudenken Kopiert
      hab ich in 9600000 geändert waren bei mir die Auslieferungseinstellungen laut Fusebits
      Zeile 24,30 sind auch nicht notwendig 42,55 hab ich auch gelöscht.
      "end" ist geändert und Watchdog habe ich mit eingefügt.
      Gruß aus Thüringen
      Ronyh

      ***************
    • Ich hätte einfach den INT0 genommen und auf Flankenwechsel = "Change" konfiguriert.
      Der Interrupt ist einfacher zu parametrieren als ein PCINT-Interrupt.

      Das ist aber meine persönliche Meinung.

      Im übrigen solltest du deine Stackwerte mal im Simulator prüfen.
      Ich denke da gibt es Overflows.

      Und die ISR, so wie du sie jetzt hast, kannst du auch vereinfachen.
      Denn die ISR wird ja durch den Flankenwechsel aufgerufen.
      Brauchst dort also keine Pegel mehr prüfen, kannst einfach den Puls ausgeben und fertig.
    • Mitch64 schrieb:

      Brauchst dort also keine Pegel mehr prüfen, kannst einfach den Puls ausgeben und fertig.
      Doch denn es sind zwei verschiedene Pins die den Puls ausgeben. Leider kann der int0 nur einen Int auslösen nicht einen für rising und einen anderen für falling :D
      Aber er hängt am selben Pin wie der PcInt. Wie wäre int 0 rising und pcint . Da der Int0 Vorrang hat würde er der Impuls1 setzen während dann bei fallender Flanke der PcInt den Impuls2 setzt?
      PS Natürlich läuft der Stack über , da werden 32 Bytes rein gehauen, macht aber kein Problem da der Speicher sonst gar nicht benutzt wird
    • Hi
      Ich habe das mal mit Int0 = change getestet funktioniert auch ,macht aber scheinbar keinen unterschied.

      Quellcode

      1. $Regfile="attiny13a.dat"
      2. $Crystal=9600000
      3. $hwstack=32
      4. $swstack=5
      5. $framesize=20
      6. Config Watchdog = 64
      7. Start Watchdog
      8. Config Int0 = change
      9. Enable Interrupts
      10. Enable Int0
      11. On Int0 up
      12. impuls1 Alias Portb.3 'pin2
      13. Config impuls1 = Output
      14. impuls2 Alias Portb.4
      15. Config impuls2 = Output 'pin3
      16. CONFIG PINB.1 =INPUT 'pin6
      17. PINB.1 = 1
      18. Do
      19. reset impuls1
      20. reset impuls2
      21. reset watchdog
      22. Loop
      23. end
      24. up:
      25. if Pinb.1=1 then
      26. set impuls1
      27. waitms 2
      28. reset impuls1
      29. endif
      30. if Pinb.1=0 then
      31. set impuls2
      32. waitms 2
      33. reset impuls2
      34. endif
      35. return
      Alles anzeigen
      Gruß aus Thüringen
      Ronyh

      ***************
    • ronyh schrieb:

      macht aber scheinbar keinen unterschied.
      In dem Fall nicht. Der Int0 hat Vorrang gegenüber dem Pcint falls sie mal beide eingesetzt werden.
      Ob nun das Datenblatt oder die Bascom Hilfe verwand wird ist "Geschmakssache".
      Die UP könnte kürzer sein:

      Quellcode

      1. Up:
      2. If Pinb.1 = 1 Then
      3. Set Impuls1
      4. Else
      5. Set Impuls2
      6. End If
      7. Waitms 2
      8. Return
      Ganz ohne Interrupts würde der Code kürzer. Viele Wege gleiches Ergebniss a_448_c66dc889