ADC auslesen und über Software UART ausgeben ATTiny13a

    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!

    • ADC auslesen und über Software UART ausgeben ATTiny13a

      Hi,

      Ich bin absoluter Neuling und möchte folgendes mit einem Tiny13a machen.

      Es wird ein ADC Wert ausgelesen und ein Port mit einer Hysterese ein und ausgeschalten.
      Zusätzlich möchte ich aber zum Einstellen des richtigen ADC Wertes den ADC Wert über die SoftUART ausgeben.

      Leider bekomme ich das mit einem Tiny13a nicht hin.

      Den Tiny habe ich gewählt weil SO8 nicht überschritten werden sollte.

      Vielen Grüße

      David

      Quellcode

      1. 'Tiefentladeschutz über ADC'
      2. $sim
      3. $Regfile="attiny13a.dat"
      4. $Crystal=20000000
      5. $hwstack=16
      6. $swstack=8
      7. $framesize=8
      8. Dim Messung As Word
      9. Config Adc = Single , Prescaler = Auto , Reference = AVCC
      10. Start Adc
      11. Config Portb.0 = Output
      12. Do
      13. Messung = Getadc(0)
      14. if Messung < 10 Then
      15. Portb.0 = 1
      16. elseif Messung > 100 Then
      17. Portb.0 = 0
      18. End If
      19. Wait 4
      20. Loop
      21. End
      Alles anzeigen
    • Hallo @ProNet ,
      was mir schon mal auffällt: Warum willst du den mit 20Mhz laufen lassen? Dazu brauchst du einen externen Takt an Pin CLKI. Verwende doch den internen calibrierten Osz. 4,8/9,6MHz... reicht völlig aus. Dazu musst du natürlich die Fuse-Bits richtig setzen. Wenn du aber auf ext. Takt "gefust" und keinen Taktoszillator angeschlossen hast läuft überhaupt nix.
    • Bau das noch ein

      $baud = 9600


      'Open a TRANSMIT channel for output
      Open "comX.y:9600,8,n,1" For Output As #1
      Print #1 , Messung

      statt x.y nach dem com musst du den verwendeten port eintragen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hi,

      Vielen Dank für die Tipps!

      so funktioniert es:

      Gibt es da noch irgendwelche Verbesserungen?

      Gruß David

      Quellcode

      1. $Regfile="attiny13a.dat"
      2. $Crystal=4800000
      3. $hwstack=16
      4. $swstack=8
      5. $framesize=8
      6. config Portb.0 = Output
      7. open "COMB.4:4800,8,N,1" For Output As #2
      8. Dim Messung As Word
      9. Config Adc = Single , Prescaler = Auto , Reference = AVCC
      10. Start Adc
      11. Do
      12. Messung = Getadc(0)
      13. Print #2 , Messung ;
      14. if Messung < 10 Then
      15. Portb.0 = 1
      16. elseif Messung > 100 Then
      17. Portb.0 = 0
      18. End If
      19. Wait 4
      20. Loop
      21. End
      Alles anzeigen
    • Was sagt der code-explorer zu den stack-Größen? Also, was hat der berechnet? Steht unter 'info', soweit ich mich erinnere. Bei print braucht der mehr framesize.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Die Fehlerrate liegt bei 4.8/9.6 MHz bei max. 0.8% . Dies wird oft überbewertet, zumal wir es oft nur mit der Übertragung von ein paar Bytes zu tun haben und nicht von ganzen Dateien. (9.6MHz und 4800 Baud haben sogar 0%). Auch die Stabilität des calibrierten Osz. ist für solche Zwecke ausreichend.
    • oscar schrieb:

      Ist doch gut wenns funktioniert. Als Übungsaufgabe wäre es noch z.B. möglich den Wert "Messung" in Volt umzurechnen und dies dann über com ausgeben.

      Hi,

      das hatte ich schon mit drin.
      passt leider nicht mehr mit rein.
      BASCOM sagt 105%...

      Quellcode

      1. $Regfile="attiny13a.dat"
      2. $Crystal=4800000
      3. $hwstack=16
      4. $swstack=8
      5. $framesize=8
      6. config Portb.4 = Output
      7. open "COMB.2:4800,8,N,1" For Output As #1
      8. Const Ref = 5 / 1024
      9. Dim Messung As Word
      10. Dim Volt As Single
      11. Config Adc = Single , Prescaler = Auto , Reference = AVCC
      12. Start Adc
      13. Do
      14. Messung = Getadc(3)
      15. Volt = Messung * Ref
      16. Print #1 , Volt ;
      17. if Messung < 10 Then
      18. Portb.4 = 1
      19. elseif Messung > 100 Then
      20. Portb.4 = 0
      21. End If
      22. Wait 1
      23. Loop
      24. End
      Alles anzeigen
    • Dann nimm kein single sondern zB. den 100fachen Wert von Volt. Da sollte ein word reichen und die Singlerechnerei, die viel Platz braucht, fällt auch weg.

      Ach, nee, das ist kein guter Vorschlag, vergiss es. ||
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • So vielleicht? mit 2% Fehler oder 0% Fehler bei 5,11V Vcc ;)

      Quellcode

      1. open "COMB.2:4800,8,N,1" For Output As #1
      2. Dim Messung As Word
      3. Dim Volt As Word
      4. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      5. Start Adc
      6. Do
      7. Messung = Getadc(3)
      8. if Messung < 10 Then
      9. Portb.4 = 1
      10. elseif Messung > 100 Then
      11. Portb.4 = 0
      12. End If
      13. Volt = Messung * 5
      14. Print #1 , Volt ;
      15. Print #1 , "mV"
      16. Waitms 1
      17. Loop
      18. End
      Alles anzeigen
    • Wenn der Platz eng wird noch ein Tip.

      Versuche keine Single-Berechnungen, sondern mach es nur mit Integer.
      Dadurch werden die Single-Routinen nicht eingebunden.

      Umrechnung ist ja U=5V * ADC-Wert / 1024

      In Integer:

      Dim U as Integer
      U=5*ADC-Wert
      U=U\1024

      Gibt Volt ohne Nachkommastelle

      Bei U=50*ADC-Wert, rest bleibt gleich ergibt das die Spannung mit 0.1V Auflösung

      Der Wert 50*ADC-Wert muss aber in die Variable passen.
      Sonst Long nehmen.
    • Servus,

      vielen Dank für die ganzen Tipps.

      Die Ausgabe mit Volt und mV ist sehr hilfreich, wird aber in meinem Fall nicht benötigt.
      Es soll ein Tiefentladeschutz werden der einmalig eingestellt wird.
      Über einen Spannungsteiler werden die jeweiligen Spannungen des Akkus vor dem Teiler mit einen Labornetzteil eingespeist und nach dem Spannungsteiler mit dem Tiny gemessen.
      Die Werte werden dann in den Code eingetragen und ein Spannungsregler damit enabled oder disabled.

      Viele Grüße

      David Grau
    • Hier kann sehr gut mit Ganzzahlen zur genaueren Berechnung agiert werden, z.B. die vorgeschlagenen INTEGER oder halt LONG verwenden, aber keine Single. Wenn der Speicher arg knapp wird gibt es einfache Sachen:
      - den Wert mit 51 multiplizieren und dann durch 512 teilen (9x Shift right)
      - den Wert mit 8 multiplizieren (3x Shift left) und dann den doppelten Wert (1x Shift left) addieren
      ....

      Alles schneller als Fließkomma - und spart Speicher.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.