Forum: Compiler & IDEs PWM mit ATMega8


von Christian Heigele (Gast)


Lesenswert?

Ahoi!
Ich möchte gerne ein paar Dioden dimmen, und muss dazu PWM
"sprechen"
Ich hab mir mal das Beispiel von mc-project.de angeschaut

/***********************************************************
   Beispiel zur Initialisierung und Verwendung
   der PWM des Atmega8
   --> Dimmen von LEDs an den Ports OC1A und OC1B
***********************************************************/

#include <avr/io.h>
#include <pwm_init.c>
#include <simple_delayroutinen.c>

int main(void) {

    unsigned char i = 0;
   pwm_init ();

    for (;;) {

      for (i=0; i<254; i++) {
         OCR1A = i;
         OCR1B = i;
         delay_us (10000);
      }
   }
}


Und das geht auch ganz gut (Man braucht dazu natürlich noch
http://www.mc-project.de/Pages/AVR/Software/simple_delayroutinen.c und
http://www.mc-project.de/Pages/AVR/Software/pwm_init.c)
Aber 1. brauche ich 3 PWM Ports (und das hat der ATMega8 ja) und 2.
möchte ich eigentlich mehrere (jeweils 3-4 Dioden) mit einem PWM-Port
ansprechen.
Dabei dachte ich an ein Transistoren-Array, aber damit das
funktioniert, benötige ich ja ein Software PWM und das obige ist doch
Hardware oder?
Wäre nett wenn mir jmd. helfen könnte. (weil ich heute Geburtstag habe
Smile)
#grs

von Dirk (Gast)


Lesenswert?

Hi,

dann erstmal Happy Birthday.

Der Mega8 hat 3 Hardware PWM's also koenntest du deine led's daran
anschliessen.

Da du mehrere Led's dimmen moechtest musst du einen Treiber
(Transistor oder lieber Mosfet) nehmen. Du koenntest die
Betriebsspannung fuer die LED's erhoehen z.B. auf 24V dann kannst du
ca 7 Stueck in Reihe legen.

Falls es mit Software PWM gemacht werden soll hier die Timer ISR 8 Bit
ein kleines Prg.

// Timer2 ISR (34,72µs)  OVERFLOW BETRIEB

SIGNAL(SIG_OVERFLOW2)
{

    if(z++ == 0)
    {
    cbi(PORTD,2);
    cbi(PORTD,3);
    }


    if(Ri++ == R)
    {
      sbi(PORTD,2);
    }
    if(Gi++ == G)
    {
      sbi(PORTD,3);
    }


}




Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

Aber mit einem Transistor kann ich den Hardware-PWM nicht nehmen oder?
Und dein Softwarebsp. verstehe ich nicht ganz.
Könntest du das, sofern die Umstände, die durch meine bescheidene Bitte
hervorgerufen wurden, nicht allzu groß sind, näher erläutern, oder sogar
in einen Bsp-Code einbinden?
Freundliche Grüße zurück Christian

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

anbei mal die Hardware. Der Transistor/Mosfet ist nur ein Beispiel und
muss auch den Strom schalten koennen.

Natuerlich kannst du die Hardware PWM Ausgaenge an einem Transistor
oder Mosfet.

Ich finde die PWM Ausgaenge liegen ein bischen doof (direkt auf den
SPI).

Ich bastle nochmal ein kleines Prg zusammen fuer ein Software 8 Bit PWM
für 3 Ausgaenge.

Mfg
Dirk

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

anbei ein Sample Prg in AVR GCC. Es ist nicht das gelbe vom Ei, aber es
erfuellt seinen Zweck.

Ich hab das Prg nur compiliert. Es wurde nicht an der Zielhardware
getestet.

Takt: interner RC Oszillator @ 8Mhz
µC: Mega8

Mfg
Dirk

von Jörg Wunsch (Gast)


Lesenswert?

Eine Idee einer Software-PWM hatte ich übrigens vor einiger Zeit mal
hier gepostet.  Sollte sich über die Forum-Suche finden lassen.  Ist
nicht extrem genau, aber für das Dimmen von paar LEDs müsste es tun.

von Christian Heigele (Gast)


Lesenswert?

Also:
Ich habs immernoch nicht gepeilt, habe aber ein noch größeres Problem:
Ich will mehrere Dioden auf einmal ansprechen.
Um  das zu machen, brauche ich eine größere Spannung als mein ATMega
liefern kann, also brauche ich ja einen Transistor(-Array).
Aber irgendwie bringe ich die jetztmal nicht mehr zum leuchten.
Ich hab das Folgendermaßen angeschlossen:

Vcc-R1-LED-LED-ULN(das ist mein Transistor Array vom Typ
ULN2002A)-ATMega(auf PB0 bis...)

Irgendwie schaff ich es nicht ein Leuchte hervorzurufen.
Wenn ich aber manuell eine erdung an einen ULN-Ausgangsport anlege,
dann leuchten die Dioden auf.
#grs

von Simon Küppers (Gast)


Lesenswert?

Probier mal den CD Eingang von Masse wegzunehmen ;)

grinst
Simon..

von Christian Heigele (Gast)


Lesenswert?

Also.
Ist zwar etwas später, aber ich habe jetzt Dirks Code ausprobiert, und
jetzt blinken die Dioden, zwar unterschiedlich schnell aber gleich
hell.
Stimmt da irgendwas mit en zahlen nicht?
#grs

von Dirk (Gast)


Lesenswert?

Hi,

der Prescaler stimmt nicht. Setz mal den Prescaler auf 1.

Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

TCCR0 = (1<<CS01); So isses im Moment.
Wie sollte es sein?
#grs

von Dirk (Gast)


Lesenswert?

Hi,

TCCR0 = (1<<CS00);

Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

Oke, jetzt blinken sie alle ganzganz schenl
aber is immer noch nicht gedimt :(
#grs

von Dirk (Gast)


Lesenswert?

Hi,

mit wieviel Mhz laeuft dein AVR den?

Also mit TCCR0 = (1<<CS00) laeuft der Code einwandfrei. Mein AVR laeuft
mit internen 8Mhz.

Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

Meiner läuft ohne externen Oszi.
Also auch 8 Mhz.
Hast du das in hardware nachgebaut?
#grs

von Christian Heigele (Gast)


Angehängte Dateien:

Lesenswert?

Den kompletten Source hab ich jetzt mal angehängt.
#grs

von Jörg Wunsch (Gast)


Lesenswert?

Wie kommst du auf 8 MHz?  Auslieferungszustand ist 1 MHz.

von Dirk (Gast)


Lesenswert?

Hi,

tja mit 1Mhz und Prescaler von 8 wird das nix.

Stell mal auf 8Mhz um.

Mfg
Dirk

von Dirk (Gast)


Lesenswert?

Hi,

hab mein DEV Board rausgekramt und ein paar Leds angeschlossen (Led's
sind LOW Aktiv).

Der Code funktioniert.

Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

Und wie stell ich den mal kurz auf 8 Mhz um?
#grs

von Dirk (Gast)


Lesenswert?

Hi,

du bist verdammt faul. Schau mal endlich ins Datasheet! Suchbegriff
FuseBits.

Mfg
Dirk

von Christian Heigele (Gast)


Lesenswert?

Nur dass ich nichts falsch mache.
Das Fuse-Bit muss heissen: 11100111
Ich bin nicht nur faul
#grs

von Christian Heigele (Gast)


Lesenswert?

Hä
Jetzt bin ich verwirrt.
Aber kleinen Moment.
Der Bit oben war für den SP12.
#grs

von Christian Heigele (Gast)


Lesenswert?

Oki
Ich muss (ich hab yaap) den CKOPT setzen oder?
#grs

von Christian Heigele (Gast)


Lesenswert?

Oder meintest du das:

The ATmega8 stores four different calibration values for the internal
RC Oscillator.
These bytes resides in the signature row High byte of the addresses
0x0000, 0x0001,
0x0002, and 0x0003 for 1, 2, 4, and 8 Mhz respectively.

Und wo sollte ich das eingeben?
Noch verwirrter als vorher.
#grs

von Dirk (Gast)


Lesenswert?

Hallo,

Seite 28 CKSEL3...0

Du machst den Thread echt lang. Nutze naechstes mal den Chat.

Mfg
Dirk

von lucifer (Gast)


Lesenswert?

ist zwar schon etwas älter aber hat jemand zufällig noch diese dateien?

pwm_init.c
simple_delayroutinen.c

oder kann sie jemand anhängen?

von lucifer (Gast)


Lesenswert?

niemand? :/

von Jens500 (Gast)


Lesenswert?


von lucifer (Gast)


Lesenswert?

ah das ist doch was
vielen dank

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.