Tux12Fun
31.03.2010, 22:40
Hallo,
im Moment versuche ich gerade mit einer RGB Led und meinem ATMEGA32 ein Fading der Farben zu bekommen. Erste Gehversuche werden euch wohl sehr kompliziert vorkommen. Deshalb, meine Frage, wie könnte ich so etwas einfach Realisieren.
Mein Code sieht im Moment so aus und macht auch noch nicht ganz was er soll. Das ich bisher nur eine Farbe je heller und dunkler bringe.
Leider habe ich bisher ach noch keine Erfahrung mit den Timern im ATMEGA. Ich brauche wohl dazu noch sowas wie Threads, falls es die im ATMEGA gibt.
Mein Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <util/delay.h>
#define MCU = AVR_ATmega32
#define F_CPU 16000000
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#define DEF_MAX 3000
int main(void){
DDRC |= (1<<PC0);
DDRC |= (1<<PC1);
DDRC |= (1<<PC2);
PORTC &= ~(1<<PC0); //AUS
PORTC &= ~(1<<PC1); //AUS
PORTC &= ~(1<<PC2); //AUS
_delay_ms(5000);
while(1) {
//Fade in Red
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC0); //AUS
_delay_us(i);
PORTC |= (1<<PC0); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out Red
PORTC |= (1<<PC0); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX +800; i++){ //Rot geht aus, evtl. Ist es heller (+800)
PORTC &= ~(1<<PC0); //AUS
_delay_us(i);
PORTC |= (1<<PC0); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC0); //AUS
//Fade in Blue
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC1); //AUS
_delay_us(i);
PORTC |= (1<<PC1); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out Blue
PORTC |= (1<<PC1); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX; i++){
PORTC &= ~(1<<PC1); //AUS
_delay_us(i);
PORTC |= (1<<PC1); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC0); //AUS
//Fade in green
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC2); //AUS
_delay_us(i);
PORTC |= (1<<PC2); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out green
PORTC |= (1<<PC2); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX; i++){
PORTC &= ~(1<<PC2); //AUS
_delay_us(i);
PORTC |= (1<<PC2); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC2); //AUS
}
return 0;
}
Meine Beschaltung. ATMEGA Minimalverkabelung mit Quarz.
An PDC0 - 3 hängt die RGB Led und an Minus über einen Widerstand.
An jedem + - Pärchen der Led hängt ein 220µF Elko
PCD0 = rot
PDC1 = blau
PDC2 = grün
PDC0 -------------- Elko+ ---------- LED+
MINUS ------------- Elko- ----------- LED -
Ich hoffe ich konnte meinen bisherigen Aufbau ein wenig rüber bringen.
Danke schon im Voraus für eure Hilfe.
im Moment versuche ich gerade mit einer RGB Led und meinem ATMEGA32 ein Fading der Farben zu bekommen. Erste Gehversuche werden euch wohl sehr kompliziert vorkommen. Deshalb, meine Frage, wie könnte ich so etwas einfach Realisieren.
Mein Code sieht im Moment so aus und macht auch noch nicht ganz was er soll. Das ich bisher nur eine Farbe je heller und dunkler bringe.
Leider habe ich bisher ach noch keine Erfahrung mit den Timern im ATMEGA. Ich brauche wohl dazu noch sowas wie Threads, falls es die im ATMEGA gibt.
Mein Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <util/delay.h>
#define MCU = AVR_ATmega32
#define F_CPU 16000000
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#define DEF_MAX 3000
int main(void){
DDRC |= (1<<PC0);
DDRC |= (1<<PC1);
DDRC |= (1<<PC2);
PORTC &= ~(1<<PC0); //AUS
PORTC &= ~(1<<PC1); //AUS
PORTC &= ~(1<<PC2); //AUS
_delay_ms(5000);
while(1) {
//Fade in Red
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC0); //AUS
_delay_us(i);
PORTC |= (1<<PC0); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out Red
PORTC |= (1<<PC0); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX +800; i++){ //Rot geht aus, evtl. Ist es heller (+800)
PORTC &= ~(1<<PC0); //AUS
_delay_us(i);
PORTC |= (1<<PC0); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC0); //AUS
//Fade in Blue
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC1); //AUS
_delay_us(i);
PORTC |= (1<<PC1); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out Blue
PORTC |= (1<<PC1); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX; i++){
PORTC &= ~(1<<PC1); //AUS
_delay_us(i);
PORTC |= (1<<PC1); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC0); //AUS
//Fade in green
for (int i=DEF_MAX; i > 0; i--){
PORTC &= ~(1<<PC2); //AUS
_delay_us(i);
PORTC |= (1<<PC2); //AN
_delay_us(1600);
}
_delay_ms(3000);
//Fade out green
PORTC |= (1<<PC2); //AN
_delay_ms(3000);
for (int i=0; i < DEF_MAX; i++){
PORTC &= ~(1<<PC2); //AUS
_delay_us(i);
PORTC |= (1<<PC2); //AN
_delay_us(1600);
}
PORTC &= ~(1<<PC2); //AUS
}
return 0;
}
Meine Beschaltung. ATMEGA Minimalverkabelung mit Quarz.
An PDC0 - 3 hängt die RGB Led und an Minus über einen Widerstand.
An jedem + - Pärchen der Led hängt ein 220µF Elko
PCD0 = rot
PDC1 = blau
PDC2 = grün
PDC0 -------------- Elko+ ---------- LED+
MINUS ------------- Elko- ----------- LED -
Ich hoffe ich konnte meinen bisherigen Aufbau ein wenig rüber bringen.
Danke schon im Voraus für eure Hilfe.