mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega32 PWM Problem in Bascom


Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Dafür habe ich folgenden Code erstellt.
$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 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


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:
'Dies sind die 3 Fehlerhaften Zeilen
Pwm0a = Motor
Pwm0b = Pumpe
Pwm2a = Luefter

Return

End

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

Vielen Dank für Eure Hilfe ;)

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
setz ein ' davor.
Oder schreib es richtig (groß!?).

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
o.O

ganz ehrlich verstehe ich nicht was du meinst :-(


vor den Bascom-Code?

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Byte vielleicht?

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, leider auch nicht.

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wobei ich sehe geradae:

Dim Luefter As Byte

dürfte reichen

Autor: Mats Marcus (elektrofreak)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das kenne ich leider schon aus der hilfe und hat nix gebracht.

mal nen screener:

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er kann.

Oliver

Autor: johnny.m (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

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

"8-bit Timer/Counter0
with PWM"

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Zumindest sein Datenblatt kann es...

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

Autor: HolgerK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.