ATMega32 PWM Problem in Bascom

#489514
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 ;)
Gast #489560
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...
#489561
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
#489585
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?
Gast #489597
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...
Gast #489653
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
Gast #925501
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren