papuadive
13.02.2012, 13:49
Hallo,
irgendwie bringe ich das Zeug's nicht zum Laufen.
Möchte für beliebige Pin's (an denen jeweils LEDs hängen) bei Überlauf (IR) des Timer1, ein Toggeln realisieren. Also ganz normal bei Überlauf (ganz ohne Vergleich ...).
Das zweite Mal beim Vergleich einen IR bewerkstelligen, eigentlich eine Phasenkorrektem PWM mit Timer 1.
Nur die Konfig. macht mir ein wenig Probleme. Vielleicht könnt ihr den Code richtig stellen.
Für den Mega 16 bzw. 32 gibt es genug Beispielprogramme. Leider nicht für den Mega 8.
Danke
Papua
#include <avr/io.h>
#include <avr/interrupt.h>
// Mega 8L
// Timer/Counter1 Overflow
ISR (TIMER1_OVF_vect)
{
PORTD ^= (1 << PD2); // PD2 toggeln
}
// Timer/Counter1 Compare
ISR (TIMER1_COMP_vect)
{
PORTD ^= (1 << PD0); // PD2 toggeln
}
int main()
{
DDRD |= (1 << PD2) | (1 << PD0);
PORTD |= (1 << PD2) | (1 << PD0);
// ***************************
// Konfig. PWM
// ***************************
TIMSK |= (1 << OCIE1B) | (1 << TOIE1); // IRQ bei Compare Match
OCR1BH = 128; // Vergleichswert einstellen
OCR1BL = 0;
sei(); // IRQs enable (Interrupt global einschalten)
TCCR1A |= (1 << WGM11); // CTC-Modus (Vergleichmodus)
TCCR1B |= (1 << CS11); // Prescaler: 1/8 (zB.: CPU-Takt 8000000/ Teiler 8)
while (1) // endlos
{
// von hier aus möchte ich die Helligkeit steuern
}
return 0;
}
irgendwie bringe ich das Zeug's nicht zum Laufen.
Möchte für beliebige Pin's (an denen jeweils LEDs hängen) bei Überlauf (IR) des Timer1, ein Toggeln realisieren. Also ganz normal bei Überlauf (ganz ohne Vergleich ...).
Das zweite Mal beim Vergleich einen IR bewerkstelligen, eigentlich eine Phasenkorrektem PWM mit Timer 1.
Nur die Konfig. macht mir ein wenig Probleme. Vielleicht könnt ihr den Code richtig stellen.
Für den Mega 16 bzw. 32 gibt es genug Beispielprogramme. Leider nicht für den Mega 8.
Danke
Papua
#include <avr/io.h>
#include <avr/interrupt.h>
// Mega 8L
// Timer/Counter1 Overflow
ISR (TIMER1_OVF_vect)
{
PORTD ^= (1 << PD2); // PD2 toggeln
}
// Timer/Counter1 Compare
ISR (TIMER1_COMP_vect)
{
PORTD ^= (1 << PD0); // PD2 toggeln
}
int main()
{
DDRD |= (1 << PD2) | (1 << PD0);
PORTD |= (1 << PD2) | (1 << PD0);
// ***************************
// Konfig. PWM
// ***************************
TIMSK |= (1 << OCIE1B) | (1 << TOIE1); // IRQ bei Compare Match
OCR1BH = 128; // Vergleichswert einstellen
OCR1BL = 0;
sei(); // IRQs enable (Interrupt global einschalten)
TCCR1A |= (1 << WGM11); // CTC-Modus (Vergleichmodus)
TCCR1B |= (1 << CS11); // Prescaler: 1/8 (zB.: CPU-Takt 8000000/ Teiler 8)
while (1) // endlos
{
// von hier aus möchte ich die Helligkeit steuern
}
return 0;
}