Attiny13: Wie Clock und Timer setzen für 200ns ISR- Aufruf?

    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!

    • Ja, es muss alle 200 Nanosekunden sein ...

      Die passende Frequenz (am liebsten eine interne Frequenz) war ja Teil meiner Frage, welche Werte ergeben diese 200ns am besten.

      Am Schluss muss ich dann zwei Ausgänge generieren mit diesem Verhalten (siehe Bild), dazu unterteile ich das Ganze in 7 Phasen zu 200ns. Die Pegel lasst dann meine Sorge sein ;)

      Thomas
      Dateien
    • Tom_Thun schrieb:

      Die Pegel lasst dann meine Sorge sein
      Um die hatte ich mich auch nicht gesorgt. Wer mit solchen Frequenzen arbeitet, sollte wissen, dass er möglicherweise den Funkverkehr des Nachbarn stört.

      200ns sind als Interruptaufruf nicht sinnvoll.
      Der Tiny kann maximal 20MHz mit externem Quarz, das ergibt eine Taktzeit von 50ns
      Du hättest also nur 4 Takte für Interrupteinsprung, Register sichern, richtige Daten holen, Pins setzen, Rücksprung.

      Nochmal: Was soll es denn werden? Wir finden sicher eine andere Lösung.
    • Das ist der (simulierte) Ausgang von einem Intel 4201 Clock Chip (hard to find), welcher die zwei benötigten Takt-Phasen für die erste von Intel hergestellte CPU 4004 liefert. Die Feldstärke ist sooo klein, dass ich mir um die Störung irgend eines Verkehrs des Nachbarn wohl keine Sorgen machen muss ;) :)
    • Also, wie gesagt, mit Interrupts kannst du das vergessen.

      Du könntest eine Do-Loop-Schleife machen und die Takte im Simulator abzählen.
      In der Art etwa:

      $regfile = "m168def.dat"
      $crystal = 16000000
      $hwstack = 80
      $swstack = 64
      $framesize = 80

      ddrb.5 = 1
      ddrb.4 = 1

      A Alias Portb.4
      B Alias Portb.5

      Do
      nop
      B = 0
      nop
      nop
      B = 1
      nop
      nop
      A = 0
      nop
      nop
      A = 1
      Loop


      Das ist jetzt nur mal so hingemalt, die genaue Anzahl NOPs musst du halt einfügen.
      Der Takt sollte halt zum Raster passen.
      Der Tiny13 ist mit internen 9,6MHz nicht passend, braucht dann einen externen Quarz von mind. 12MHz
    • Besten Dank!

      Ich sehe, mit einem intern getakteten Attiny13 klappt das nicht, der ist wirklich zu langsam. Habe mal einfach nur B.4 getoggled, da erhalte ich eine Pulsbreite von 600ns.

      Könnte ich mit einem Attiny85 auf PLL gesetzt was erreichen? Wie müsste ich den in Bascom konfigurieren?

      Danke für die Hilfe!
    • Es kommt halt darauf an, wie genau die Werte (400ns Pulsbreite, 200ns Pause, 723KHz Frequenz) eingehalten werden müssen.
      Wenn der interne RC Takt mit etwa 5% Abweichung ok ist, dann kannst du das schon über den Tiny13 alleine erzeugen, aber dann so, wie Michael geschrieben hat. Ein Toggle dauert dann zu lange.
      Mit so einem Minimalprogramm sieht das bei mir schon recht gut aus.

      Quellcode

      1. $regfile = "attiny13a.dat"
      2. $crystal = 9600000
      3. $hwstack = 10
      4. $swstack = 10
      5. $framesize = 10
      6. Osccal = &H73
      7. Chn_1 Alias Portb.1 'MISO
      8. Chn_2 Alias Portb.4
      9. Config Chn_1 = Output
      10. Config Chn_2 = Output
      11. R6 = 2
      12. Do
      13. Reset Chn_1
      14. nop
      15. nop
      16. nop
      17. Set Chn_1
      18. Reset Chn_2
      19. nop
      20. nop
      21. nop
      22. Set Chn_2
      23. Loop
      24. End
      Alles anzeigen

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

    • Mit je ein Nop weniger passts. Die Frequenz kann mit Osccal auf 10 Mhz gesetzt werden. Es ist jedoch Chipabhängig. Möglicherweise wirds genau genug wenn immer die Differenz zum Calibration Byte hinzugerechnet wird. Dann müste die nur einmal erfasst werden und nicht bei jedem Chip erneut.
      Wozu das R6=2 ? Ein Relikt?

      Tom_Thun schrieb:

      Attiny85 auf PLL
      Macht der dann nicht 16Mhz? Aber zwei Pwm Timer die das könnten?

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

    • Ich glaube, das könnte auch gehen mit ISR (NoSave)

      Hier mal der Code

      BASCOM-Quellcode

      1. $Regfile = "ATTiny13a.dat"
      2. $HWStack = 10
      3. $SWStack = 10
      4. $Framesize = 20
      5. $Crystal = 9600000
      6. Clock_A Alias PortB.3
      7. Clock_B Alias PortB.4
      8. Config Clock_A = Output
      9. Config Clock_B = Output
      10. Config Timer0 = Timer , Prescale = 1 , Clear_Timer = 1
      11. Compare0A = 12
      12. On OC0A ISR_723kHz NoSave
      13. Enable OC0A
      14. Enable Interrupts
      15. Do
      16. Nop
      17. Loop
      18. ISR_723kHz:
      19. Reset Clock_B
      20. NOP
      21. Set Clock_B
      22. Reset Clock_A
      23. NOP
      24. Set Clock_A
      25. Return
      Alles anzeigen
      An PortB.3 und PortB.4 kommen die Signale raus.
      Ich habe aber keinen Tiny13 aufgebaut zum Ausprobieren.

      Kann das jemand flashen und das Oszillogramm einstellen?
      Kanal A PortB.3 und an Kanal B PortB.4

      Ich denke, da muss man nur noch das Timing in der ISR etwas anpassen, das das Tastverhältnis stimmt.
      Mit OSCCAL kann dann die Frequenz noch getrimmt werden.
    • @Pluto25
      Ja, das war ein Test.
      Das Setzen des Ausgangs braucht halt immer zwei Takte, mit !OUT PORTB, R6 geht das auch mit einem.
      War aber nicht nötig.
      Also bei mir kommen da bei gezogenen 10MHz genau 400ns Kanal1, 200ns Pause, 400ns Kanal2 und eine Frquenz von 727KHz raus, wobei die Auflösung durch die 24MHz des LA beschränkt ist.

      @Mitch64
      Was soll das bringen mit der ISR?
      Der Controller macht sowieso nicht anderes als die Pins schalten, also kannst du das auch gleich in der Main Loop machen.
      So kommt da 291ns KanalA, 200ns Pause, 291ns KanalB und eine Frequenz von 480KHz raus.
    • @Franz und alle andern, vielen Dank für eure Hilfe, ich bin grad etwas überwältigt ob den tollen Ideen und der zielführenden Hilfe ...

      Der Code von Franz klappt super, habe Osccal = &H79 gesetzt und erhalte doch recht genau die Clock-Signale, wie beim original 4201.

      Mich würde auch noch interessieren, was macht R6=2?

      Es ist wirklich super, dass es mit dem ATtiny13a geklappt hat, ich füge nun noch einen MC34151 für die Pegelwandlung dazu, dann kann ich auf kleinstem Raum den 4201 "ersetzen".

      Dank und Gruss
      Thomas
      Dateien
    • Franz schrieb:

      Was soll das bringen mit der ISR?
      Die Eingangsfrage war ja, auf ISR bezogen.
      Ich habe das als Herausforderung betrachtet, ob es mit ISR überhaupt machbar ist.
      Bei ca. 500KHz war aber Schluss.

      Ergebnis.
      Beide Pins in der ISR schalten mit 723kHz schafft man nicht. Dafür ist der Takt zu gering.
      Aber ein Pin per Hardware-PWM und der andere Per ISR, das geht. Und dann die Frequent mit OSCCAL trimmen, das ging.

      Aber der Michael hat voll ins Schwarze getroffen.
      Wenn der Tiny nix anderes machen muss, als die 2 Phasen zu erzeugen, ist das manuelle Schalten der Pins in der Hauptschleife das einfachste.

      Hier der verwendete Code

      BASCOM-Quellcode

      1. $Regfile = "ATTiny13a.dat"
      2. $HWStack = 10
      3. $SWStack = 10
      4. $Framesize = 20
      5. $Crystal = 9600000
      6. OSCCAL = 121
      7. Clock_A Alias PortB.1 ' OC1B
      8. Clock_B Alias PortB.3
      9. Config Clock_A = Output
      10. Config Clock_B = Output
      11. ' Timer 0 in Mode 7 (Fast PWM Mode)
      12. TCCR0A = &b0011_0011 ' COM0A1|COM0A0|COM0B1|COM0B0|-|-|WGM01|WGM00
      13. TCCR0B = &b0000_1001 ' FOC0A|FOC0B|-|-|WGM02|CS02|CS01|CS01
      14. Compare0A = 16
      15. Compare0B = 2
      16. On OC0A ISR_723kHz NoSave
      17. Enable OC0A
      18. Enable Interrupts
      19. Do
      20. NOP ' verhindert Jittern
      21. Loop
      22. ISR_723kHz:
      23. Reset Clock_B
      24. NOP
      25. Set Clock_B
      26. Return
      Alles anzeigen
      Und hier das Oszillogramm
      DS1Z_QuickPrint1.png

      Das Tastverhältnis kann an der HW-PWM (Clock_A) breiter gemacht werden.
      Bei dem Clock_B (ISR) ein NOP mehr, dann ist der ISR_Aufruf länger als die Periodendauer der 723kHz.
      Geht dann also nicht mehr.

      Die Tast-Verhältnisse stimmen auch nicht so ganz mit dem Oszillogram aus Post #4 überein.
      Problem ist einfach der zu geringe Takt.
    • Ich bin ja schon mal sehr zufrieden, dass die Phases so gut geklappt haben. Um den 4201 zu 100% zu ersetzen, müsste er noch ein Reset Signal an einem Pin einlesen und dann entsprechend setzen. Das wird aber dann wahrscheinlich doch zu viel für den Kleinen ;) ...
    • Tom_Thun schrieb:

      Das wird aber dann wahrscheinlich doch zu viel für den Kleinen ...
      Da sind noch ein paar Nop wo er auch was nützliches machen kann:

      Quellcode

      1. $regfile = "attiny13a.dat"
      2. $crystal = 10000000
      3. $hwstack = 10
      4. $swstack = 10
      5. $framesize = 10
      6. Osccal = &H73
      7. Chn_1 Alias Portb.1 'MISO
      8. Chn_2 Alias Portb.4
      9. Resout Alias Portb.3
      10. Config Chn_1 = Output
      11. Config Chn_2 = Output
      12. Config Resout = Output
      13. R15 = 18 'B1 und B4 High
      14. Do
      15. Set Chn_2
      16. '!ori r15, 18
      17. !OUT PORTB, R15 'Reset ausgeben
      18. !in r15 ,PinB 'einlesen
      19. Reset Chn_1
      20. !Bst R15,3 ' Reset einlesen von B.3
      21. !bld R15,2 ' Wert in Bit 2 kopieren
      22. Set Chn_1
      23. Reset Chn_2
      24. Loop
      25. End
      Alles anzeigen