Teddynator
04.01.2009, 23:17
Hallo,
Bin leider noch ziemlicher Anfänger in Sachen C. vielleicht kann mir einer von euch bei folgendem Problem helfen.
Ich habe eine PWM für eine RGB LED auf einen Atmega8 programmiert, so dass sie ständig die Farbe wechselt. nun soll man aber über einen Taster der einen Interrupt auslöst und eine Variable setzt die LED auf weiß schalten können. das ganze funktioniert soweit auch recht gut, nur dass die LED eben erst nach dem durchlauf der PWM sequenz auf weiß wechselt. Gibt es eine Möglichkeit nach dem Interrupt Programm direkt zum Programmteil "Weiß" zu springen? oder wüsstet ihr eine einfachere Lösung so etwas zu Programmieren?
hier mein Programm (ohne das delay Unterprogramm und die PWM unterprogramme)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
void delay(unsigned int ms);
void LED2DIMIN(void);
void LED1DIMIN(void);
void LED2DIMOUT(void);
void LED1DIMOUT(void);
void LED3DIMIN(void);
void LED3DIMOUT(void);
int i;
int a;
int b;
int c = 50; //geschwindigkeit Dimmer höherer Wert = langsamer
int d = 0;
ISR(INT0_vect) //Interrupt
{
if (d==0)
{
d=1;
}
else
{
d=0;
}
}
void main(void) //Hauptprogramm
{
DDRD = 0b11100000; //Pin 765 = Output 0-4 = Input
GICR|=(1<<INT0); //enables ext Interrupt (Pin 4, INT0)
MCUCR = 0b00000011; //Steigende Flanke an INT0 Löst aus
sei (); //Global Interrupt enable
while(1)
{
if (d==0)
{
PORTD &= ~(1 << PD5);
PORTD &= ~(1 << PD6);
PORTD |= (1 << PD7);
LED2DIMIN(); //blau
LED3DIMOUT(); //rot weg
LED1DIMIN(); //grün
LED2DIMOUT(); //blau weg
LED3DIMIN(); //rot
LED1DIMOUT(); //grün weg
}
else
{
PORTD |= (1 << PD7); //weiß
PORTD |= (1 << PD6);
PORTD |= (1 << PD5);
}
}
}
Wäre froh wenn Mir jemand helfen könnte
vielen Dank
Bin leider noch ziemlicher Anfänger in Sachen C. vielleicht kann mir einer von euch bei folgendem Problem helfen.
Ich habe eine PWM für eine RGB LED auf einen Atmega8 programmiert, so dass sie ständig die Farbe wechselt. nun soll man aber über einen Taster der einen Interrupt auslöst und eine Variable setzt die LED auf weiß schalten können. das ganze funktioniert soweit auch recht gut, nur dass die LED eben erst nach dem durchlauf der PWM sequenz auf weiß wechselt. Gibt es eine Möglichkeit nach dem Interrupt Programm direkt zum Programmteil "Weiß" zu springen? oder wüsstet ihr eine einfachere Lösung so etwas zu Programmieren?
hier mein Programm (ohne das delay Unterprogramm und die PWM unterprogramme)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
void delay(unsigned int ms);
void LED2DIMIN(void);
void LED1DIMIN(void);
void LED2DIMOUT(void);
void LED1DIMOUT(void);
void LED3DIMIN(void);
void LED3DIMOUT(void);
int i;
int a;
int b;
int c = 50; //geschwindigkeit Dimmer höherer Wert = langsamer
int d = 0;
ISR(INT0_vect) //Interrupt
{
if (d==0)
{
d=1;
}
else
{
d=0;
}
}
void main(void) //Hauptprogramm
{
DDRD = 0b11100000; //Pin 765 = Output 0-4 = Input
GICR|=(1<<INT0); //enables ext Interrupt (Pin 4, INT0)
MCUCR = 0b00000011; //Steigende Flanke an INT0 Löst aus
sei (); //Global Interrupt enable
while(1)
{
if (d==0)
{
PORTD &= ~(1 << PD5);
PORTD &= ~(1 << PD6);
PORTD |= (1 << PD7);
LED2DIMIN(); //blau
LED3DIMOUT(); //rot weg
LED1DIMIN(); //grün
LED2DIMOUT(); //blau weg
LED3DIMIN(); //rot
LED1DIMOUT(); //grün weg
}
else
{
PORTD |= (1 << PD7); //weiß
PORTD |= (1 << PD6);
PORTD |= (1 << PD5);
}
}
}
Wäre froh wenn Mir jemand helfen könnte
vielen Dank