PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega88 6x PWM konfigurieren?



TobiasBlome
20.06.2009, 10:27
Hallo,

ich benötige 4 PWM Kanäle und habe den Mega 88 (aber wenn ich schon frage möchte ich natürlich alle 6 Kanäle wissen ;-))

Datenblatt:
PIN PWM

5 OC2B
11 OC0B
12 OC0A
15 OC1A
16 OC1B
17 OC2A

so, nun das Programm: bei Timer2 sagt Bascom "Invalid Parameter..."

Wer kann mir sagen was ich da eintragen muss?

Vielen Dank, Tobias

PS. hab schon einige Kombinationen durch:

Compare A
Compare PWM
Compare OCR2A
Compare OC2A



...
'Timer1 = 16 Bit = Spiegelmotore
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 256


'Timer2 = 8 Bit = Laser2
Config Timer0 = Pwm , Pwm = 8 , Compare Ocr2a Pwm = Clear Up , Compare Ocr2b Pwm = Clear Up , Prescale = 256
Enable Interrupts

...

Do
Compare1a = Motor1
Compare1b = Motor2
Ocr2a = Motor3
Ocr2b = Motor4

LOOP

stefan_Z
20.06.2009, 14:21
Schau mal in der "m88def.dat" nach, oder im "Register Summary" im Datenblatt... Da stehen meist die Registernamen

TobiasBlome
20.06.2009, 14:44
Hallo,
in der "m88def.dat" habe ich nichts gefunden...

Im Datenblatt unter "Register Summary" sieht es nicht viel besser aus:
Mir ist aufgefallen, dass ich im Datenblat nur Timer1 & Timer0 gefunden habe... Im Datenblatt steht aber auch, dass der MEGA88 6PWM Kanäle hat!

Register Summary:
(0x8B) OCR1BH Timer/Counter1 - Output Compare Register B High Byte 135
(0x8A) OCR1BL Timer/Counter1 - Output Compare Register B Low Byte 135
(0x89) OCR1AH Timer/Counter1 - Output Compare Register A High Byte 135
(0x88) OCR1AL Timer/Counter1 - Output Compare Register A Low Byte 135

(0x85) TCNT1H Timer/Counter1 - Counter Register High Byte 135
(0x84) TCNT1L Timer/Counter1 - Counter Register Low Byte 135

0x28 (0x48) OCR0B Timer/Counter0 Output Compare Register B
0x27 (0x47) OCR0A Timer/Counter0 Output Compare Register A

Kann jemand etwas damit anfangen?

Tobias

stefan_Z
23.06.2009, 00:39
Ich hab nochmal geschaut...
http://www.ledhilfe.de/viewtopic.php?f=31&t=2639&start=0
Laut dieser Seite hier soll es mit folgenden Namen gehen:
Red_pwm1 Alias Ocr0a
Red_pwm2 Alias Ocr0b
Green_pwm1 Alias Ocr1al
Green_pwm2 Alias Ocr1bl
Blue_pwm1 Alias Ocr2a
Blue_pwm2 Alias Ocr2b

OC1 hat 16bit, daher wird das "L" - LOW-Register genutzt.
Die Timer-Einstellungen macht der Kollege allerdings "zu Fuß" - kann ja sein, dass Bascom da nen Bug hat.
Würde sagen du baust es 1:1 ein und ersetzt es dann mal durch passende Einstellungen in Bascom - und sagst uns was passiert ;-)

TobiasBlome
23.06.2009, 17:37
soooooooooo - fertig er funktioniert JUUhUUUUUUUUUUUUUUU

@stefan_Z:
\:D/
DANKEE!!!
der Link war sehr gut!!!!!


Timer konfigurieren:
man kann es einzelnd machen wie im Link oder viel kürzer so:


'Timer0 = 8 Bit
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256

'Timer1 = 16 Bit
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256

'Timer2 = 8 Bit
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256

Enable Interrupts

bei den 8Bit Timern - hier Timer0 & Timer1 darf man NUR EINMAL GENERELL "Compare Pwm" angeben!!!! Damit konfiguriert man beide PWM-Kanäle!

und so wird´s im aufgerufen:


Ocr0a = Test1 'Timer0
Ocr0b = Test2 'Timer0

Ocr1al = Motor1 'Timer1
Ocr1bl = Motor2 'Timer1

Ocr2a = Laser_rot 'Timer2
Ocr2b = Laser_gruen 'Timer2



Man kan bei Timer1 auch:

Compare1a = Motor1
Compare1b = Motor2

nutzen - ABER das benötigt MEHR SPEICHER - keine Ahnung warum....


Frage:

Motor1 Alias Ocr0a

als was wird "Motor1" deklariert? also Byte? Word?...

in meinem bestimmten Fall benötige ich:
Dim Motor1 As Word
und mit ALIAS funktioniert es bei mir nicht richtig, weil ich einen String in die Variable Motor1 kopiere:

Motor1 = Val(wert)


Tobias

stefan_Z
23.06.2009, 18:57
als was wird "Motor1" deklariert? also Byte? Word?...
Als das, was die Original-Variable auch darstellt. In dem Fall ein Byte, da der AVR nur Byte-Register kennt.

TobiasBlome
23.06.2009, 19:07
ach so - danke.

ACHTUNG: wichtiger Nachtrag zu Timer1:
ich hatte geschrieben, das man wahlweise

Ocr1al = Motor1
Ocr1bl = Motor2

Compare1a = Motor1
Compare1b = Motor2

schreiben kann! Das ist so wohl nicht ganz richtig, wie ich festgestellt habe:

Die folgende Deklaration benötigt weniger Speicher, bekommt aber bei 10 Bit starke Probleme:
Ocr1al = Motor1
Ocr1bl = Motor2

Die folgende Deklaration benötigt mehr Speicher, läuft aber auch noch mit 10 Bit:
Compare1a = Motor1
Compare1b = Motor2


Kann mir einer sagen wo der Unterschied ist und warum es so ist?

Tobias

stefan_Z
23.06.2009, 19:11
OCR1AL ist nur das LOW-Byte vom Register - COMPARE1A sind die vollen 16-Bit

Kann man im Simulator auch schön beobachten!

TobiasBlome
23.06.2009, 19:51
aha - vielen Dank.

irgendwie habe ich da einen Feler....
ich habe alles mit dem Timer1 ausprobiert - also Hardwaremäßig.

Aber Timer0 und Timer2 funktionieren nicht...


'Konfiguration µC:
$regfile = "m88def.dat" 'AT-Mega88
$crystal = 20000000 'Quarz: 14,7456 MHz - Quarz auf Platine
$baud = 9600 'RS232 Baudrate definieren


'-------------------------------------------------------------------------------
'Ein- Ausgänge:


'Ddrb = &B1111111 '1 Ausgang, 0 Eingang = Pin PB7-0
'Ddrc = &B1111111 '1 Ausgang, 0 Eingang = Pin PC7-0
'Ddrd = &B1111111 '1 Ausgang, 0 Eingang = Pin PD7-0


'Portb = &B0000000 '1 = Pullup
'Portc = &B0000000 '1 = Pullup
'Portd = &B0000000 '1 = Pullup

'-------------------------------------------------------------------------------
'Timer:
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256


'Timer1 = 16 Bit = Spiegelmotore
'Clear Down => 0 = 0 PWM / 1023 = max PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256


'Timer2 = 8 Bit = Laser2
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 256


Enable Interrupts




Do



Ocr0a = 125 'Test1
Ocr0b = 125 'Test2

Compare1a = 125
Compare1b = 125

Ocr2a = 125 'Laser_rot
Ocr2b = 125 'Laser_gruen

Loop

TobiasBlome
23.06.2009, 19:54
aha - vielen Dank.

irgendwie habe ich da einen Feler....
ich habe alles mit dem Timer1 ausprobiert - also Hardwaremäßig.

Aber Timer0 und Timer2 funktionieren nicht...


'Konfiguration µC:
$regfile = "m88def.dat" 'AT-Mega88
$crystal = 20000000 'Quarz: 14,7456 MHz - Quarz auf Platine
$baud = 9600 'RS232 Baudrate definieren


'-------------------------------------------------------------------------------
'Ein- Ausgänge:


'Ddrb = &B1111111 '1 Ausgang, 0 Eingang = Pin PB7-0
'Ddrc = &B1111111 '1 Ausgang, 0 Eingang = Pin PC7-0
'Ddrd = &B1111111 '1 Ausgang, 0 Eingang = Pin PD7-0


'Portb = &B0000000 '1 = Pullup
'Portc = &B0000000 '1 = Pullup
'Portd = &B0000000 '1 = Pullup

'-------------------------------------------------------------------------------
'Timer:
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256


'Timer1 = 16 Bit = Spiegelmotore
'Clear Down => 0 = 0 PWM / 1023 = max PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256


'Timer2 = 8 Bit = Laser2
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 256


Enable Interrupts




Do



Ocr0a = 125 'Test1
Ocr0b = 125 'Test2

Compare1a = 125
Compare1b = 125

Ocr2a = 125 'Laser_rot
Ocr2b = 125 'Laser_gruen

Loop

TobiasBlome
24.06.2009, 15:19
Also anscheined geht es wirklich nur, wenn man es alles einzelnd hinschreibt...(der original Code vom Link funktioniert...)

wo kann ich den Timer1 auf 10Bit umstellen?



' Timer/Counter 1 initialization
' Clock source: System Clock
Tccr1a = &HF1' Clock value: 125.000 kHz -> PWM-Freq ca. 245Hz
Tccr1b = &H03' Mode: Ph. correct PWM top=00FFh
Tcnt1h = &H00' OC1A output: Inverted
Tcnt1l = &H00' OC1B output: Inverted
Icr1h = &H00' Noise Canceler: Off
Icr1l = &H00' Input Capture on Falling Edge
Ocr1ah = &H00' Timer 1 Overflow Interrupt: Off
Ocr1al = &H00' Input Capture Interrupt: Off
Ocr1bh = &H00' Compare A Match Interrupt: Off
Ocr1bl = &H00' Compare B Match Interrupt: Off


wenn ich bei Timer1 die Kurzversion benutze gehts nur mit 8Bit wenn ich
Ocr1al = 125
Ocr1bl = 125

nutze.

mit Compare1a = 250 / Compare1b = 250 geht es nicht mehr


Tobias