Hallo,
kann mir jemand Programm (in C) für die PWM (Hardware) einer LED am Mega8 zeigen. Ich bekomme es einfach nicht hin den einen PWM-Kanal des ATMega8 so hin zubekommen, dass die LED fadet.
Gruß Stefan
Hallo,
kann mir jemand Programm (in C) für die PWM (Hardware) einer LED am Mega8 zeigen. Ich bekomme es einfach nicht hin den einen PWM-Kanal des ATMega8 so hin zubekommen, dass die LED fadet.
Gruß Stefan
Zitat von "Spyder24"Hallo,
kann mir jemand Programm für die PWM (Hardware) einer LED am Mega8 zeigen. Ich bekomme es einfach nicht hin den einen PWM-Kanal des ATMega8 so hin zubekommen, dass die LED fadet.
Gruß Stefan
Guckst du mal hier :
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Compare1a = 255 ' Lampe aus
Compare1a = 0 ´Lampe ein
Waitms 200
Enable Interrupts
Anschluß der LED eventuell über Treiber am OC1A Anschluß
Gruß
Mit
[code:1]Compare1b = x
[/code:1]
kann man dann auch Pin OC1B ansteuern... jeder Timer hat 2 Pins!
Okay, verstehe ich jetzt noch nicht aber muss ich dann mal ausprobieren. Kommt das alles im "main" rein?
Zitat von "amron"
Hallo,
den Beitrag habe ich mir auch schon angeschaut und finde ihn sehr gut, allerdings ist das Programm in Bascom geschrieben :?
Hi Idiot, habe gar geschrieben, dass ich in C programmiere :oops:
ja hab ich überlesen, sorry
[code:1]#include <avr/io.h>
#include <stdint.h>
void initPWM(void) {
TCCR0 = (1<<WGM00)|(1<<COM01)|(1<<CS01);
}
void delay(int t) {
for(int z = 0; z <= 10000 * t; z++)
}
int main(void) {
initPWM();
while(1) {
for(int i = 0; i <= 255; i++) {
OCR0 = i;
delay(100);
}
for(int i = 255; i >= 0; i--) {
OCR0 = i;
delay(100);
}
}
return(0);
}
[/code:1]
Ggf musst Du noch etwas anpassen; stammt aus meiner Software für einen Mega 16. Schau ansonsten mal ins Datenblatt.
Zitat von "hellraider"Alles anzeigenGuckst du mal hier :
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Compare1a = 255 ' Lampe aus
Compare1a = 0 ´Lampe ein
Waitms 200
Enable Interrupts
Anschluß der LED eventuell über Treiber am OC1A Anschluß
Gruß
Keine Ahnung, was das ist, aber C ist das sicherlich nicht...
Zitat von "chris.k"Alles anzeigen[code:1]#include <avr/io.h>
#include <stdint.h>
void initPWM(void) {
TCCR0 = (1<<WGM00)|(1<<COM01)|(1<<CS01);
}
void delay(int t) {
for(int z = 0; z <= 10000 * t; z++)
}
int main(void) {
initPWM();
while(1) {
for(int i = 0; i <= 255; i++) {
OCR0 = i;
delay(100);
}
for(int i = 255; i >= 0; i--) {
OCR0 = i;
delay(100);
}
}
return(0);
}
[/code:1]
Ggf musst Du noch etwas anpassen; stammt aus meiner Software für einen Mega 16. Schau ansonsten mal ins Datenblatt.
Cool, danke. Am liebste würde ich es jetzt ausprobieren, aber komme leider erst morgen abend dazu :?
Zitat von "chris.k"
Keine Ahnung, was das ist, aber C ist das sicherlich nicht...
O.k. sorry
das habe ich wohl überlesen.
Ich meinte es ja nur gut. #-o
Zitat von "Spyder24"Cool, danke. Am liebste würde ich es jetzt ausprobieren, aber komme leider erst morgen abend dazu :?
Ich habs auch noch nicht getestet :lol:
Wenns nicht geht, versuch mal Delay zu variieren... Prinzipiell müsste es aber funzen, weil das gesamtprogramm, aus dem das stammt, auch geht.
Zitat von "hellraider"O.k. sorry
das habe ich wohl überlesen.
Ich meinte es ja nur gut. #-o
Danke, ich habe es in der ersten Version meines Beitrages auch vergessen und es nur nachträglich eingefügt.
Es war also meine Schuld.
Beim Atmega8 ist aber Timer 1 für PWM1 und 2 zuständig und der Timer 2 für PWM 3. Der Timer 0 ist halt ein zusätzlicher Timer...
Der folgende Code ist für einen Atmega8:
ZitatAlles anzeigen
/* Timer 1 für PWM-Nutzung initialisieren */
TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
TCCR1B = // tov1 flag set on top
//COM1A1 setzen für OCR1A aktivieren COM1B1 setzten für OCR1B
(1 << CS10); // clock select clk/1024
ICR1 = 255;
/* OC1A als PWM-Port setzen */
DDRB |= (1 << PB1);
DDRB |= (1 << PB2);
TCCR2 = (1 << CS20)| (1 << COM21) | (1 << COM20) | (1 << WGM20);
DDRB |= (1 << PB3);
ist alles eine 8 bit PWM.
Der Code ist zwar nicht Hardwaremäßig getestet, er läuft aber in AVR Studio einwandfrei auf dem Atmega8.
für die Geschwindigkeit die Vorteiler nach Datenblatt einstellen...
um einen Wert per PWM auszugeben, dann einfach z.B.:
OCR1B = 256;
OCR2 = 256;
OCR1A= 256;
setzen.
Zitat von "foo38"Alles anzeigenBeim Atmega8 ist aber Timer 1 für PWM1 und 2 zuständig und der Timer 2 für PWM 3. Der Timer 0 ist halt ein zusätzlicher Timer...
Der folgende Code ist für einen Atmega8:
ist alles eine 8 bit PWM.
Der Code ist zwar nicht Hardwaremäßig getestet, er läuft aber in AVR Studio einwandfrei auf dem Atmega8.
für die Geschwindigkeit die Vorteiler nach Datenblatt einstellen...
um einen Wert per PWM auszugeben, dann einfach z.B.:
OCR1B = 256;
OCR2 = 256;
OCR1A= 256;
setzen.
Ich habe es jetzt zum laufen bekommen aber man sieht das blinken noch zu sehr. Muss ich mal noch testen.
Da kannst du einfach den Vorteiler ändern.
Wird mit den CSxx Bits geschaltet. Der Vorteiler teilt den Takt durch den angegebenen Wert. Dann läuft einfach der Timer schneller. Je nachdem welche Frequenz du eingestellt hast, könnte der Vorteiler von 1024 zu groß sein. Stell mal einen anderen ein. Dann müsste das Flackern abgestellt sein.
Ganz interessant sind folgende Seiten, die haben mir sehr geholfen:
http://dlangenberg.googlepages.com/atmega8basics
http://www.kreatives-chaos.com/artikel/codeschnipsel-avr-gcc
Zitat von "foo38"Alles anzeigenDa kannst du einfach den Vorteiler ändern.
Wird mit den CSxx Bits geschaltet. Der Vorteiler teilt den Takt durch den angegebenen Wert. Dann läuft einfach der Timer schneller. Je nachdem welche Frequenz du eingestellt hast, könnte der Vorteiler von 1024 zu groß sein. Stell mal einen anderen ein. Dann müsste das Flackern abgestellt sein.
Ganz interessant sind folgende Seiten, die haben mir sehr geholfen:
http://dlangenberg.googlepages.com/atmega8basics
http://www.kreatives-chaos.com/artikel/codeschnipsel-avr-gcc
Ich habe bisher immer den kleinsten Teiler (also eins), verwendet und mir nie groß Gedanken drüber gemacht. Ist das sinnvoll?
PWM sollte doch dann so schnell laufen, wie es nur geht...