Variablen im laufenden Betrieb auslesen und kurze Vorstellung

    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!

    • Variablen im laufenden Betrieb auslesen und kurze Vorstellung

      Moin,
      ich bin der Neue hier. Heisse Stefan, bin 53 Jahre alt, komme aus Viersen und habe mich bisher neben Modell U-Booten mit PICAXE beschäftigt. BASIC ist das Einzige, das ich so einigermassen verstehe, muss wohl an meinen ersten Programmierversuchen mit ZX81 und ZX Spectrum liegen. Als ich einmal eine spezielle Schaltung benötigte, machte mich jemand auf PICAXE aufmerksam. Einfach zu bedienen, aber langsam. Bisher hats gereicht, nun muss mehr Dampf her.
      Ich habe mir die BASCOM Software gekauft und erfolgreich das erste PICAXE Programm auf BASCOM umgebaut. Nun stehe ich aber vor einem Problem, das es so unter PICAXE nicht gibt: Der programmierte Chip arbeitet im Prinzip so wie ich es benötige, aber ich muss wissen welcher Wert am A/D Eingang eingelesen wird. Der Chip soll von der Funktion her nur die Spannung von 3 LiPo Zellen lesen und anhand einiger voreingestellter Werte eine Blinkfolge ausgeben. 1x blinken ist voll, 5x blinken ist Entladeschlussspannung erreicht.
      Der PICAXE wird über 2 Drähte plus Masse programmiert, die gleichen Drähte kann ich zum auslesen der Variablen etc nach dem Befehl debug im laufenden Betrieb auslesen und entsprechend meinen Code bei fehlerhaften Umrechnungen anpassen. Wie mache ich das bei BASCOM? Ich programmiere mit USBASP, der Chip ist ein ATTiny85.
      Als Workaround habe ich fürs Erste ein I2C Display angeschlossen auf dem ich mir die Werte ausgeben lassen wollte, aber das hat anscheinend vom Port her mit dem AD Wandler und der LED Ausgabe kollidiert. Ich habe das hier genommen:
      forum.g-heinrichs.de/viewtopic…600d73cf5453b10eb76967b2e
      Aber wie gesagt, war nur ein Workaround, primär will ich die Variablen in der Schaltung auslesen können. Hat jemand ne Idee?

      Beste Grüße
      Stefan




      ,
    • Willkommen im Bascom-Forum :)

      17b schrieb:

      I2C Display angeschlossen auf dem ich mir die Werte ausgeben lassen wollte, aber das hat anscheinend vom Port her mit dem AD Wandler und der LED Ausgabe kollidiert
      naja, der Attiny85 ist nicht gerade ein Einsteigerfreundlicher Chip.
      Ich empfehle da gerne den Arduino nano v3 (Atmega328), der hat alles nötige und genug Pins, um nicht zu verzweifeln.
      Prinzipiell musst du die Pins für I2C frei halten, sonst funktioniert der Bus nicht, wenn da ein analoges Signal mitschwimmt.

      P.S.:Ich nehme gerne eine serielle Ausgabe mit Terminalprogramm am PC.
    • Den Tiny hatte ich liegen. 328 wäre in der speziellen Anwendung mit Kanonen auf Spatzen geschossen. Wie gesagt, brauche eigentlich nur einen Eingang und einen Ausgang, daher auch der Tiny.
      Die kann ich die serielle Ausgabe am Tiny starten? Hatte schon die gleiche Idee, aber beim print Befehl kam eine Fehlermeldung vom Compiler.

      Hier der Code:

      Quellcode

      1. $Regfile="attiny85.dat"
      2. $Crystal=20000000
      3. $hwstack=16
      4. $swstack=5
      5. $framesize=16
      6. $lib "YLcd_i2c.lib" 'Y Treiber für LCD
      7. Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
      8. Const Pcf_d4 = 4
      9. Const Pcf_d5 = 5
      10. Const Pcf_d6 = 6
      11. Const Pcf_d7 = 7
      12. Const Pcf_rs = 0
      13. Const Pcf_rw = 1
      14. Const Pcf_e2 = 3
      15. Const Pcf_e1 = 2
      16. Config Scl = Portb.2 'Konfigurieren von I2C
      17. Config Sda = Portb.0
      18. Config Lcd = 20 * 4
      19. Config I2cdelay = 1
      20. Config Adc = Single , Prescaler = Auto
      21. 'start adc
      22. dim zaehler as byte
      23. dim lop as byte
      24. dim spannung as word
      25. dim akkukum as word
      26. Dim _lcd_e As Byte
      27. dim s as long
      28. ausg alias portb.4
      29. _lcd_e = 128
      30. ausg = 1
      31. lop =5
      32. Waitms 30
      33. Cls
      34. 'Locate 1 , 1
      35. 'Lcd "Spannungsüberwachung"
      36. 'Locate 2 , 1
      37. 'Lcd "Akkuspannung: V"
      38. do
      39. akkukum = 0
      40. for zaehler = 1 to 10 '10x
      41. spannung = getadc(3) 'spannung lesen
      42. akkukum = akkukum + spannung
      43. next zaehler
      44. 'spannung = akkukum / 10 'mittelwert bilden
      45. 'spannung=2.5*spannung
      46. 'spannung= spannung/512
      47. s =val (spannung)
      48. Locate 1 , 1
      49. Lcd s
      50. cls
      51. select case spannung
      52. case 198 to 255 'spannung zwischen 19,8 und 25,5v?
      53. lop = 1 'einmal blinken
      54. gosub blink
      55. case 180 to 197 'spannung zwischen 18 und 19,7v?
      56. lop = 2 'zweimal blinken
      57. gosub blink
      58. case 168 to 179 'spannung zwischen 16,8 und 17,9v?
      59. lop = 3 'dreimal blinken
      60. gosub blink
      61. case 150 to 167 'spannung zwischen 15 und 16,7v?
      62. lop = 4 'viermal blinken
      63. gosub blink
      64. case 0 to 149 'houston, wir haben ein problem. UNTERSPANNUNG!
      65. lop = 10 'hier soll später 255 stehen. gaaaaanz viel blinken
      66. gosub blink
      67. end select
      68. loop
      69. blink:
      70. for zaehler =1 to lop
      71. ausg =1 'led an
      72. waitms 1 'kurzer impuls
      73. ausg =0 'led aus
      74. waitms 20 'kurze pause
      75. next zaehler
      76. waitms 100 'längere pause
      77. return
      78. displayaus:
      79. ' "xxxxxxxxxxxxxxxxxxxx
      80. Locate 1 , 1
      81. Lcd "Spannungsüberwachung"
      82. Locate 2 , 1
      83. Lcd "Akkuspannung: V"
      84. 'Locate 3 , 1
      85. 'Lcd "me,im not sleepy and"
      86. 'Locate 4 , 1
      87. 'Lcd "there aint no place"
      88. return
      Alles anzeigen
      Ich hab schon die ganze Ausgabe aufs Display bis auf die Ausgabe des reinen Wertes ab Zeile 62 auskommentiert, aber dann fängt der Rest des Programmes schon an zu spinnen.
    • Aber eigendlich sollte es kein Problem darstellen. Wie ist die jetzige Beschaltung?
      Wenn (sinnvollerweise) Pin B2(7)=SCL und Pin B0 für I2C benützt werden,
      sowie Pin B1 für die LED
      dann (unnötigerweise) B3 und B4 für einen Quartz
      bleibt noch der Reset Pin welcher problemlos als ADC genutzt werden kann.
      Solange der Wert über 2/3 Betriebsspannung bleibt braucht er nicht mal ausgeschaltet zu werden, wodurch weiteres ISP Programmieren möglich bleibt.
      Für das Lcd benütze ich den gleichen Stecker wie zum Programmieren dadurch wird es dabei abgezogen und stört nicht.
      Wenn der Quartz wegbleibt könnte er auch noch die Balance der Zellen erfassen.


      Ich schreibe zu langsam

      Ein I2cinit muß da noch rein.
      Dann reicht es das blink einmal pro schleife aufzurufen.
      Vielleicht noch eine Verzögerung rein damit zwischen dem letzten Blinken und dem ersten eine Weile vergehen.

      17b schrieb:

      kann ich die serielle Ausgabe am Tiny starten?
      Per Software-Uart
      z.B. Open "COMB.4:9600,8,n,1" For Output As #1
      und dann Print #1, ...

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

    • Ah, wir kommen der Sache näher. Die Stackwerte waren defaultwerte. Um ehrlich zu sein, ich habs nicht verstanden wieso warum und wozu die sind. Brauchte ich bisher nie. Die werde ich als erstes mal auf 32 setzen.
      Die Konfiguration der Pins ist bis auf die I2C Schnittstelle völlig willkürlich, ich teste mal die andere Beschaltung.

      Wie realisiere ich eine serielle Übertragung? Das wäre mir lieber als das Display. Später soll es auch nicht dran sein und die serielle Übertragung könnte ich für jede Schaltung nutzen
    • Hm, da "Com" t nix. Ich hab mal den Code um die I2C Teile gekürzt. An B.2 passiert garnichts. Ich habe einen USB/TTL Konverter angeschlossen, am geöffneten Terminalprogramm wird nichts angezeigt und am Scope ist der Ausgang B.2 auf Null. Durch die Do/Loop Schleife sollte sich zumindest was an B.2 bewegen

      Der neue Code:

      Quellcode

      1. $Regfile="attiny85.dat"
      2. $Crystal=8000000
      3. $hwstack=32
      4. $swstack=32
      5. $framesize=32
      6. Config Adc = Single , Prescaler = Auto
      7. dim zaehler as byte
      8. dim lop as byte
      9. dim spannung as word
      10. dim akkukum as word
      11. Open "comb.1:9600,8,n,1" For Output As #1
      12. ausg alias portb.2
      13. ausg = 1
      14. lop =5
      15. do
      16. akkukum = 0
      17. for zaehler = 1 to 10 '10x
      18. spannung = getadc(0) 'spannung lesen
      19. akkukum = akkukum + spannung
      20. next zaehler
      21. spannung = akkukum / 10 'mittelwert bilden
      22. spannung=2.5*spannung
      23. spannung= spannung/512
      24. Print #1 , "spannung: " ; spannung
      25. select case spannung
      26. case 198 to 255 'spannung zwischen 19,8 und 25,5v?
      27. lop = 1 'einmal blinken
      28. gosub blink
      29. case 180 to 197 'spannung zwischen 18 und 19,7v?
      30. lop = 2 'zweimal blinken
      31. gosub blink
      32. case 168 to 179 'spannung zwischen 16,8 und 17,9v?
      33. lop = 3 'dreimal blinken
      34. gosub blink
      35. case 150 to 167 'spannung zwischen 15 und 16,7v?
      36. lop = 4 'viermal blinken
      37. gosub blink
      38. case 0 to 149 'houston, wir haben ein problem. UNTERSPANNUNG!
      39. lop = 10 'hier soll später 255 stehen. gaaaaanz viel blinken
      40. gosub blink
      41. end select
      42. loop
      43. blink:
      44. for zaehler =1 to lop
      45. ausg =1 'led an
      46. waitms 1 'kurzer impuls
      47. ausg =0 'led aus
      48. waitms 20 'kurze pause
      49. next zaehler
      50. waitms 100 'längere pause
      51. return
      Alles anzeigen
    • 17b schrieb:

      Tiny13 über. Dafür schreibt er jetzt auf die serielle Schnittstelle. Zwar völlig wirres Zeugs, das ich auch mit anderen Baudraten nicht lesbar bekomme, aber er schreibt.
      vermutlich hat der zu wenig Stack ;)
      Hier hab ich mal mit einem Tiny13 ein paar serielle Daten geschickt, ohne den Overhead des Compilers.
      muss ich mal raussuchen...hier hab ich es, es war doch ein Tiny85 mit 8MHz und 9600 Baud:

      BASCOM-Quellcode

      1. Send:
      2. W = Wx / 1000
      3. Sbyte2 = W + 48
      4. Gosub Send2
      5. W = Wx Mod 1000
      6. Sbyte = W
      7. W = W / 100
      8. Sbyte2 = W + 48
      9. Gosub Send2
      10. W = Wx Mod 100
      11. W = W / 10
      12. Sbyte2 = W + 48
      13. Gosub Send2
      14. W = Sbyte Mod 10
      15. Sbyte2 = W + 48
      16. Gosub Send2
      17. Return
      18. Send2:
      19. Portb.4 = 0
      20. Waitus 103
      21. For I = 0 To 7
      22. If Sbyte2.i = 1 Then
      23. Portb.4 = 1
      24. Else
      25. Portb.4 = 0
      26. End If
      27. Waitus 100
      28. Next
      29. Portb.4 = 1
      30. Waitms 1
      31. Return
      Alles anzeigen



      17b schrieb:

      Was für ein Aufwand für so eine einfache Sache
      Deswegen meine Empfehlung, beim Erstversuch einen Atmega 8 aufwärts zu nehmen ;)
    • Ich verstehe das mit dem Atmega8, aber ganz ehrlich, was bringt mir das später? Nur, dass das Programm ggfs läuft, aber wenn ich dann z.B. schon Speicherprobleme wie jetzt beim Tiny habe oder muss dann irgendwo umkonfigurieren. Dann muss ich mir eh was anderes einfallen lassen. Ich nehme da lieber den Prozessor den ich später verwenden will in der Umgebung in der er eingesetzt werden soll.
      Vermutlich muss ich mich erstmal an die anderen Umstände bei BASCOM gewöhnen. Zumindest an dieser Stelle wars beim PICAXE wesentlich leichter. Das war ein Befehl und schon hat er die kompletten Variablen ausgedruckt und alles war klar. Hier sind dafür andere Sachen einfacher, das ansprechen des LC Displays ist zum Beispiel genial einfach. So muss das sein. Hat halt jeder so seine eigene Vor- und Nachteile

      Aber zurück zum meinem Problem, der Ausdruck ist immer noch nicht passend. Ich mach mir mal ein kleines Probeprogramm und teste
    • 17b schrieb:

      aber ganz ehrlich, was bringt mir das später?
      Als ich damals meinen Motorrad-Lappen gemacht habe, fand ich es hilfreich, schon mal mit einem Auto im Verkehr unterwegs gewesen zu sein.
      Wenn du natürlich die harte Tour magst, so what.
      Ich finde es nützlich, wenn ich eine Programmiersprache lerne, wenn mir jemand einen gängigen Prozessor empfiehlt, der ja eh kaum was kostet, und den fast jeder benutzt. Natürlich kannst du mit einem etwas exotischerem Chip einsteigen, so what.
      Aber wunder dich eben nicht über Probleme, ich wollte dir helfen, das hab ich getan.

      Der Vergleich mit Picaxe nützt hier irgendwie nichts, das ist doch ein ganz anderer Prozessor. Ein Vergleich mit Pascal oder C für AVR fände ich angebrachter, da es diese Sprachen auch für Atmels gibt
    • Wie ich sagte, ich verstehe deinen Einwand mit dem Atmega. Ich hab sogar verschiedene hier noch liegen die ich nehmen könnte. Aber genau darum geht es doch. Wenn ich den Atmega nehme mit dem Ziel später einen Tiny zu nehmen aus welchem Grund auch immer, dann werde ich doch früher oder später auf genau diese Probleme stossen die ich jetzt habe. Das hat mit harter Tour doch nichts zu tun
      Ich denke allerdings, dass wir hier eine Diskussion führen, die mich erstmal mit meinem Problem nicht weiter bringt.

      Ich habe ein Minimalprogramm gebastelt um mir nur einen Text auf die Konsole zu bringen. Auch hier nur Murks:

      Quellcode

      1. $Regfile="attiny13.dat"
      2. $Crystal=8000000
      3. $hwstack=16
      4. $swstack=16
      5. $framesize=16
      6. do
      7. Open "comb.1:9600,8,n,1,inverted" For Output As #1
      8. Print #1 , "spannung: "
      9. loop
      Es spielt keine Rolle ob inverted oder nicht oder verschiedene Baudraten. Nirgends auch nur annähernd etwas lesbares in der Ausgabe. Wo liegt mein Denkfehler?
      Dateien