PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16 Bit



Robo-Hero
07.01.2007, 12:48
Hat jemand ein Beispiel wie ich in Bascom eine 16it PWM Signal an einem ATMega 32 erzeuge. Ich hatte schon gesucht aber nur in C++ gefunden. Ich aknn dain programmieren, aber irgendwie funktioniert die Konvertierung nicht in Hexa.

Vitis
08.01.2007, 00:22
äh, was hat die Erzeugung einer PWM von 16 Bit Teilung mit Hex zu tun?
versteh die Frage nicht.
Für PWM--Konfiguration des Timers nimmste einfach config timer1=pwm etc. etc.
aber mit Hex hat das nix zu tun.
Wenn du daten im Hexforat per UART verschicken willst geht das
über print hex(Variable);

RamJam
08.01.2007, 19:30
Hier ein kleines Beispiel für den ATMega32 in BascomAVR für 2 x PWM durch Timer1 gesteuert und an Den Pin's 19 (OC1A) und Pin 18 (OC1B) ( bei
einem ATMega im DIP Gehäuse.
Alles weitere hast du nicht mitgeteilt, Puls/-Pausenverhälnis, Frequenz etc.

Durch veränderen der Variablen A,B änderst du das Puls/-Pausenverhältnis.
Die Frequenz änderst du mitunter dadurch, dass du den Prescale-Wert änderst,
siehe Datenblatt ,( durch die Vorgaben durch Bascom bei der Eingabe )
Habe im Beispiel beide Kanäle unterschiedlich vorgeladen damit ein unterschied ersichtlich ist. ( Oszi/ LED etc. )
--------------------------------------------------------------------------------------
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 9600

Config Pind.4 = Output
Config Pind.5 = Output
Dim A As Byte
Dim B As Byte
A = 0
B = 122
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up ,
Compare B Pwm = Clear Up , Prescale = 256

Do
Compare1a = A
Compare1b = B
Loop
--------------------------------------------------------------------------------------


MfG Martin

Robo-Hero
08.01.2007, 19:36
Das mit Hex umwandel meine ich bei C. Die Datei um es später ans avr zu schicken. Aber das ist nicht so wichtig.

ich hatte bis her nur die Beispiele mit 8 Bit nach gemacht. aber wenn ich las 16bit scheint mir das nicht zu gelingen, bzw. ich weis nicht wie das geht.

Wäre über ein Beispiel Code mit Kommentaren sehr Dankbar. [-o<

Robo-Hero
08.01.2007, 19:37
Das ging aber schnell.

So habs ausprobiert. Da ist noch folgendes. Die Konfiguration ist für 8 MegaHerz. Da ich noch keinen Quarz gekauft habe kann ich den AVR nicht darauf Takten, geht das auch mit 1MegaHerz.
Mein Servo Zappelt nähmlich nur und hält keine Feste Position?

coCo
08.01.2007, 20:02
Hi,
wenn du damit einen Servo ansteuern willst, wäre es nicht einfacher den Servo Befehl von Bascom zu benutzen? Also ich meine sowas:


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

Config Portb = Output

Enable Interrupts

Servo(1) = 100
Servo(2) = 100


MfG

RamJam
08.01.2007, 20:08
@ R-H, upps da haste mich aber auf dem falschen Fuß erwischt ;-)
Bin selber gerade dabei mich in die AVR's ( ATM32 etc. ) einzuarbeiten.
Soweit ich aber weiß, kannst du auch mit dem internen RC generierten Takt arbeiten. ( Wie genau der auf Dauer ist, Temperatur etc. ist eine andere Sache )
Da müßte ich parallel zu meinem eigenem Problem schon wieder tief Schmökern im Datenblatt zum ATM32 und BascomAVR.
( Ich gehe ja mal davon aus das du beides hast ? Ohne dem wirst du ziemlich hilflos da stehen. Eigene Erfahrung und trotzdem
komme ich mit dem dritten PWM Signal via Timer2 nicht weiter )

Ich meine, (betone meine unerfahren Meinung) so aus dem Bauch raus, dass der ATM32 ohne weitere Angabe mit ca 7-8Mhz intern taktet. ( per int. RC-Takt-Generator )
Ist aber Fuse-Bit abhänging ( gib also Obacht! ).
An alle anderen und erfahrenen, kasteit mich aber ist so aus dem Bauch raus.

MfG Martin

Robo-Hero
08.01.2007, 20:31
Danke für die Schnelle antwort coCo. Aber mein Servo Zittert auch bei dem Befehl nur vor sich hin.

Ich hab selbst noch nicht viel Erfahrung, hab selbst im Herbst damit angefangen von der Windows Programmierung, auf andere bereiche auzustrecken.

Die Versuche mit einem Servo an einem ATM32 hatte ich bisher nur zappelnde Zustände. Ich bekam eine Position hin, aber die Signale waren so schwach, das dies nicht gehalten werden können wie dort, wenn ich die Servo an meinem Empfänger und mit meiner Fernsteuerung steuere.

Aus den angaben von dem ATM32 hatte ich 1MgeaHerz gelesen, aber vielleicht habe ich mich mal wieder verkuckt.

MFG
JPL

RamJam
09.01.2007, 18:32
@ R-H
Lese ich es richtig, dass deine Servo's auch am Emfänger angeschlossen unsteht sind / zittern?
Wenn das aufeinander abgestimmte / kompatible Teile sind und die Einstellungen ( wenn möglich oder vorhanden ) richtig sind
würde ich zuerst auf einen Fehler oder defekt schließen bei den Servo's.
Hast du die möglichkeit deine Servo's bei einem befreundeten FMA Hobbiesten zu testen?

Ich kann dir nur sagen das du einen Ausgang des ATM32 bis max. ca. 20mA gegen Masse oder ca. 40mA gegen Ub
( Versorgungsspannung = im Regelfall 5V= ) belasten kannst / darfst ( dabei beachten das du die Gesammtleistung des ATM32 nicht überschreitest )
Zudem stehen dir im Regelfall ( bei ca. 5 V= Gleischspannung als Versorgungsspannung des µC ) max. 4,9-5V= zur Verfügung.

Du solltest einmal in Erfahrung bringen welchen Strom die Servomotoren aufnehmen / ziehen und welche Spannung sie hierbei benötigen.


MfG Martin

Robo-Hero
09.01.2007, 20:09
Ich hab mich falsch ausgedrückt. Beim Empfänger und mit der Fernsterung zappeln die Servos nicht.

Ich hab mal bei Gelegenheit das Signal vom Empfänger gemessen.
Das Signal ist genau so wie ich es bei RN-Wissen gelesen habe, dass das PWM in einem 20ms Takt abgegeben wird. Naja, am AtMega32 messe ich aber einen Taktlänge von 56us (mücro sekunden).

Es sieht so aus das es von der Taktlänge abhängt. Daher wollte ich das mit den 16bit PWM ausprobieren. Besser wenn ich die Taktlänge in der Programmierung festlegen kann, da die Schaltung im Servo, wahrscheinlich davon abhängig ist.

MFG
JPL

Robo-Hero
13.01.2007, 00:14
Ich habs jetzt hin bekommen

Ich musste nur das Prescale vergrössern. Ich hatte immer den Wert 1 nur genommen. So ware die Periode viel zu kurz.



$regfile = "m32def.dat"
$crystal = 1000000

Config Pind.4 = Output
Config Pind.5 = Output


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

Do

Compare1a = 249
Waitms 1000
Compare1a = 248
Waitms 1000
Compare1a = 247
waitms 1000

Loop

End


Nun das ist jetzt mein Beispiel. Ist leider nur sehr ungenau.
Deshalb habe dann von 8bit auf 10bit erhöht.
Daruf habe ich dann gesehen das ich anhand eine Formel aufstellen konnte und voila, es funktioniert jetzt endlich.



$regfile = "m32def.dat"
$crystal = 1000000

Config Pind.4 = Output
Config Pind.5 = Output


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

Do

Compare1a = 900
Waitms 1000
Compare1a = 910
Waitms 1000
Compare1a = 920
Waitms 1000

Loop

End


Zuerst hatte ich meine Eigene Formel, aber danach hatte ich bei RN Wissen nachgeschaut und hatte die dort vorgegeben Formel dann Verstanden.

(fq/Prescale)/(1024*2) = fa

fq = Frequenz Takt des Microcontroller
fa = Frequenz am Ausgang

Nun kann ich weiter machen.