Timer0 bei AtTiny13A

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

    • Timer0 bei AtTiny13A

      Hallo,

      laut Datenblatt soll der AtTiny13A eine Frequenz von 4 bis 20Mhz haben.
      Ich habe gerade vollgendes Programm auf meinen AtTiny13A übertragen.
      Leider bekomme ich, trotzdem das ich keine Fusebits geändert habe keinen zugriff mehr.

      Source Code

      1. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      2. 'Mikrocontroller Konfigurieren
      3. $regfile = "attiny13.dat"
      4. $crystal = 1000000 ' used crystal frequency
      5. '$swstack = 40
      6. $swstack = 10
      7. '$hwstack = 40
      8. $hwstack = 15
      9. '$framesize = 40
      10. $framesize = 30
      11. 'Ende Mikrocontroller Konfigurieren
      12. '=============================================================
      13. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      14. 'Ports
      15. Led_gruen Alias Portb.1
      16. Pwm_schalter Alias Portb.0
      17. Einstell_taster Alias Pinb.3
      18. Config Pwm_schalter = Output
      19. Config Led_gruen = Output
      20. Config Einstell_taster = Input
      21. 'Ende
      22. '=============================================================
      23. Const Timer0reload = 254
      24. Config Timer0 = Timer , Prescale = 1024
      25. Load Timer0 , Timer0reload
      26. On Timer0 , Timer0_routine
      27. Enable Timer0
      28. Start Timer0
      29. Enable Interrupts
      30. Dim Var_pwm As Byte
      31. Dim Var_taster As Byte
      32. Dim Var_x As Byte
      33. Do
      34. If Einstell_taster = 1 Then
      35. Waitms 40
      36. Incr Var_taster
      37. If Var_taster > 10 Then Var_taster = 0
      38. For Var_x = 1 To Var_taster
      39. Led_gruen = 1
      40. Waitms 300
      41. Led_gruen = 0
      42. Waitms 300
      43. Next
      44. End If
      45. Waitms 100
      46. Loop
      47. Timer0_routine:
      48. Incr Var_pwm
      49. If Var_pwm < Var_taster Then
      50. Pwm_schalter = 1
      51. Else
      52. Pwm_schalter = 0
      53. End If
      54. If Var_pwm > 10 Then Var_pwm = 0
      55. Load Timer0 , Timer0reload
      56. Return
      57. End 'end program
      Display All
      Kann mir jemand sagen ob ich den Timer so konfiguriert habe das er irgendetwas zwischen 500 und 1000Hz hat?
      Die Frequenz des Tiny müsste ja falsch sein, oder?

      Im Simulator ist der Timer irre langsam.
      Das Tool das Ihr mir gezeigt hat läuft trotz kompatiblitätsmodus leider nicht. Also es gibt nichts aus. (AVR Timer)

      Grüße
      Alex
    • monkye wrote:

      Auf Seite 24 der DOKUMENTATION steht allerdings, dass der Prozessor mit 4,8 bzw. 9,6 MHz läuft. In Deinem Programm steht aber in Zeile 4 1MHz...
      Wie verhält sich das dann in der Praxis?
      Ist er 4 mal schneller oder 4 mal langsamer als er sein sollte.

      Wie gesagt: bekomme keinen zugriff mehr und 4 mal schneller ginge noch.

      Grüße & Danke!
      Alex
    • Wie schnell der tiny taktet, kann man aus dem Programm nicht erkennen, dazu bräuchte man infos über die fuses und des Quarzes, wenn es einen gibt. Das $crystal ist eine info für den compiler, damit er die Programmteile, die ein richtiges timing benötigen, richtig umsetzt. Ein wait zB.
      Wenn dein tiny mit 1Mhz betrieben wird, dann bekommt dein timer durch den prescaler einen Takt von 1Mhz/1024. Also ca 1khz. Durch den timerload werden die Anzahl der Takte vorgegeben, bis der timer 'überläuft' und die isr auslöst. Das heißt bei dir alle 254 timertakte wird die isr aufgerufen, das wären 1000000/1024/254hz. Dort wird mit 10 Aufrufen die Pwm vervollständigt, das heißt deine Pwn hat eine Frequenz von ca. 1000000/1024/254/10hz= 0,38hz.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      Durch den timerload werden die Anzahl der Takte vorgegeben, bis der timer 'überläuft' und die isr auslöst. Das heißt bei dir alle 254 timertakte wird die isr aufgerufen
      Das stimmt glaube ich nicht ganz: Der Preload-Wert ist ja schon 254, das heißt also, dass der Timer nur noch 2 (!) Taktimpulse braucht, um überzulaufen.

      Hier stellt sich natürlich die Frage ob es sinnvoll ist, den Timer mit dem größtmöglichen Prescaler von 1024 so langsam wie möglich zu machen, ihn dann aber so hoch vorzuladen, dass er schon nach zwei Timer-Takten überläuft. Unabhängig davon müsste die Timer-ISR mit einer Frequenz von 1000000/1024/2 = 488 Hz aufgerufen werden.
      (Vorausgesetzt die Taktfrequenz ist 1 MHz, aber das ist ja auch eher unwahrscheinlich, da der interne Oszillator des Tiny13 ja nur 4,8 oder 9,6 MHz kann)

      Mir ist aber noch was anderes aufgefallen:

      In Zeile 30 schreibst Du On timer0 , timer0_routine

      Laut Bascom-Dokumentation steht zwischen dem benannten Interrupt und dem Namen der Interrupt-Routine aber kein Komma, und ich schreibe es auch immer so:
      On InterruptXY ISR_XY

      Vielleicht führt dieses kleine Komma ja dazu dass Bascom nicht versteht, zu welchem Label der Controller beim Timer0-Interrupt springen soll - ich würde es mal ohne probieren.
    • @Einzeller
      Man kann den timer setzen (timer0=xx), dann beginnt der timer ab dem Stand bis zu überlaufen zu ticken, oder man kann den timer 'loaden':
      The TIMER0 does not have a reload mode. But when you want the timer to generate an interrupt after 10 ticks for example, you can use the LOAD statement.
      It will do the calculation : (256-value)
      So LOAD TIMER0, 10 will load the TIMER0 with a value of 246 so that it will overflow after 10 ticks.
      TIMER1 is a 16 bit counter so it will be loaded with the value of 65536-value.

      Dann wird von bascom eine Rechnung ausgeführt. Hier im Beispiel kommt die Rechnung zum tragen, also braucht der timer 254 ticks bis zum Überlauf, er wird auf den Wert 256-254=2 gesetzt und braucht dadurch 254 ticks.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Einzeller wrote:



      Hier stellt sich natürlich die Frage ob es sinnvoll ist, den Timer mit dem größtmöglichen Prescaler von 1024 so langsam wie möglich zu machen, ihn dann aber so hoch vorzuladen, dass er schon nach zwei Timer-Takten überläuft. Unabhängig davon müsste die Timer-ISR mit einer Frequenz von 1000000/1024/2 = 488 Hz aufgerufen werden.

      Laut Bascom-Dokumentation steht zwischen dem benannten Interrupt und dem Namen der Interrupt-Routine aber kein Komma, und ich schreibe es auch immer so:
      On InterruptXY ISR_XY

      Vielleicht führt dieses kleine Komma ja dazu dass Bascom nicht versteht, zu welchem Label der Controller beim Timer0-Interrupt springen soll - ich würde es mal ohne probieren.
      Zu Absatz 1:
      Mir fällt gerade nichts anderes ein wie soll ich Ihn den ansonsten mit 1000Hz betreiben?

      Zu Absatz 2:
      Danke! Der Compiler hat beides gefressen ohne zu meckern.
      Aber das heißt ja nicht viel bei Bascom.
      Hat schon öfters nicht gemeckert obwohl es dann praktisch überhaupsts nicht funktionierte.

      Allgemein: Juhuu! Ich habe gerade auf "magische" Weise den chip löschen können.
      Hab Ihn beim ersten anschluß gleich ge"cleant" also nur auf löschen geklickt.
      Hat hingehauen. Hab den Takt auf 4,8Mhz gestellt - teiler auf 8 Also eine Frequenz von 600kHz

      600.000 / 256 / 2 = 1171 Hz

      Habs im Programm auch abgeändert.

      Grüße
      Alex
    • tschoeatsch wrote:

      @Einzeller
      Man kann den timer setzen (timer0=xx), dann beginnt der timer ab dem Stand bis zu überlaufen zu ticken, oder man kann den timer 'loaden':
      The TIMER0 does not have a reload mode. But when you want the timer to generate an interrupt after 10 ticks for example, you can use the LOAD statement.
      It will do the calculation : (256-value)
      So LOAD TIMER0, 10 will load the TIMER0 with a value of 246 so that it will overflow after 10 ticks.
      TIMER1 is a 16 bit counter so it will be loaded with the value of 65536-value.

      Dann wird von bascom eine Rechnung ausgeführt. Hier im Beispiel kommt die Rechnung zum tragen, also braucht der timer 254 ticks bis zum Überlauf, er wird auf den Wert 256-254=2 gesetzt und braucht dadurch 254 ticks.
      Ich fürchte ich habe das immer noch nicht verstanden.
      Wenn ich möchte das Timer0 gleich überläuft muss ich den Wert dann auf 0 oder auf 256 setzen?
      Egal ob ich Timer0reload auf 0 oder 256 setze die LED die ich an Pwm_SChalter ranhänge blinkt langsam vor sich hin.

      Neuer Code:

      Source Code

      1. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      2. 'Mikrocontroller Konfigurieren
      3. $regfile = "attiny13.dat"
      4. $crystal = 600000 ' used crystal frequency
      5. '$swstack = 40
      6. $swstack = 10
      7. '$hwstack = 40
      8. $hwstack = 15
      9. '$framesize = 40
      10. $framesize = 30
      11. 'Ende Mikrocontroller Konfigurieren
      12. '=============================================================
      13. '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      14. 'Ports für Display Konfigurieren PortD,
      15. Led_gruen Alias Portb.1
      16. Pwm_schalter Alias Portb.0
      17. Einstell_taster Alias Pinb.3
      18. Config Pwm_schalter = Output
      19. Config Led_gruen = Output
      20. Config Einstell_taster = Input
      21. 'Ende Ports für Display Konfigurieren PortD
      22. '=============================================================
      23. Const Timer0reload = 1
      24. Config Timer0 = Timer , Prescale = 256
      25. Load Timer0 , Timer0reload
      26. On Timer0 Timer0_routine
      27. Enable Timer0
      28. Start Timer0
      29. Enable Interrupts
      30. Dim Var_pwm As Byte
      31. Dim Var_taster As Byte
      32. Dim Var_x As Byte
      33. Config Watchdog = 8192
      34. Do
      35. If Einstell_taster = 1 Then
      36. Waitms 40
      37. Incr Var_taster
      38. If Var_taster > 10 Then Var_taster = 0
      39. For Var_x = 1 To Var_taster
      40. Led_gruen = 1
      41. Waitms 300
      42. Led_gruen = 0
      43. Waitms 300
      44. Next
      45. End If
      46. Waitms 100
      47. Reset Watchdog
      48. Loop
      49. Timer0_routine:
      50. Incr Var_pwm
      51. If Var_pwm > 10 Then Var_pwm = 0
      52. If Var_pwm < Var_taster Then
      53. Pwm_schalter = 1
      54. Else
      55. Pwm_schalter = 0
      56. End If
      57. Load Timer0 Timer0reload
      58. Return
      59. End 'end program
      Display All
    • Update:

      Es funktioniert :D
      Endlich!
      Anscheinend bedeutet das überhaupst nichts wenn ich den Chipcontent mit dem buffer überprüfe und es "übereinstimmt".
      Wie immer sind die Fehler rätselhaft und nicht wirklich nachvollziehbar.

      Jedes mal lösche ich erst den chip überprüfe dann ob er leer ist.
      Dann sende ich die Daten auf den chip und überprüfe sie.

      Anscheinend bedeutet es rein garnichts wenn diese checks alle keine Fehler anzeigen.

      Grüße
      Alex
    • Alex_T wrote:

      wenn ich den Chipcontent mit dem buffer überprüfe und es "übereinstimmt".
      Womit brennst Du? Ein Verify Chip sollte den "Fehlbrand" erkennen. Natürlich nicht wenn vorher der Buffer mit dem Chipinhalt gefüllt wird. Löschen vor dem Brennen ist eigendlich immer nötig da beim brennen nur Lows geschrieben werden. Ist eine Zelle z.B. Hex 0F kann sie nicht Hex 3F werden ,wohl aber Hex 03.
      In einem 8 bit Timer 256 zu schreiben ist gleich 0 zu schreiben . Das 9te Bit passt ja nicht rein.
      Würde das nun eine Fehlermeldung verursachen wäre es nicht möglich ihn mit einer größeren Variable als ein Byte zu füllen was dann auch Nachteile hätte.

      Alex_T wrote:

      Jedes mal lösche ich erst den chip überprüfe dann ob er leer ist
      Das setze ich normal voraus. Ein verify nach dem brennen scheint mir da wichtiger, speziell wenn er nicht sofort einen Probelauf machen kann.

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

    • Pluto25 wrote:

      Womit brennst Du? Ein Verify Chip sollte den "Fehlbrand" erkennen. Natürlich nicht wenn vorher der Buffer mit dem Chipinhalt gefüllt wird. Löschen vor dem Brennen ist eigendlich immer nötig da beim brennen nur Lows geschrieben werden. Ist eine Zelle z.B. Hex 0F kann sie nicht Hex 3F werden ,wohl aber Hex 03.In einem 8 bit Timer 256 zu schreiben ist gleich 0 zu schreiben . Das 9te Bit passt ja nicht rein.
      Würde das nun eine Fehlermeldung verursachen wäre es nicht möglich ihn mit einer größeren Variable als ein Byte zu füllen was dann auch Nachteile hätte.

      Das setze ich normal voraus. Ein verify nach dem brennen scheint mir da wichtiger, speziell wenn er nicht sofort einen Probelauf machen kann.
      Mit nem USBASP und nen Steckboard.
      Ich hab mir zwar schon ein paar Platinen für den USBasp gelötet aber nur für 28er Pin und für den Tiny2313.
      Obwohl das ding nach dem brennen ein "Alles in Ordnung" ergibt und es zu keinen Fehlermeldungen kommt. Scheint der Chip mal richtig zu funktionieren und mal nicht. Der Chip ist neu - muss an der Software oder an der Hardware liegen.
      Wenn das übertragen der Programmierung mal klappt funktioniert er logischerweise immer. Nur wenn es nicht hinhaut führt es zu kaum nachvollziehbaren Fehlern.
      Dann kann ich auch nacheiander mit abtrennen / Resetten einige male hinterienander brennen dennoch haut und haut es nicht hin. USBasp tauschen funktioniert auch nicht.

      Kann den Fehler quasi nicht nachvollziehen.

      Grüße
      Alex
    • Sorry unglücklich gefragt: Mit welcher Software? Den Bascom Brenner oder was externes?
      Wenns der Bascom ist wäre die vorgehensweise 2,3,falls gewünscht 6 oder nur 7 dann sollte er das alleine machen.
      Verify(6) sollte immer eine Fehler erkennen wenn der Brand danebenging. (Falls nicht vorher 4 gedrückt wird.
      _____________1__2__3__4___5__6__7__
      Zwischenablage.gif

      Der USBASP steht bei Options/Programmer Clock Frequency auf AUTO?
      Das könnte bei kleineren Taktfrequenzen danebengehen. Der Chip darf mit maximal 1/4 Clockfrequenz beschrieben werden. Bei den 600khz vielleicht manuell 93,75khz oder kleiner auswählen.