Setz doch einfach im entsprechendem Register die passenden Bits ....
Welche das sind steht ja im Datenblatt ...
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:
Dieses Beispiel löst beim Compilieren immer einen Assigment Error für die Compare1a ind Compare1b aus.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
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
Setz doch einfach im entsprechendem Register die passenden Bits ....
Welche das sind steht ja im Datenblatt ...
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
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.
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.
Gruß ThomasCode:'============================================================ ' ' ************************************ ' *** *** ' *** 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
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
auch nicht aufwendiger herauszufinden als der entsprechende Config Befehl für den Timer ....Code:Config Pinb.0 = Output Tccr0a = &B11110001 Tccr0b = &B00000011
Für beides muss man nunmal nachschlagen ..
Im übrigen kann ich die folgende Aussage nicht verstehen:
Dafür gibt es nunmal Datenblätter, die auch noch entsprechend strukturiert sind. (schau mal auf www.atmel.com)Zitat von Marco78
Grüße,
da Hanni.
Anderes Beispiel. Ich habe ein Stromanschluss, einen Schalter, eine Lampenfassung und eine "Birne". Alles zusammen funktioniert aber nicht.Dafür gibt es nunmal Datenblätter, die auch noch entsprechend strukturiert sind. (schau mal auf www.atmel.com)
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.
Moin,Zitat von Marco78
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.
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
Um diese Frage zu beantworten müsste man wissen, was für einen Controller Du verwendest!Wozu wird hier noch Tccr0a gebraucht?
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.
Lesezeichen