Forum: Mikrocontroller und Digitale Elektronik ATMega32 PWM Problem in Bascom


von Mats M. (elektrofreak)


Lesenswert?

Hi

ich möchte gerne 3 PWM ab meinem ATMega32 haben.

Dafür habe ich folgenden Code erstellt.
1
$regfile = "m32def.dat"                                     ' specify the used micro
2
$crystal = 1000000                                          ' used crystal frequency
3
$baud = 2400                                                ' use baud rate
4
$hwstack = 32                                               ' default use 32 for the hardware stack
5
$swstack = 10                                               ' default use 10 for the SW stack
6
$framesize = 40                                             ' default use 40 for the frame space
7
8
'Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , Databits = 8
9
10
Config Pind.6 = Output
11
Config Pind.2 = Input
12
Config Pind.3 = Input
13
Config Pind.4 = Input
14
15
Led1 Alias Portd.6
16
Taster1 Alias Pind.2
17
Taster2 Alias Pind.3
18
Taster3 Alias Pind.4
19
20
Config Adc = Single , Prescaler = Auto , Reference = Avcc
21
Start Adc
22
23
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
24
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
25
26
27
Dim Motor As Integer
28
Dim Pumpe As Integer
29
Dim Luefter As Integer
30
Dim W As Integer
31
32
Motor = 255
33
Pumpe = 255
34
35
Gosub Setvalues
36
37
Waitms 1000
38
39
Do
40
41
Motor = 127
42
Pumpe = 127
43
Luefter = 127
44
45
Gosub Setvalues
46
   'W = Getadc(0 , 0)
47
48
Loop
49
50
Setvalues:
51
'Dies sind die 3 Fehlerhaften Zeilen
52
Pwm0a = Motor
53
Pwm0b = Pumpe
54
Pwm2a = Luefter
55
56
Return
57
58
End

dabei kommt/en leider folgende(r) Fehler:
1
Error : 46  Line :  61  Assignment error [PWM0A: 0  MOTOR: 3]  , in File ...
2
Error : 46  Line :  62  Assignment error [PWM0B: 0  PUMPE: 3]  , in File ...
3
Error : 46  Line :  63  Assignment error [PWM2A: 0  LUEFTER: 3]  , in File ...

Vielen Dank für Eure Hilfe ;)

von Rahul, der Trollige (Gast)


Lesenswert?

setz ein ' davor.
Oder schreib es richtig (groß!?).

von Mats M. (elektrofreak)


Lesenswert?

o.O

ganz ehrlich verstehe ich nicht was du meinst :-(


vor den Bascom-Code?

von Mats M. (elektrofreak)


Lesenswert?

Des weiteren habe ich heraus gefunden, dass wenn ich anstatt der beiden 
8bit timer den 16 bit timer nehme und noch

pwm = 10

hinzufüge in der deklatarion, dass der fehler nicht auftaucht.

von johnny.m (Gast)


Lesenswert?

Könnte es vielleicht sein (kenne mich mit den Datentypen in BASCOM nicht 
aus), dass Du versuchst, einem 8-Bit-Timer-Register einen (vermutlich 
16-Bit-) Integer-Wert zuweisen willst? Dazu würde auch passen, dass es 
mit dem 16-Bit-Timer klappt... Ich weiß nur nicht, wie in BASCOM ein 
8-Bit-Integer-Typ heißt. Aber Motor, Pumpe und Luefter sind als Integer 
deklariert...

von Mats M. (elektrofreak)


Lesenswert?

und der hammer:

jetzt hab ich das ganze wieder auf den 8 bit timer verändert und der 
fehler trifft nur noch bei einem timer auf, wie verrückt!

der code ist komplett der gleiche wie vorher, nur jetzt kommt der fehlre 
bei timer2 und nicht mehr bei timer 2 und timer 0:

Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear 
Down , Prescale = 8
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear 
Down , Prescale = 8


Pwm1a = Motor
Pwm1b = Pumpe
Pwm2a = Luefter


Edit:
ich hab alle typen ausprobiert und immer kam der Fehler..., integer, 
bit, byte....

Edit2:
Fehlalarn, habs versehentlich noch auf Timer 1 gehabt, also den post 
vergessen mit dem "verrückten" :-(

Edit3:
Aber trotzdem befürchte ich, dass timer0 kein pwm kann, habs also mal 
mit timer 1 realisiert, jetzt kommt nur noch der fehler bei timer 2

von Mats M. (elektrofreak)


Lesenswert?

Also jetzt noch mal alles kurz zum Verständnis:
Code:


'----------------------------------------------------------------------- 
------------------
'micro                    : Mega32
'----------------------------------------------------------------------- 
------------------

$regfile = "m32def.dat"                                     ' specify 
the used micro
$crystal = 1000000                                          ' used 
crystal frequency
$baud = 2400                                                ' use baud 
rate
$hwstack = 32                                               ' default 
use 32 for the hardware stack
$swstack = 10                                               ' default 
use 10 for the SW stack
$framesize = 40                                             ' default 
use 40 for the frame space

'Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 2 , 
Databits = 8

Config Pind.6 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input

Led1 Alias Portd.6
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B 
Pwm = Clear Down , Prescale = 8
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear 
Down , Prescale = 8


Dim Motor As Integer
Dim Pumpe As Integer
Dim Luefter As Integer
Dim W As Integer

Motor = 255
Pumpe = 255

Gosub Setvalues

Waitms 1000

Do

Motor = 127
Pumpe = 127
Luefter = 127

Gosub Setvalues
   'W = Getadc(0 , 0)

Loop

Setvalues:

Pwm1a = Motor
Pwm1b = Pumpe
Pwm2a = Luefter

Return

End


Ein Fehler besteht:
Error : 46  Line :  63  Assignment error [PWM2A: 0  LUEFTER: 3]  , in
File ...

Das Pwm = 8 beim Timer 1 ist von nöten, beim Timer 2 nicht.

Woran mag es liegen?

von johnny.m (Gast)


Lesenswert?

Sag mal, hast Du mein Posting überhaupt gelesen? Timer 2 ist wie Timer 0 
ein 8-Bit-Timer. Und wenn Dein Compiler beim Zuweisen eines 
Integer-Wertes auf ein 8-Bit-Register einen Zuweisungsfehler (engl. 
Assignment Error) liefert, bedeutet das, dass die Datentypen nicht 
kompatibel sind!!! Du kannst keinem 8-Bit-Register einen 16-Bit-Wert 
zuweisen. Schau bitte in Deine Compiler-Doku und suche nach einem 
8-Bit-Integer-Typ (afair hieß der "Short" oder so ähnlich, bin mir aber 
nicht sicher...). Und wenn Du dann "Dim Luefter As Integer" durch "Dim 
Luefter As Short" ersetzt, müsste es klappen...

von Mats M. (elektrofreak)


Lesenswert?

bei Bascom gibts nur:

bit
byte
integer
word
long
single
double
string * 1

was soll ich da bitteschön nehmen :-(

habe ja schon alle einmal ausprobiert.

von johnny.m (Gast)


Lesenswert?

Byte vielleicht?

von Mats M. (elektrofreak)


Lesenswert?

nein, leider auch nicht.

im fehler steht, dass der Typ "0" sein sollte, integer ist aber "3" und 
byte "2"

von johnny.m (Gast)


Lesenswert?

Wie auch immer, es ist ein Zuweisungsfehler. Da ich jetzt nicht weiß, 
wie PwmXY deklariert ist, kann ich da nichts zu sagen.

von Gast (Gast)


Lesenswert?

Studier doch mal das Hanbuch.
http://avrhelp.mcselec.com/bascom-avr.html?CONFIG_TIMER1


Oder

Dim Motor As Byte
Dim Pumpe As Byte
Dim Luefter As Byte

Gruss

von Gast (Gast)


Lesenswert?

wobei ich sehe geradae:

Dim Luefter As Byte

dürfte reichen

von Mats M. (elektrofreak)


Angehängte Dateien:

Lesenswert?

das kenne ich leider schon aus der hilfe und hat nix gebracht.

mal nen screener:

von johnny.m (Gast)


Lesenswert?

Da der Timer 2 nur eine Compare-Einheit hat, wäre es zumindest denkbar, 
dass es heißen muss "Pwm2 = Luefter". Das "a" macht da imho wenig Sinn. 
Probier es einfach aus...

von Oliver (Gast)


Lesenswert?

Ohne Bascom jetzt überhaupt zu kennen:

Bist du die sicher, daß es pwm0a und pwm2a überhaupt gibt? Das sind ja 
anscheinend Bascom-eigene Bezeichnungen für die 8-bit-compare-register 
(die im Original OCR0 und OCR2) heissen, warum also soll da ein 'a' dran 
sein?
pwm1a und pwm1b heisen im Original
"Output Compare Register 1 A" und "Output Compare Register 1 B" bzw. 
OCR1AH and OCR1AL, OCR1BH and OCR1BL, da macht das ja noch Sinn.

Such doch mal in "m32def.dat", oder wo auch immmer die 
Registerdefinitionen drinstehen.

Und wenn du das dann verstanden hast, lade dir bitte, bitte, WinAVR und 
AVR-Studio runter, und lerne ganz schnell C. Dieses unstrukturierte 
Basic-Kauderwelsch verursacht ja Augenkrebs.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Auch auf die Gefahr hin, mich jetzt komplett zu verzetteln:
Kann der Mega32 überhaupt hardwaremässig auf dem Timer0 ein
PWM machen (der Mega16 kanns definitv nicht). Oder
emuliert Bascom das wieder mal?

von Oliver (Gast)


Lesenswert?

Er kann.

Oliver

von johnny.m (Gast)


Lesenswert?

> (der Mega16 kanns definitv nicht)
Doch, der Mega16 und auch der Mega32 könnens. Die haben für alle drei 
Timer Compare-Einheiten.

von Oliver (Gast)


Lesenswert?

Nachtrag:

Warum kann es der Mega16 denn nicht? Zumindest sein Datenblatt kann 
es...

"8-bit Timer/Counter0
with PWM"

Oliver

von Karl H. (kbuchegg)


Lesenswert?

> Zumindest sein Datenblatt kann es...

Tatsächlich.
Da war ich wohl in Gedanken im Mega8 Datenblatt :-)

von HolgerK (Gast)


Lesenswert?

Hi,
ersetze :
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear
durch :
Config Timer2 = Pwm , Compare Pwm = Clear Down

und ersetze :
Pwm2a = Luefter
durch :
OCR2 = Luefter

dann sollte es gehen, Timer2 hat nur einen PWM - Kanal

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.