Moin,
ich möchte 2 PWM´s mit dem Atmega 32 Programmieren, deren Frequenz so
niedrig ist (2Hz), dass man LED´s sichtbar zum blinken bringen kann. Nur
leider blinkt keine der 3 angeschlossenen LED´s. Die an PD0 glimmt, die
an PD4 und PD5 sind aus. Weiß jmd weiter?
ICR1 ist 16bit groß, da passen keine 4 Millionen rein. Was nachher
tatsächlich in dem Register steht weiss ich nicht, aber vermutlich nix
sinnvolles.
2 Hz ist in Software vermutlich sinnvoller zu machen (ich glaube, das
ist ein Lernprojekt und nichts zeitkritisches, nicht?) aber mit dem
Timer1 ginge es so:
- PWM Modus 8 (Datenblatt Seite 109)
- ICR1 auf 65536 (=16bit)
- Prescaler auf 1024 (Seite 110)
Macht dann 8Mhz/1024/65536/2 (wegen dual slope)= 0,059Hz. Das müsste
langsam genug sein.
Kannst auch Modus 14 nehmen, Fast PWM mit ICR1 als TOP, dann entfällt
das "/2" in der Gleichung.
spess53 schrieb:> Hi>>>Niemand eine Idee?>> Hardware überprüfen.>> MfG Spess
wäre auch mein erster Tipp. Funktioniert überhaupt deine Hardware? Setz
einfach die Pins mal selbst auf High, dann wirst du ja sehen, ob die LED
überhaupt leuchten "kann"
D.h. die Software ist soweit korrekt? Die Led´s sind nicht defekt, schon
getestet. Muss ich überhaupt PORTD ^= (1<<PD4) schreiben? Oder toggelt
PD4 automatisch, da PD4 dem OC1B entspricht und dieser bei Bottom bzw
Compare match seinen Status automatisch ändert?
Guest schrieb:> D.h. die Software ist soweit korrekt?
Nein, nicht in dem Sinne, daß sie tun würde, was du haben willst. Aber
die LEDs sollten immerhin alle drei blinken Und zwar so:
PD0: 1:1 Tastverhältnis, ~0,98Hz
PD4: ~1:3 Tastverhältnis, ~1,95Hz
PD5: ~1:2 Tastverhältnis, ~1,95Hz
Tun sie das nicht, stimmt irgendwas an der Hardware nicht. Oder das
Programm, was du gepostet hast ist nicht identisch mit dem Programm, was
tatsächlich auf dem µC läuft.
Übrigens: die beiden COMPx-ISRs sind völlig nutzlos und verbrauchen nur
Rechenzeit, ohne irgendwas zu bewirken. Abgesehen von dem sinnlosen
Rechenzeitverbrauch schaden sie allerdings auch nicht weiter.
Ich würde mal darauf tippen, daß dein Hardware-Werk so dermaßen Scheiße
ist, daß sich der µC in den Reset verabschiedet, sobald irgendwelche
LEDs plötzlich Strom verbrauchen. Dann wacht er wieder auf, um erneut
abzustürzen, sobald die erste LED leuchtet.
Also vermutlich hat da mal wieder so ein Ober-Checker kraft seiner
Wassersuppe auf Stützkondensatoren und/oder auf LED-Vorwiderstände
verzichtet, obwohl alle Erwachsenen sagen, daß man sowas tatsächlich
braucht...
c-hater schrieb:> Abgesehen von dem sinnlosen> Rechenzeitverbrauch schaden sie allerdings auch nicht weiter.
Da bin ich mir nicht so sicher, da der TE genau an den Pins rumfummelt,
die die Hardware OC Register selbst bearbeiten.
Das macht der Mega von ganz alleine, nur die Pins auf Output stellen und
die Polarität der Pins mit dem COM1X Bits wählen - die Compare ISRn
kannst du dir sparen.
Für dich ist 'Clear on Compare Match' der richtige Modus.
Matthias Sch. schrieb:> Da bin ich mir nicht so sicher, da der TE genau an den Pins rumfummelt,> die die Hardware OC Register selbst bearbeiten.
Ist aber so. Schau dir einfach das Prinzipschaltbild der Portbits an
(das steht verdammt nochmal ebenfalls im Datenblatt). Alternative
Portfunktionen haben bezüglich PORTx-Ausgaben immer absoluten Vorrang,
bezüglich DDRx meistens (im Falle der Timer-OC-Ausgänge allerdings
nicht).
Da er nur an den PORTx rumfummelt, ist es praktisch genauso, als wenn er
garnix tut.
Matthias Sch. schrieb:> Da bin ich mir nicht so sicher, da der TE genau an den Pins rumfummelt,> die die Hardware OC Register selbst bearbeiten.
Das macht nichts. Die Pins werden von der PWM übernommen. Aber so ein
Unsinn gehört da natürlich trotzdem nicht hin.
Guest schrieb:> Muss ich überhaupt PORTD ^= (1<<PD4) schreiben?
Nein, natürlich nicht. Sinn des PWM-Modes ist, dass der Timer das
alleine macht.
mfg.