Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer
Hallo!
Ich möchte an zwei verschiedenen Pin´s jeweils ein PWM-Signal erzeugen.
Nur in meinem Buch wird die nur am Beispiel vom PIN 15 (PB1) gemacht.
Nun möchte ich aber auch mit PB2 arbeiten und habe keine Ahnung wie ich das Configurieren soll.
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output
Config Portb.2 = Output
Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down
Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare B Pwm = Clear Down
Do
Compare1a = 50
Compare1b = 100
Loop
End
B.z.w. wie kann ich den Pin PB2 als Frequenzgeber Configurieren?
Sauerbruch
20.08.2011, 01:35
Ich hab mir den Code mal im Simulator angeschaut. Die zweite "Config Timer"-Zeile scheint zur Folge zu haben , dass die Einstellungen aus der ersten Zeile überschrieben werden. Wenn Du es in einen einzigen Config-Befehl packst, müssten beide PWM-Pins (OC1A und OC1B) funktionieren:
Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down, Compare B Pwm = Clear Down
Hallo!
Ja das müsste stimmen, bin dann beim googeln später auch darauf gestoßen.
So, nun wollte ich einen PIN für PWM und einen zur Frequenzausgabe (Schrittmotortakt), das mit der Frequenz ist schwieriger.
Da PWM nur mit Timer1 geht musste ich Timer0 nehmen -> der hat aber nur 8Bit, da ist die geringste Frequenz 4000Hz.
Das Ganze habe ich so gelöst.
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output
Config Portb.2 = Output
Mot Alias Portb.2
Dim N As Word
Dim Dreh As Word
Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down
Config Timer0 = Timer , Prescale = 8
On Timer0 Inter
Enable Timer0
Enable Interrupts
Do
Dreh = 150
Compare1a = Dreh
Loop
End
Inter:
Timer0 = Dreh
Incr N
If N > 60 Then
Mot = 1
Else
Mot = 0
End If
If N = 120 Then
N = 0
End If
Return
Ich musste im Interrupt eine Art Zählerschleife mit Übertrag einbauen.
Mir ist dieser Lösungsweg etwas unbequem und frisst viel Ressourcen.
Kann man das nicht eleganter lösen???
Vielen Dank!
Wenn du nur einen 16-Bit Timer hast und der Rest ist 8-Bit und un eine recht langsame Frequenz brauchst wirst du nicht drum herum kommen den Timer per Software zu erweitern. Die andere Möglichkeit ist, dass du nen anderen Controller nimmst mit mehr 16-Bit Timer.
Sauerbruch
20.08.2011, 11:56
Da PWM nur mit Timer1 geht
Das ist nicht ganz korrekt - Timer2 im Mega8 kann auch PWM. Der hat zwar nur einen einzigen Ausgang (B.3 = OC2), aber Du verwendest ja in Deinem jetzigen Code auch nur einen Compare-Wert.
...musste ich Timer0 nehmen -> der hat aber nur 8Bit, da ist die geringste Frequenz 4000Hz.
Auch da kann geholfen werden: Wenn Du Timer 0 mit dem maximal möglichen Prescaler von 1024 betreibst, hast Du eine minmale Interrupt-Frequenz von 16.000.000 Hz / (1024 * 256) = ca. 61 Hz.
Mir ist aber noch etwas aufgefallen: Die Frequenz Deines PWM-Signales liegt bei 8-bit-PWM und 16 MHz Taktfrequenz bei etwas über 30 kHz - ist das denn nicht ein wenig hoch? Ich muss allerdings zugeben, bislang noch so gut wie nie etwas mit Schrittmotoren zu tun gehabt zu haben (eher mit fetten 2kW-Anlassermaschinen, die sich aber mit PWM auch hervorragend zähmen lassen ;) )
Hallo!
Ich möchte am tiny85 am PortB.4 ein PWM Signal erzeugen, aber Bascom meckert.
$regfile = "attiny85.dat"
$crystal = 1000000
Config Portb.4 = Output
Led Alias Portb.4
'PWM
Config Timer1 = Pwm , Prescale = 8 , Compare B Pwm = Clear Down
Do
Compare1b = 30
Loop
End
Bascom mecker in der Zeile mit "Compare1b = 30".
Kann mir einer helfen und zeigen was falsch ist und wie es richtig aussehen muss.
Danke!
Guck mal vielleicht hilft dir das weiter:
http://bascom-forum.de/showthread.php?3009-Attiny-85-und-PWM/page2
Das scheint wohl ein generelles Problem mit Bascom zu sein, dass man OC1B nicht nutzen kann......da hilft anscheinend nur ein Workaround
Das Problem ist das ich im Program noch eine ADC Anwendung einbauen muss und das dumme an ADC ist das die Funktion 20ms beansprucht.
Wenn ich nun über Software PWM erzeuge hat das Signal immer eine lücke von 20ms
Searcher
07.09.2011, 17:50
Hallo,
statt Compare1b versuche mal OCR1B. Dann sollte zumindest der Compiler nicht mehr meckern.
Gruß
Searcher
Sauerbruch
07.09.2011, 18:01
Wollt´ ich auch grade schreiben :-)
Ich hab mir das mal im Simulator angeschaut: Die 30 wird zwar anstandslos ins OCR1B-Register übernommen, aber der Rest des Codes scheint am Timer-Kontrollregister TCCR1 etwas vorbeizugehen - es enthält nämlich exakt &B00000000.
Du müsstet Dir also die Mühe machen aus dem Datenblatt zu entnehmen, wie dieses Register für Deine Anwendung aussehen muss, und es dann direkt beschreiben. Das kostet zwar etwas Zeit, lohnt sich aber...
auweier, von den registerkram hab ich nicht so die ahnung
Ocr1b = 30 hab ich eingefügt nun meckert er in der Zeile mit Config Timer1 rum.
Erro:86 Line:19 Invalid parameter for CONFIG parameter or value [8] ,in File...
Searcher
07.09.2011, 18:28
Ja, mit dem Konfigurieren des Timers hatte ich auch schon mal gekämpft. Für PWM mit dem OCR1B muß das Bit PWM1B in GTCCR gesetzt werden. Dann nimmt der Timer aber noch das OCR1C Register als Top Wert her. Das muß dann auch noch gesetzt werden.
Also nach dem CONFIG Komando noch:
set gtccr.pwm1b
ocr1c = 255 (z.B.)
Hier habe ich Timer1 auf ATtiny45 mit PWM1A und PWM1B direkt über Register konfiguriert. https://www.roboternetz.de/community/entries/50-TT-als-Linienfolger
Außer dem größeren Speicher ist der ATtiny85 gleich.
Ocr1b = 30 hab ich eingefügt nun meckert er in der Zeile mit Config Timer1 rum
Falls er noch irgendwo meckert - gleich den Code mitgeben.
Gruß
Searcher
ich hab da Ocr1b = 30 eingefügt nun steht aber da
Erro:86 Line:19 Invalid parameter for CONFIG parameter or value [8] ,in File...
Searcher
07.09.2011, 18:32
Huch, hatte geantwortet, bevor Du geschrieben hattest :-), Schau mal vorletztes Posting
ja richtig, ich dachte meine antwort wurde nicht abgeschickt. jetzt muss ich erst mal dein quellcode verstehen
wow vielen dank, du hast mir sehr geholfen, es geht.
$regfile = "attiny85.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 16
$framesize = 40
Config Portb.4 = Output
Config Portb.3 = Input
Led Alias Portb.4
Gtccr = Gtccr Or &B01100000 'set PWM1B & OC1B (PB4) clear TCNT1 on OCR1C match
Ocr1b = 0 'initialise OCR1B -> low, no pulses at OC1B
Tccr1 = Tccr1 Or &B00000011 'Einschalten TIMER1 - prescaler = 4
Do
Ocr1b = 30
Loop
End
es geht wie auch immer aber ich kann jetzt weiter machen. DankeO:)
Searcher
08.09.2011, 08:30
Hallo,
Super. Ich hab mich gefragt, warum das in Deinem Code auch ohne Setzten des OCR1C Registers funktioniert und nochmal in das Datenblatt geschaut. Das OCR1C ist eines der wenigen Register, die schon bei RESET mit &HFF initialisiert sind. Die meisten Register werden ja mit &H00 belegt. Hatte ich bisher übersehen. Also auch Dir Dank für die Info!
Gruß
Searcher
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.