Frage zu Arrays mit ATtiny 13 unter BASCOM

    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!

    • Frage zu Arrays mit ATtiny 13 unter BASCOM

      Ich will einen bestimmten Spannungsverlauf durch PWM mit einem ATtiny 13 realisieren. Da Arrays nach meiner Kenntnis bis zu 255 Werte enthalten können, wollte ich meine Werte in ein Array packen und sie dann nacheinander auslesen und als PWM ausgeben. Mit Bascom gingen aber nur ca 60 Werte rein, dann kam bei Bascom die Meldung "out of RAM...". Das verstehe ich nicht, denn wenn ich die Werte nacheinander als Zeilen in's Programm (siehe unten) schreibe, reicht der RAM-Speicher und das Programm ließ sich compilieren. Brauchen Arrays so viel mehr Platz? Das unten stehende Programm erscheint mir sehr primitiv, eine Abarbeitung der Werte aus einem Array oder String wäre eleganter. Hat jemand eine Idee?

      BASCOM-Quellcode

      1. _______________________________________________________
      2. $regfile = "attiny13.dat"
      3. $crystal = 9600000
      4. $hwstack = 10
      5. $swstack = 10
      6. $framesize = 10
      7. Config Portb = Output
      8. Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
      9. Do
      10. Pwm0a = 2250
      11. Waitms 10
      12. Pwm0a = 200
      13. Waitms 10
      14. Pwm0a = 150
      15. Waitms 10
      16. Pwm0a = 90
      17. Waitms 10
      18. Pwm0a = 60
      19. Waitms 10
      20. Pwm0a = 55
      21. Waitms 10
      22. Pwm0a = 53
      23. Waitms 10
      24. Pwm0a = 51
      25. Waitms 10
      26. Pwm0a = 50
      27. Waitms 10
      28. Pwm0a = 49
      29. Waitms 10
      30. Pwm0a = 49
      31. Waitms 10
      32. Pwm0a = 50
      33. Waitms 10
      34. Pwm0a = 52
      35. Waitms 10
      36. Pwm0a = 53
      37. Waitms 10
      38. Pwm0a = 55
      39. Waitms 10
      40. Pwm0a = 57
      41. Waitms 10
      42. Pwm0a = 59
      43. Waitms 10
      44. Pwm0a = 60
      45. Waitms 10
      46. Pwm0a = 61
      47. Waitms 10
      48. Pwm0a = 60
      49. Waitms 10
      50. Pwm0a = 60
      51. Waitms 10
      52. Pwm0a = 59
      53. Waitms 10
      54. Pwm0a = 58
      55. Waitms 10
      56. Pwm0a = 57
      57. Waitms 10
      58. Pwm0a = 56
      59. Waitms 10
      60. Pwm0a = 55
      61. Waitms 10
      62. Pwm0a = 55
      63. Waitms 10
      64. Pwm0a = 54
      65. Waitms 10
      66. Pwm0a = 53
      67. Waitms 10
      68. Pwm0a = 52
      69. Waitms 10
      70. Pwm0a = 52
      71. Waitms 10
      72. Pwm0a = 51
      73. Waitms 10
      74. Pwm0a = 51
      75. Waitms 10
      76. Pwm0a = 51
      77. Waitms 10
      78. Pwm0a = 50
      79. Waitms 10
      80. Pwm0a = 50
      81. Waitms 10
      82. Pwm0a = 50
      83. Waitms 10
      84. Pwm0a = 50
      85. Waitms 10
      86. Pwm0a = 50
      87. Waitms 10
      88. Pwm0a = 50
      89. Waitms 10
      90. Pwm0a = 50
      91. Waitms 10
      92. Pwm0a = 50
      93. Waitms 10
      94. Pwm0a = 50
      95. Waitms 10
      96. Pwm0a = 50
      97. Waitms 10
      98. Pwm0a = 50
      99. Waitms 10
      100. Pwm0a = 51
      101. Waitms 10
      102. Pwm0a = 53
      103. Waitms 10
      104. Pwm0a = 55
      105. Waitms 10
      106. Pwm0a = 57
      107. Waitms 10
      108. Pwm0a = 59
      109. Waitms 10
      110. Pwm0a = 62
      111. Waitms 10
      112. Pwm0a = 64
      113. Waitms 10
      114. Pwm0a = 65
      115. Waitms 10
      116. Pwm0a = 66
      117. Waitms 20
      118. Pwm0a = 67
      119. Waitms 10
      120. Pwm0a = 67
      121. Waitms 10
      122. Pwm0a = 66
      123. Waitms 20
      124. Pwm0a = 65
      125. Waitms 10
      126. Pwm0b = 64
      127. Waitms 10
      128. Pwm0a = 63
      129. Waitms 10
      130. Pwm0a = 62
      131. Waitms 10
      132. Pwm0a = 61
      133. Waitms 10
      134. Pwm0a = 60
      135. Waitms 10
      136. Pwm0a = 57
      137. Waitms 10
      138. Pwm0a = 55
      139. Waitms 10
      140. Pwm0a = 53
      141. Waitms 10
      142. Pwm0a = 51
      143. Waitms 10
      144. Pwm0a = 49
      145. Waitms 10
      146. Pwm0a = 47
      147. Waitms 10
      148. Pwm0a = 46
      149. Waitms 10
      150. Pwm0a = 45
      151. Waitms 10
      152. Pwm0a = 44
      153. Waitms 10
      154. Pwm0a = 42
      155. Waitms 10
      156. Pwm0a = 42
      157. Waitms 10
      158. Pwm0a = 42
      159. Waitms 10
      160. Pwm0a = 42
      161. Waitms 10
      162. Pwm0a = 38
      163. Waitms 10
      164. Pwm0a = 31
      165. Waitms 10
      166. Pwm0a = 20
      167. Waitms 10
      168. Pwm0a = 120
      169. Waitms 10
      170. Pwm0a = 190
      171. Waitms 10
      172. Loop
      173. End
      Alles anzeigen
    • Hi,
      wenn du die Werte in's Programm schreibst, dann sind die im flash fest verankert (Konstanten). Vom flash hat der tiny13 1k.
      Legst du ein array an, dann sind das Variablen, die musst du im Programm mit Werten füllen. Variablen werden im ram abgelegt, davon hat der tiny13 nur 64.
      Du könntest es ja mal mit einer data-Tabelle probieren, die ist im flash verankert.

      In deinem Programm steht auch mal
      Pwm0b = 64
      Soll da ein b stehen?
      Raum für Notizen

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

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

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

    • gzielos schrieb:

      Da Arrays nach meiner Kenntnis bis zu 255 Werte enthalten können,
      ...und darüber hinaus...

      Hilfe schrieb:

      The maximum number of elements is 65535. For Xmega with huge memory it is 8MB!

      Mein Tip - die PWM-Werte sind doch sicher kein Zufallsprodukt und basieren auf einer Rechenregel. Also bei 10ms-Pause ist sicher auch Zeit zum Rechen, das spart ROM und RAM.
    • Hallo, muß es unbedingt ein Array sein?
      Wenn das fixe Werte sind, geht das auch gut mit DATA-Zeilen.
      vielleicht so
      For I=1 to XX
      READ Wert
      PWM0A=Wert
      WAIT MS 10
      NEXT I

      DATA 1,2,.......,56

      Wenn nur Teile der Datentabelle gelesen werden sollen, geht es auch mit LOOKUP.

      Detlef

      wieder nur mit erweitert
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Hallo an alle,
      bin überrascht und begeistert von der großen "Anteilnahme" - danke!

      tschoeatsch schrieb:

      In deinem Programm steht auch mal
      Pwm0b = 64
      Soll da ein b stehen?
      Ist ein Fehler, der beim Kopieren enstand - soll auch Pwm0a = 64 heißen. Das mit der data-Tabelle werde ich probieren.

      Galahat schrieb:

      Mein Tip - die PWM-Werte sind doch sicher kein Zufallsprodukt und basieren auf einer Rechenregel
      Nein, sind sie nicht. Die Werte sind insgesamt ein EKG (ein Herzschlag) und sollen dann eine EKG-Ableitung simulieren. Damit können dann EKG-Geräte, solche ECG-Uhren usw. getestet werden. Natürlich nach Filterung und Pegelabsenkung auf 1...10 mV!

      Pluto25 schrieb:

      Nicht schlecht fürn 8 bit Timer
      Leider auch ein Versehen, soll Pwm0a = 250 heißen.

      Dekaman schrieb:

      Hallo, muß es unbedingt ein Array sein?
      Wenn das fixe Werte sind, geht das auch gut mit DATA-Zeilen.
      vielleicht so
      For I=1 to XX
      READ Wert
      PWM0A=Wert
      WAIT MS 10
      NEXT I
      Im Gegenteil, Arrays gingen ja nicht, Dein Vorschlag wird umgehend getestet - vielleicht ist dann noch Platz für mehr Werte und die Darstellung im EKG wird genauer.
    • Ein schöner Datensatz!

      Darf ich mal ganz neugierig fragen, wie Du auf die einzelnen PWM-Werte gekommen bist? Hast Du einen EKG-Zyklus per ADC im 10ms-Takt abgerastert?
      Ich habe die PWM-Werte mal in eine EXCEL-Tabelle gezogen, verdreifacht und einen Graphen daraus gemacht. Insider erkennen spätestens auf den zweiten Blick, dass dieses EKG rückwärts läuft (T-Welle, QRS-Komplex, P-Welle) :)
      Dateien
    • Habe ich mal irgendwo aus einer EKG-Darstellung Punkt für Punkt abgenommen. Dass das nun rückwärts läuft, ist tragisch (für den Betroffenen). Wäre aber schön, wenn der Fachmann das nochmal richtig stellen könnte - am besten gleich in die Excel-Tabelle und dann an mich... oder an alle Interessierten.
      Danke
    • Na ja, SO schlimm ist es auch nicht, da die meisten Auswerte-Algorithmen sich an der hohen, spitzen (R)-Zacke orientieren, sei es mit Software-Algorithmen oder einem analogen Differenzier-Glied. Und die ist ja ziemlich symmetrisch, und der Rest (die Wellen links und rechts daneben) sind für die Frequenzerkennung eher Beiwerk. Aber da ich jeden Tag auf solche Kurven starre, konnte ich mir den Kommentar nicht verkneifen :)

      Ich weiß jetzt nicht aus dem Stand, ob man in Excel die Reihenfolge einer Spalte mit 81 Werten quasi auf den Kopf stellen kann, aber möglich müsste das sein. Dann müsste man die Werte in der neuen Reihenfolge halt wieder händisch in Bascom übertragen; aber so wie es aussieht, steht die Art und Weise der Daten-Einbindung ja ohnehin noch nicht fest...

      Viel Erfolg,

      Daniel
    • Nochmal danke an alle,
      inzwischen hat sich einiges getan, z.B. habe ich das Prinzip von Dekaman ausprobiert, es funktioniert zumindest bis zum Compilieren. Dabei können es nun bedeutend mehr Werte sein (255 sollten mindestens gehen). Leider funktioniert mein Programmer seit dem letzten Win10-Update nicht mehr. Der Pololu-Programmer kommt hoffentlich in den nächsten Tagen...
      Also bin ich nicht mehr auf nur 81 Werte angewiesen:

      Einzeller schrieb:

      Ich weiß jetzt nicht aus dem Stand, ob man in Excel die Reihenfolge einer Spalte mit 81 Werten quasi auf den Kopf stellen kann
      Das von Ulrich gezeigte Gerät ist sicher toll, aber mit mindestens 200 € außer Konkurenz. Meine Lösung sollte nur Pfennige kosten und außerdem meinen Basteltrieb befriedigen. Im Übrigen sieht das dort gezeigte EKG meinem zumindest ähnlich. Mit ein paar Änderungen in einzelnen Abschnitten sollte es realistisch werden (vielleicht kommen ein paar Hinweise von Einzeller).
      Das letzte zu lösende Problem stellt die Filterung der PWM-Werte dar. Sollte mein Pololu-Programmer kommen, gehe ich dran.

      Ulrich schrieb:

      als Hinweis:

      Der Siglent Signalgenerator SDG830 liefert auch ein Cardiac-Signal (Built-In Waveform), welches in Amplitude, Offset und Frequenz einstellbar ist.

      Im Bild ist das Cardiac-(EKG)Signal auf 1Hz mit 2,5V Amlitude und 1,25V offset eingestellt.
    • Erster Test mit Pololu-Programmer und dem ersten Programm (s.o. - etwas modifiziert). Mit einem RC-Glied 47k/100n und mit 1 ms statt 10 ms Pausen sieht das dann so aus: 20190515-0001_01.jpg

      Eigentlich recht ordentlich. Nur, warum sind die Impulse nach unten. Die PWM-Werte im Pik liegen doch eigentlich hoch (238). Irgendein Denkfehler?

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

    • Clear down bedeutet lange Einschaltzeit des pins bei kleinem Pwm-Wert, clear up, lange Einschaltzeit bei großem Pwm-Wert. Lange Einschaltzeit ergibt hohe Spannung.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Danke nochmal an alle.
      Ich hab's auch mal mit den Data-Zeilen und Clear Up probiert, jetzt geht alles so, wie erhofft:

      $regfile = "attiny13.dat"
      $crystal = 1200000
      $hwstack = 10
      $swstack = 10
      $framesize = 10

      Config Portb = Output

      Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up

      Dim I As Byte
      Dim Wert As Byte

      Do
      Restore Data
      For I = 1 To 198
      Read Wert
      Pwm0a = Wert
      Waitms 4
      Next I
      Loop

      End

      Data:
      Data 248 , 213 , 183 , 153 , 113 , 80 , 69 , 65 , 61 , 59 , 56 , 54 , 53 , 52 , 51 , 50 , 49 , 48 , 48 , 48 , 48 , 48 , 47 , 47 , 47 , 47 , 47 , 47 , 48 , 48 , 48 , 49 , 49 , 50 , 51 , 53 , 54 , 55 , 56 , 57 , 58 , 58 , 58 , 58 , 58 , 59 , 59 , 59 , 59 , 59 , 60 , 60 , 61 , 62 , 64 , 65 , 67 , 68 , 69 , 70 , 71 , 72 , 72 , 73 , 73 , 73 , 73 , 73 , 73 , 72 , 72 , 71 , 70 , 69 , 68 , 66 , 65 , 64 , 62 , 61 , 61 , 60 , 59 , 58 , 58 , 57 , 56 , 54 , 53 , 53 , 52 , 52 , 52 , 51 , 51 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 50 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 51 , 50 , 51 , 51 , 52 , 52 , 54 , 57 , 59 , 61 , 63 , 64 , 66 , 68 , 70 , 71 , 71 , 72 , 72 , 72 , 71 , 71 , 70 , 69 , 66 , 64 , 59 , 55 , 51 , 49 , 48 , 46 , 45 , 44 , 43 , 43 , 42 , 42 , 42 , 41 , 41 , 41 , 40 , 39 , 37 , 36 , 30 , 24 , 12 , 5 , 28 , 55 , 126 , 174 , 205 , 238