Attiny13 PWM

  • Hallo liebe liebenden,
    ich hab versucht einen Bascom Code für eine Pwm 500 Hz mit 30 task zu schreiben nur an einer stelle komme ich leider nicht mehr weiter.
    $regfile = "attiny13.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32


    Config Portb.1 = Output "Pin 6 als Hardware Pwm Ausgang"
    Config Timer0 = Timer , Compare B Pwm = Clear Up , Prescale = 64 "8000000Hz / 8 bit / 64 prescale = 488,28Hz, Clear up = mit 5V anfangen dann auf 0V"
    Enable Timer0
    Enable Interrupts


    Do
    ??????? ?( = 77 " 77 von 256 = 30 %"


    Loop
    End
    Wie sag ich Ihm jetzt das er davon nur 30% schalte soll.. also die 77. vielen dank schonmal im voraus.
    Grüße

  • Das der Sram dir ausgeht, ist kein wunder wenn du folgende Parameter verwendest:


    $hwstack = 40
    $swstack = 16
    $framesize = 32


    Der Attiny13 hat nämlich nur 64 Byte SRAM und du verwendest schon 88.


    Folgender Code sollte aber laufen:

  • Was mir gerade noch auffällt: Kommentar werden nicht in Anführungszeichen gesetzt, sondern in Hochkommas.
    Also z.b. 'Pin 6 als Hardware Pwm Ausgang'
    Ausserdem hast du im Code Timer0 als Timer konfiguriert. Es muss aber heißen: Config Timer0 = PWM, ..... usw.

  • Mir fällt gerade auch noch auf das

    Code
    ConfigPortb=Output

    und

    Code
    ConfigTimer0=Pwm

    müsste man auch mit Lehrzeichen schreiben:


    Code
    Config Portb = Output
    Config Timer0 = Pwm


    Bascom ist bei mir schon etwas länger her....


    Bezüglich HWStack, SWStack und der Framegröße sollte dir folgende Erklärung helfen: Klick

  • nochmals vielen dank... aber auch so funktioniert es nicht.


    @ salocin
    ich hatte es hier nur daneben geschreiben damit jeder weis was damit gemeint sein sollte . im basecom stehts nicht drin.
    Ich hab jetzt jetzt so probiert aber erschreibt immernoch das selbe....




  • Du hättest nicht gleich dreimal posten müssen. Habe die anderen 2 mal gelöscht.
    Ansonsten: Hast Du die neuste Bascom Version ? Da hatte ich mal einen komischen Bug in einer alten Version, wo er mir Fehler anzeigte, die es nicht gab.
    Du kannst noch "Start Timer0" einfügen.
    Bei mir sag die Timerkonfig immer so aus:
    "Config Timer0 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down "
    PWM=8 bedeutet, dass es 8 bit also 256 schritte sind.

  • Bascom 2.05.0 schreibt halt die ganze zeit out of sram space... ja es hat sich nix getan beim absenden sorry :S


    bei Pwm = 8 schreibt er "invalid parameter for config" hatt ich auch schon probiert



    [ModEdit: Doppelposts zusammengefasst.]

  • muss ich ihm noch irgentwie die 256 Abstufungen beschreiben also die 8 bit definieren?


    Eigentlich nicht, denn das Ocr0a-Register ist beim Attiny13 bereits durch die Hardware als 8Bit Register definiert, siehe:

    Zitat

    The Output Compare Register B contains an 8-bit value that is continuously compared with the
    counter value (TCNT0). A match can be used to generate an Output Compare interrupt, or to
    generate a waveform output on the OC0B pin.

    (Datenblatt Seite 74)


    Der Paramter

    Code
    Pwm = 8

    ist damit also nicht nötig und wurde bisher ja auch korrekterweise weggelassen.

  • Bascom 2.05.0 schreibt halt die ganze zeit out of sram space


    Hast du denn mal versucht, entsprechend meines Links den HWStack, SWStack und den Frame anzupassen?
    Versuchs mal mit den beschriebenen

    Code
    $hwstack = 32
    $swstack = 5
    $framesize = 20

    , wobei man diese Werte sicher auch noch deinem Programm entsprechend optimieren kann.


    Sorry für den Doppelpost, aber das Forum frisst mal wieder meine Edits :cursing: :thumbdown:

  • Ok hast recht. Hatte bisher nur einmal mit dem Tiny13 zu tun und auch das gestaltete sich schon schwer.
    Versuch nochmal die Stacks und die Framesize auf extrem kleine Werte zu setzen:
    $hwstack = 10
    $swstack = 10
    $framesize = 10
    Denn wenn du keine Festlegst nimmt Bascom die in den Einstellungen vorgegebenen.

  • im Dateblatt steht aber bei der zuweisung für timer0 auch nix mit Pwm sonder nur COUNTER oder TIMER...


    hab es ganzrausgenommen hat auch nichts geändert


    verdammt :D ich habs mal reingeschrieben mit deinen 10er werten uns siehe da.... kaum macht mans richtig... funktionierts 8)
    vielen dank nochmal


    aber wenn ich den Attiny13 im Menü Compiler anwähle schreibt er die Werte die ich am anfang gepostet habe automatisch...



    [ModEdit: Mehrfachposts zusammengefasst, bitte Forenregeln beachten!]

  • ich habe mal Deinen *vierfach*-Post zusammengefasst - in Zukunft bitte den "Bearbeiten"-Button benutzen, vielen Dank! :)


    EDIT: Ah, Lötmeister, da haben wir jetzt gerade beide das selbe gemacht..... :D


    ich habe mir hier auch erlaubt, in einem extra Post drauf hin zu weisen, weil wenn sowas als Mod-Edit in nem bereits geschriebenen Post steht, dann liest's der Poster ja nicht mehr... das ist generell so ein Problem, gibt hier ein paar Threads, wo x Doppelposts zusammengefasst wurden, aber immer wieder welche kommen, weil derjenige das ja nicht mitbekommt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Wenn man so einen kleinen Tiny nimmt, muss man die Einstellungen schon genau ans Programm anpassen.
    Die Fehlermeldung sollte mit

    Code
    $regfile = "attiny13.dat"
    $hwstack = 8
    $swstack = 8
    $framesize = 10


    nicht mehr kommen.
    Zu beachten ist auf jeden Fall noch der Crystal-Wert: Woher nimmst du die 8MHz? Intern kann der Tiny das nämlich nicht erzeugen. Schau mal ins Datenblatt ^^

  • ist das die Frequenz deiner PWM?
    Der Timer macht pro Takt erstmal einen Schritt (mit Prescaler = 1).
    Bei deiner Rechnung hast du als kürzesten Puls den Wert 64. Wenn dieser sich nicht ändert, dann könnte man das quasi als eine "Subfrequenz" betrachten, wenn fu mit den 256 den Prescaler meinst dann stimmt deine Rechnung.
    eigentlich rechnet man die PWM Frequenz immer so:
    Frequenz kürzester Puls = Taktfrequenz / Prescaler

    Wenn z.B. bei LED Treibern die maximale Dimmfrequenz angegeben ist, dann zählt dieser Wert, Da es ja im Extremfall auch vorkommen kann, dass dein PWM Wert 1 ist oder 254 (d.h. 254 Takte aus und 1 Takt an, oder andersrum)
    Willst du die Zeit bis zu einem Timerüberlauf haben, (bei 8 bit PWM ist der maximale Wert dann 256)
    Zeit bis Timerüberlauf = (Prescaler * maximaler PWM Wert) / Taktfrequenz

  • Die 64 ist sein Prescaler, nicht der "kürzeste Puls"... ;)


    bei ner PWM bleibt die *Frequenz* immer gleich (egal wie lang der Puls ist), nur das Verhältnis an/aus, eben die Puls*weite* ändert sich...


    das ist also schon richtig gerechnet: der Prescaler teilt den Systemtakt durch 64, d.h. also nur alle 64 Takte wird der Zähler eins weiter gezählt. Der Zähler braucht dann 256 Schritte für einen PWM-Zyklus (also 1x von 0-255 hochzählen), daher eben Systemtakt / Prescaler / PWM-Schritte = 9.600.000 / 64 / 256 = ca. 586 Hz


    dann kommt's noch drauf an, ob phasenkorrekte PWM oder "Fast-PWM" (siehe Datenblatt) - bei phasenkorrekter PWM zählt der Zähler einmal rauf und einmal runter für einen PWM-Zyklus, also wird hier die Frequenz noch mal halbiert, wären hier dann 293 Hz ...


    k.A. nun, was Bascom da einstellt, wenn man "Config blabla ...." hinschreibt - da müsste man auf der Bascom-HP nachschauen oder Oszi hinhalten... ;)


    zum LED dimmen nimmt man normalerweise phasenkorrekte PWM, bei Fast PWM gibt es das Problem, dass die LED entweder nie ganz aus geht oder nie ganz an (Wertebereich 1-255 oder 0-254, je nach Clear up oder down) - das mit dem nie ganz an fällt jedoch gar nicht auf, den Unterschied zwischen 254 und 255 sieht kein Mensch - nur, Du hast da dann eben nicht "Dauerstrom", sondern ganz kurze "Aussetzer" bei jedem PWM-Durchlauf...


    EDIT: foo, das was Du meinst bezieht sich dann auf die erreichbare Auflösung - *da* spielt es dann eben ne Rolle, wie lang der kürzeste Puls ist - das ist wiederum abhängig von Frequenz und Auflösung, also z.B. ne PWM mit 200 Hz und 256 Schritten (8 Bit) ergibt den selben kürzesten Puls wie ne PWM mit 800 Hz und 64 Schritten (6 Bit)...


    deswegen bringt die Angabe einer max. PWM-Frequenz dafür nichts, wenn nicht die Auflösung dazu angeben ist - bei vielen KSQ-ICs (PT4115, ZXLD1360,...) ist es wiederum so, dass die KSQ je nach PWM-Frequenz unterschiedlich arbeitet (entweder gibt sie wieder PWM aus, oder sie regelt den Strom je nach Pulsweite)


    Nochmal EDIT: Und das mit der kleinsten Pulslänge ist eben auch so ein Grund, warum man schauen sollte, dass die PWM (wenn man nicht Spezialanforderungen hat wie Videotauglichkeit o.ä.) in einem vernünftigen Rahmen um die 200-500 Hz bleibt, weil's ja nix bringt, wenn man ne 10.000-Hz-PWM hat, dafür dann aber nur noch 180 Stufen statt 256, weil die HW bei den kurzen Pulsen nicht mehr mitkommt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

    2 Mal editiert, zuletzt von Pesi ()