PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer



Skynet
19.08.2011, 23:21
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

Skynet
20.08.2011, 08:41
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!

Kampi
20.08.2011, 09:52
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 ;) )

Skynet
07.09.2011, 16:27
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!

Kampi
07.09.2011, 16:54
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

Skynet
07.09.2011, 17:39
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...

Skynet
07.09.2011, 18:21
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

Skynet
07.09.2011, 18:28
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

Skynet
07.09.2011, 18:38
ja richtig, ich dachte meine antwort wurde nicht abgeschickt. jetzt muss ich erst mal dein quellcode verstehen

Skynet
07.09.2011, 19:15
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