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
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
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
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
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
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.
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
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
Oke, jetzt blinken sie alle ganzganz schenl aber is immer noch nicht gedimt :( #grs
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
Meiner läuft ohne externen Oszi. Also auch 8 Mhz. Hast du das in hardware nachgebaut? #grs
Hi, tja mit 1Mhz und Prescaler von 8 wird das nix. Stell mal auf 8Mhz um. Mfg Dirk
Hi, hab mein DEV Board rausgekramt und ein paar Leds angeschlossen (Led's sind LOW Aktiv). Der Code funktioniert. Mfg Dirk
Hi, du bist verdammt faul. Schau mal endlich ins Datasheet! Suchbegriff FuseBits. Mfg Dirk
Nur dass ich nichts falsch mache. Das Fuse-Bit muss heissen: 11100111 Ich bin nicht nur faul #grs
Hä Jetzt bin ich verwirrt. Aber kleinen Moment. Der Bit oben war für den SP12. #grs
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
Hallo, Seite 28 CKSEL3...0 Du machst den Thread echt lang. Nutze naechstes mal den Chat. Mfg Dirk
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.