PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Config des Timer2 beim ATMega8 bzgl. PWM



tauruz
13.03.2006, 05:50
hi, sorry für die eventuell dumme frage aber bin absoluter neuling auf dem microcontroller-gebiet.

ich nutze bascom und habe mir ein proggi geschrieben, welches soweit im compiler auch als fehlerfrei angezeigt wird bis auf einen fehler in der config eines timer.

die codezeile lautet wie folgt:

Config Timer2 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
fehlermeldung dazu -> invalid parameters for CONFIG parameter or value ( 8 ); wenn ich da aber irgendeinen anderen wert einsetze kommt auch der selbe fehler

nach dem wiki, datenblatt etc. ist diese definition aber richtig. timer2 hat ne 8bit pwm mit einem compare register und asl ausgang pin17 (PB3).

ich habe nun ein wenig rumgedoktert und mal mit der tmer nummer rumgezaubert. undzwar habe ich noch einen timer welcher nen sekundentakt erzeugt.

dieser code lautet zur zeit:

Config Timer1 = Timer , Prescale = 256
Enable Timer1
On Timer1 Sekunden_reset
Enable Interrupts
Timer1 = 49911

bei diesem timer ist laut compiler alles ok.

nun habe ich den timer1 umbenannt zu timer0; und meine pwn von timer2 zu timer1.
dann wird mir kein fehler angezeigt! aber das ist meiner meinung nach dann doppelt flasch, denn timer1 ist der andere pwm channel der 2 compare werte benötigen würde und timer0 ist KEIN 256bit breiter counter.

und wenn ich den code simulieren will und "simulate timers" mitaktiviere spinnt alles völlig ab, das programmfenster zappelt dann dauernd nur in der isr-routine vom timer overflow rum obwohl er das nur alle 1sek tun sollte. (quarz 4mhz)

sehr seltsame phänomene wie ich finde, wäre für hilfe wirklich sehr dankbar.

Torsten_G
13.03.2006, 12:47
Wie kommst Du auf "PWM=8"?

Laut Bascom-Hilfe gibt es folgende Ausprägungen für den PWM-Parameter von Timer 2:

PWM = ON | OFF

Damit frisst es der Compiler dann auch... \:D/

Mit "Compare A Pwm" kann ich persönlich grade nichts anfangen beim Timer2, der hat nur ein Vergleichsregister (OCR2). Allerdings meckert der Compiler auch nicht.

Wo soll der Unterschied zum normalerweise vorgesehenen "Compare PWM" sein?

Viele Grüße

Torsten

ASIC
13.03.2006, 12:52
Hallo,

dies steht im Hilfemenü für Timer2, anscheinend must DU PWM erstmal ON|OFF schalten!?

Gruß
Asic

Action
Configure TIMER2.


Syntax for the 8535
CONFIG TIMER2 = TIMER | PWM , ASYNC=ON |OFF,
PRESCALE = 1 | 8 | 32 | 64 | 128 | 256 | 1024 ,
COMPARE = CLEAR | SET | TOGGLE I DISCONNECT ,
PWM = ON | OFF ,
COMPARE PWM = CLEAR UP| CLEAR DOWN | DISCONNECT ,
CLEAR TIMER = 1|0

Syntax for the M103
CONFIG TIMER2 = COUNTER| TIMER | PWM ,
EDGE= FALLING |RISING,

PRESCALE = 1 | 8 | 64 | 256 | 1024 ,
COMPARE = CLEAR | SET | TOGGLE I DISCONNECT ,
PWM = ON | OFF ,
COMPARE PWM = CLEAR UP| CLEAR DOWN | DISCONNECT ,
CLEAR TIMER = 1|0

tauruz
13.03.2006, 14:34
also das "compare pwm" habe ich aus der hilfe gehabt.
vorher hatte ich "compare 1A" dort stehn. das pwm=8 kam aus der bascom hilfe hier im forum, siehe link

https://www.roboternetz.de/wissen/index.php/Bascom_und_PWM#Grundprogramm

mit "= On" meckert er nun zumindest nicht mehr, aber wie groß ist nun die bitbreite in der er auflöst? muss meine tastfrequenz ja anteilig berechnen?!

sorry, würde es ja auch einfach mal in real testen wollen aber mein avr usw. sind/ist noch nicht da...

gruß - tauruz

Torsten_G
13.03.2006, 19:15
Na komm, die Bascom-Hilfe ist in diesem Punkt doch leicht verständlich und auch eindeutig:

"The TIMER2 is an 8 bit counter."

Also, Timer2 hat ohnehin nur 8 Bit, daher gibt´s diese Einstellung auch nicht.
Ocr2 akzeptiert somit Werte von 0...255, und das ist auch die Auflösung.

Die Beispiele im Forum beziehen sich auf Timer1, der hat 16 Bit und zwei Compare-Register. Das ist schon ein leichter Unterschied...

Viele Grüße

Torsten

tauruz
13.03.2006, 19:51
was meinst du denn nun immer mit ocr2 ?
ich habe bisher nur die definition "compare1A = X" gefunden, diese besagt das tastverhältnis in X teile von 256 pro "periode".
und dann brauch ich ja noch nen teiler irgendwo um dem kollegen pwm zu sagen, in welcher frequenz in teil der taktfrequenz des avr er takten soll.

wenn wir also die folgende definition des timers zugrunde legen täten

CONFIG TIMER2 = TIMER | PWM , ASYNC=ON |OFF,
PRESCALE = 1 | 8 | 32 | 64 | 128 | 256 | 1024 ,
COMPARE = CLEAR | SET | TOGGLE I DISCONNECT ,
PWM = ON | OFF ,
COMPARE PWM = CLEAR UP| CLEAR DOWN | DISCONNECT ,
CLEAR TIMER = 1|0

und mein atmel läuft auf 4mhz. ich benötige eine periodenlänge von 20ms also 50hz pwm takt.

das täte doch nun heissen ich müsse eigentlich alles in die tonne treten?! ;)
komme ja niemals auf 50hz... ich glaub denn mach ichs doch mit waittimes im proggi. ist net schlimm da die pwm eh nur in einem unterprogramm selten zum einsatz kommt.

Torsten_G
14.03.2006, 00:18
Hat was zu tun mit Hardware-PWM, die Du in Deinem Beispiel ja nutzen möchtest.

OCR2 ist das (O)utput (C)ompare (R)egister des Timer2. Der zugehörige Pin (meist OC2) schaltet, wenn der Timer den Wert von OCR2 schneidet.

Tipp mal OCR2 in die Bascom-Hilfe, und dann sag konkret, wo noch was unklar ist.

Eigentlich musst Du Dir nur mal den Artikel verinnerlichen, aus dem Du den Codeschnipsel mit dem Timer1 gemopst hast, da steht alles Wissenswerte haarklein beschrieben!

Schau Dir mal die Diagramme oberhalb des Codes an.

Viele Grüße

Torsten

tauruz
14.03.2006, 14:31
jo habe es inzwischen verstanden, danke. mache es aber nun aus bestimmten akustischen gründen per software-pwm :D

müsste nun noch einen festen text um eine variable erweitern also sowas wie "ServoX = 1" wobei der Text "Servo" fest ist und das X eben eine sich ständig verändernde variable darstellt. ( "= 1" ist eben auch fest).
gibts da eine funktion welche eben an irgendwas, sei es variable oder auch wie bei mir fester test direkt eine variable anhängt? add var oder sowat??

Torsten_G
14.03.2006, 23:15
Schau Dir mal an, wie man Arrays deklariert.

Dann kannst Du z. B. Variable(n)=1 zuweisen, wobei n auch variabel ist.

Den Variablennamen "Servo" solltest Du aber lieber vermeiden, das ist ein reservierter Name in Bascom...

Grüße

Torsten

tauruz
15.03.2006, 00:36
servo nicht? hm ok... zur zeit habe ich ja Servo1, Servo2 usw. damit gibbet scheinbar keine probleme.
aber servo steht auch nicht in der reserved words list

Torsten_G
15.03.2006, 12:59
-> Bascom-Hilfe!



...
When you use for example :

Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

The internal ISR will execute every 10 uS.

An arrays named SERVO() will be created and it can hold 2 bytes : servo(1) and servo(2).
...


"Servo" ist eine festgelegte Bascom-Funktion!

tauruz
15.03.2006, 20:28
ja ok ich könnte es ja ändern, aber in der sim funzt ja alles von

in der hilfe habe ich net direkt gesucht sondern eben nur de reserved words list gecheckt da stand servo oder so nicht drin.