- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Atmel ATtiny 13: Hardware PWM in Bascom

  1. #1

    Atmel ATtiny 13: Hardware PWM in Bascom

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,

    bin in Sachen µC noch ein Anfänger und habe mir zum Spielen ein Paar Tinys besorgt. Jetzt wollte ich mal PWM ausprobieren und habe aus dem Artikelbereich folgendes Beispiel gefunden:

    Code:
    ' Hardware PWM mit Timer1
    
    $regfile = "ATtiny13.dat"
    $crystal = 4800000
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    
    Do
     Compare1a = 205
     Compare1b = 51
    Loop
    
    End
    Dieses Beispiel löst beim Compilieren immer einen Assigment Error für die Compare1a ind Compare1b aus.
    Beim blättern im Datenblatt habe ich gelesen das der Timer0 für PWM sein soll. Config Timer0 = Pwm führt zum Fehler Invalid parameter for Config parameter or value.
    Dann habe ich in die ATtiny13.Dat gesehen und die Compare befehle nicht gefunden, nur OC0a. Wenn ich dieses Register statt dem Compare Befehl verwende erhalte ich wieder den Assignment fehler.

    Wer weiß Rat?

    Gruß Thomas

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Setz doch einfach im entsprechendem Register die passenden Bits ....
    Welche das sind steht ja im Datenblatt ...

  3. #3
    Hallo Hanni,

    werde mich nachher nochmal mit dem Datenblatt auseinander setzen, aber als ich es gestern in der Hand hatte, habe ich nicht durchgeblickt.
    Im zusammenhang mit PWM wurden so viele verschiedene Register gennannt sodaß ich nicht wirklich schlau wurde, welche ich nehmen muß.

    Gruß El-man

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Bascom, Tiny's und Timer1...
    Irgendwie klappt das nie

    Die Hilfe, die Register "von Hand" zu programmieren ist schon ein Schritt in die richtige Richtung, aber ohne100%ig zu wissen, welche Register es alle sind und was genau reingeschrieben werden muss bringt das nichts.

    Schade, eigentlich wollte ich dir als erstes den Tipp mit OC1a und OC1b geben, aber geht ja auch nicht.

    Ich habe das gleiche Problem mit nem Tiny26 und Timer1 in Bascom. Den will ich zwar als Timer benutzen und nicht für PWM, aber das Grundproblem ist ja das gleiche.

    Mit Timer0 läuft der Timer, aber mit Timer1 und den normalen Statements bekomme ich auch diesen Fehler.

    Nun weiss ich nicht, ob du für PWM auch Enable Timer1 und Enable Interrupts schreinen musst und evtl noch Timer1 starten musst. Davon habe ich bei dir im Code jetzt garnichts gelesen.
    Aber da meckert Bascom bei mir wenn ich es einfüge.

    Hier im Forum habe ich aber gelesen, das du den Prescaler per Register setzen musst.
    Also die Zeile Config so lassen wie sie ist, das Prescal löchen und Register extra beschreiben.

    Müsst irgendetwas mit TCCR sein. Musst mal im Datenblatt schauen, ob da dann eine Tabelle ist und was von Vorteilern steht.

    Bei mir geht es aber nicht. Mag ja aber beim PWM anders sein.

  5. #5
    So, nun klappt es so wie ich mir es vorgestellt habe
    Aber mit dem µC ist es bei jedem Test das gleiche:
    Jegliches Ausprobieren klappt nicht bis zur totalen Verzweifelung, dann einen Tag Pause neu überlegen, testen, klappt nicht, Datenblatt lesen, testen und dann Erfolg!! (Juchu)

    Hier mein Programm um eine LED an Portb.0 runter und wieder rauf zu dimmen.
    Code:
    '============================================================
    '
    ' ************************************
    ' ***                              ***
    ' *** Hardware PWM 06.07.2006      ***
    ' ***                              ***
    ' ************************************
    '
    ' µC: ATtiny13
    ' Hardware Pwm auf Portb.0
    ' Fusebit DCBA 1001 (4,8 MHz)
    '
    '
    '
    '============================================================
    '
    $regfile = "ATtiny13.DAT"
    $crystal = 4800000
    Config Pinb.0 = Output
    Tccr0a = &B11110001
    Tccr0b = &B00000011
    Dim I As Byte
    Do
    
    For I = 1 To 255
    Ocr0a = I
    Waitms 5
    Next I
    For I = 255 To 1 Step -1
    Ocr0a = I
    Waitms 5
    Next I
    Loop
    
    End
    Gruß Thomas

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Tja, Datenblatt lesen hat nunmal den Vorteil hinter sie "Bascom Kulissen" zu schauen ... und ich finde es ist nicht der schlechteste.

    Defakto sind die 3 Zeilen
    Code:
    Config Pinb.0 = Output
    Tccr0a = &B11110001
    Tccr0b = &B00000011
    auch nicht aufwendiger herauszufinden als der entsprechende Config Befehl für den Timer ....
    Für beides muss man nunmal nachschlagen ..

    Im übrigen kann ich die folgende Aussage nicht verstehen:

    Zitat Zitat von Marco78
    Bascom, Tiny's und Timer1...
    Irgendwie klappt das nie

    Die Hilfe, die Register "von Hand" zu programmieren ist schon ein Schritt in die richtige Richtung, aber ohne100%ig zu wissen, welche Register es alle sind und was genau reingeschrieben werden muss bringt das nichts.
    Dafür gibt es nunmal Datenblätter, die auch noch entsprechend strukturiert sind. (schau mal auf www.atmel.com)


    Grüße,

    da Hanni.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Dafür gibt es nunmal Datenblätter, die auch noch entsprechend strukturiert sind. (schau mal auf www.atmel.com)
    Anderes Beispiel. Ich habe ein Stromanschluss, einen Schalter, eine Lampenfassung und eine "Birne". Alles zusammen funktioniert aber nicht.
    Warum?
    Kein Strom? Sicherung raus? Schalter evtl aus?
    Wenn ich mir sicher sein kann, das die Glühlampe heile ist, kann ich den Fehler woanders.

    Ohne zu wissen, warum die als funktionierenden Bascombefehle doch nicht funktionieren kann ich schlecht einen Fehler suchen.

    Ich stell uns Bascomuser mal als blöd dar.
    Wir können leider nur die einfachste Sprache verstehen. Wenn wir mehr könnten, würden wir in ASM oder C programmieren. Was bringt uns denn ein Datenblatt mit Begriffen, mit denen wir nichts anfangen können.

    Und du musst zugeben, das die Register, besonders für Timer1 anspruchsvoller sind als für Timer0 oder DDR für Ports!

    https://www.roboternetz.de/phpBB2/ze...=tiny26+timer1

    Datenblätter habe ich für alle AVRs, die ich hier rumliegen habe. Ich habe auch schon in viele reingeschaut. Ich kann im Prinzip auch mit ihnen umgehen. Ich bin nicht zu faul zu suchen oder mal verschiedenes auszuprobieren.
    Aber wenn es doch so einfach ist, bitte ich dich um Hilfe für mein Problem.

    PS: Ich habe auch noch mehr probiert, als das was ich da im Beitrag geschrieben habe, ich sah nur keinen Sinn, jeden Schritt aufzuführen.

    Ich kann dir sagen, welche Register betroffen sind, und welches Bit für was ist. Aber das setzen der Bit in einer (bzw mehrerer) logischen Kombination brachte nichts.

    Ich will jetzt auch nicht besserwisserisch klingen. Mag sein das es so rüber kommt.
    Aber wenn du eine Lösung kennst, mehne ich die gerne an und probiere sie aus.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von Marco78
    Ich will jetzt auch nicht besserwisserisch klingen. Mag sein das es so rüber kommt.
    Aber wenn du eine Lösung kennst, mehne ich die gerne an und probiere sie aus.
    Moin,

    schau mal in den betreffenden Tread ... ich hab da mal eine Möglichkeit in Assembler gepostet (Timerinit). Testen konnte ich es übrigens nur mitm AVR Studio im Simulator ... für den Rest fehlen mir im Moment die Möglichkeiten.

    Im übrigen ist das Tiny26 Datenblatt eher eins der schlechteren ....

    Grüße,
    da Hanni.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    04.11.2007
    Beiträge
    96
    Hallo,
    auch wenn der Thread schon etwas älter ist, würde ich mich freuen, falls jemand noch auf meine Frage eingehen könnte.
    Ich denke verstanden zu haben, dass Ocr0a die Pulsweite bestimmt.
    Wie kann ich denn die Frequenz der PWM festlegen?
    Hier http://www.mmi.rwth-aachen.de/wiki/m...&printable=yes steht, Tccr0b = &B00000011 bedeutet, dass der Prescaler 64 angewandt wird. Damit wird wohl die Taktfrequenz von 4800000 durch 64 geteilt. Würde ja 75 kHz ergeben. Stimmt das so? Wozu wird hier noch Tccr0a gebraucht?
    Könnte mir bitte jemand erklären, woraus sich die Frequenz berechnet und wie ich z.B. eine 100 kHz PWM erzeugen kann?



    Grüße tob

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wozu wird hier noch Tccr0a gebraucht?
    Um diese Frage zu beantworten müsste man wissen, was für einen Controller Du verwendest!

    Im PWM-Modus zählt der Timer ja rauf und runter, d.h. bei einem 8-bit-Timer kommt nach 255 nicht 0, sondern er zählt 253...254...255...254...253 usw.
    Jedes mal, wenn er am Wert des OCR-Registers "vorbeikommt", wird der dazugehörige OC-Pin getoggelt. Entweder wird er beim aufwärtszählen gesetzt und beim abwärtszählen resettet, oder umgekehrt - das kannst Du in der PWM-Konfiguration festlegen.

    Für eine komplette PWM-Phase muss der Zähler also einmal komplett rauf und runtergezählt haben. Die Frequenz ergibt sich damit aus

    Clock / (Prescaler * (2^(Bitbreite+1))).

    Mit einem 4,8MHz-Quarz, einem 8-bit-Timer und einem Prescale von 64 wäre die PWM-Frequenz also 4800000 / (64 * (2^9)) = 4800000/(64*512), also etwa 146 Hz.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests