rob_88_20p
22.03.2009, 20:14
Hi Leute
Ich hab mal wieder ne Frage
Diesmal gehts um das dimmen von LED's, ich hab hier mal einen Code aus dem Netzt stibitzt.
Dieser mit 2 LED's funktioniert tip top:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
void Delay(uint8_t ms)
{
while(ms > 0) {
_delay_us(100);
--ms;
}
}
void Time1(uint8_t OnTime)
{
if(OnTime > 0) {
// Led ein
PORTC = 0x00;
// OnTime abwarten
Delay(OnTime);
}
if(OnTime < 120) {
// Led aus
PORTC = 0x01;
// Aus-Zeit abwarten
Delay(120 - OnTime);
}
}
void Time2(uint8_t OnTime2)
{
if(OnTime2 > 0) {
// Led ein
PORTC = 0x00;
// OnTime abwarten
Delay(OnTime2);
}
if(OnTime2 < 120) {
// Led aus
PORTC = 0x02;
// Aus-Zeit abwarten
Delay(120 - OnTime2);
}
}
int main()
{
uint8_t Level;
uint8_t Level2;
DDRC = 0xFF; // alles auf Ausgang
Level = 0;
Level2 = 0;
while(1){
//LED 1
while(Level >0){
Time1(Level); // Obere Grenze erreicht ?
Level -=1;} // Ja: Auf dunkler werden umschalten
while(Level <=120){
Time1(Level);
Level += 1;} // LED 1 soll heller werden
//LED 2
while(Level2 > 0){
Time2(Level2); // Obere Grenze erreicht ?
Level2 -=1;} // Ja: Auf dunkler werden umschalten
while(Level2 <= 120){
Time2(Level2);
Level2 += 1;} // LED 2 soll heller werden
}
}
Dieser hier mit 4 LED's funktoiniert auch tip top:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define delay 80
#define delay2 1000
void Delay( uint8_t ms ){
while( ms > 0 ) {
_delay_us( delay );
--ms; }
}
// LED 1
void Time1( uint8_t OnTime ){
if( OnTime > 0 ) {
PORTC = 0x00;
Delay( OnTime );
}
if( OnTime < 120 ) {
PORTC = 0x01;
Delay( 120 - OnTime );
}
}
// LED 2
void Time2( uint8_t OnTime2 ){
if( OnTime2 > 0 ) {
PORTC = 0x00;
Delay( OnTime2 );
}
if( OnTime2 < 120 ) {
PORTC = 0x02;
Delay( 120 - OnTime2 );
}
}
//LED 3
void Time3 ( uint8_t OnTime3 ){
if( OnTime3 > 0 ) {
PORTC = 0x00;
Delay( OnTime3 );
}
if( OnTime3 < 120 ) {
PORTC = 0x04;
Delay( 120 - OnTime3 );
}
}
//LED 4
void Time4( uint8_t OnTime4 ){
if( OnTime4 > 0 ) {
PORTC = 0x00;
Delay( OnTime4 );
}
if( OnTime4 < 120 ) {
PORTC = 0x08;
Delay( 120 - OnTime4 );
}
}
int main()
{
uint8_t Level;
uint8_t Level2;
uint8_t Level3;
uint8_t Level4;
DDRC = 0xFF; // alles auf Ausgang
Level = 0;
Level2 = 0;
Level3 = 0;
Level4 = 0;
while(1){
//LED 1
while(Level >0 ){
Time1( Level ); // Obere Grenze erreicht ?
Level -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level <=120 ){
Time1( Level );
Level += 1;} // LED 1 soll heller werden
//LED 2
while(Level2 > 0){
Time2( Level2 ); // Obere Grenze erreicht ?
Level2 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level2 <= 120){
Time2( Level2 );
Level2 += 1;} // LED 2 soll heller werden
//LED 3
while(Level3 >0 ){
Time3( Level3 ); // Obere Grenze erreicht ?
Level3 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level3 <=120 ){
Time3( Level3 );
Level3 += 1;} // LED 3 soll heller werden
//LED 4
while(Level4 > 0){
Time4( Level4 ); // Obere Grenze erreicht ?
Level4 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level4 <= 120){
Time4( Level4 );
Level4 += 1;} // LED 4 soll heller werden
}
}
Wenn ich allerdings ein neues AVR GCC Projekt starte und genau den selben Code (also einen von den beiden) rein kopiere, (code wurde nicht verändert), dann dimmen die LED's nicht mehr so wie vorhin.
Die LED's dimmen normal so (richtig):
(a)
LED 1 ein , langsam ausdimmen
LED 2 ein , langsam ausdimmen
LED 3 ein , langsam ausdimmen
LED 4 ein , langsam ausdimmen
(b)
LED 1 langsam eindimmen, dann langsam ausdimmen
LED 2 langsam eindimmen, dann langsam ausdimmen
LED 3 langsam eindimmen, dann langsam ausdimmen
LED 4 langsam eindimmen, dann langsam ausdimmen
LED 1 langsam eindimmen, dann langsam ausdimmen
Immer so weiter: LED langsam eindimmen, dann langsam ausdimmen.
Der erste Durchgang (a) wird nur einmal ausgeführt dann immer mit (b) weiter.
wenn ich aber wie gesagt den selben Code kopiere, dann dimmen die LED's so(falsch):
LED 1 ein dann einmal ausblinken dann lange Pause, Pause wird mit jeden Blink vorgang immer kürzer, bis dunkel. weiter mit LED 2.
Ich weis nicht wie das genau passieren kann denn es wird einfach die verzögerung erhöht, richtiger weise sind es 100 us, dieser Takt wird einfach immer schneller bis die LED schliesslich aus ist dann weiter mit LED 2.
Ich habe alles beachtet bei den Kompilierungsoptionen wurde der ATmega88 ausgewählt bei AVRDude auch ATmega88 ich habe nichts verändert beim kopierten Code.
Aber wenn ich einen neuen Code schreibe zb. Irgend etwas mit Schaltern wo nichts mit dimmen ist, dann klappt alles.
Aber wiso nicht beim kopierten Code ?
Das habe ich schon oft gemacht wenn ich einen Code in mehreren ausführungen brauche zb. einmal mit 2 und einmal mit 4 LED's.
Ich hoffe jemand kann mir helfen.
Danke schonmal für die Hilfe.
Gruss rob_88_20p
Ich hab mal wieder ne Frage
Diesmal gehts um das dimmen von LED's, ich hab hier mal einen Code aus dem Netzt stibitzt.
Dieser mit 2 LED's funktioniert tip top:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
void Delay(uint8_t ms)
{
while(ms > 0) {
_delay_us(100);
--ms;
}
}
void Time1(uint8_t OnTime)
{
if(OnTime > 0) {
// Led ein
PORTC = 0x00;
// OnTime abwarten
Delay(OnTime);
}
if(OnTime < 120) {
// Led aus
PORTC = 0x01;
// Aus-Zeit abwarten
Delay(120 - OnTime);
}
}
void Time2(uint8_t OnTime2)
{
if(OnTime2 > 0) {
// Led ein
PORTC = 0x00;
// OnTime abwarten
Delay(OnTime2);
}
if(OnTime2 < 120) {
// Led aus
PORTC = 0x02;
// Aus-Zeit abwarten
Delay(120 - OnTime2);
}
}
int main()
{
uint8_t Level;
uint8_t Level2;
DDRC = 0xFF; // alles auf Ausgang
Level = 0;
Level2 = 0;
while(1){
//LED 1
while(Level >0){
Time1(Level); // Obere Grenze erreicht ?
Level -=1;} // Ja: Auf dunkler werden umschalten
while(Level <=120){
Time1(Level);
Level += 1;} // LED 1 soll heller werden
//LED 2
while(Level2 > 0){
Time2(Level2); // Obere Grenze erreicht ?
Level2 -=1;} // Ja: Auf dunkler werden umschalten
while(Level2 <= 120){
Time2(Level2);
Level2 += 1;} // LED 2 soll heller werden
}
}
Dieser hier mit 4 LED's funktoiniert auch tip top:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define delay 80
#define delay2 1000
void Delay( uint8_t ms ){
while( ms > 0 ) {
_delay_us( delay );
--ms; }
}
// LED 1
void Time1( uint8_t OnTime ){
if( OnTime > 0 ) {
PORTC = 0x00;
Delay( OnTime );
}
if( OnTime < 120 ) {
PORTC = 0x01;
Delay( 120 - OnTime );
}
}
// LED 2
void Time2( uint8_t OnTime2 ){
if( OnTime2 > 0 ) {
PORTC = 0x00;
Delay( OnTime2 );
}
if( OnTime2 < 120 ) {
PORTC = 0x02;
Delay( 120 - OnTime2 );
}
}
//LED 3
void Time3 ( uint8_t OnTime3 ){
if( OnTime3 > 0 ) {
PORTC = 0x00;
Delay( OnTime3 );
}
if( OnTime3 < 120 ) {
PORTC = 0x04;
Delay( 120 - OnTime3 );
}
}
//LED 4
void Time4( uint8_t OnTime4 ){
if( OnTime4 > 0 ) {
PORTC = 0x00;
Delay( OnTime4 );
}
if( OnTime4 < 120 ) {
PORTC = 0x08;
Delay( 120 - OnTime4 );
}
}
int main()
{
uint8_t Level;
uint8_t Level2;
uint8_t Level3;
uint8_t Level4;
DDRC = 0xFF; // alles auf Ausgang
Level = 0;
Level2 = 0;
Level3 = 0;
Level4 = 0;
while(1){
//LED 1
while(Level >0 ){
Time1( Level ); // Obere Grenze erreicht ?
Level -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level <=120 ){
Time1( Level );
Level += 1;} // LED 1 soll heller werden
//LED 2
while(Level2 > 0){
Time2( Level2 ); // Obere Grenze erreicht ?
Level2 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level2 <= 120){
Time2( Level2 );
Level2 += 1;} // LED 2 soll heller werden
//LED 3
while(Level3 >0 ){
Time3( Level3 ); // Obere Grenze erreicht ?
Level3 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level3 <=120 ){
Time3( Level3 );
Level3 += 1;} // LED 3 soll heller werden
//LED 4
while(Level4 > 0){
Time4( Level4 ); // Obere Grenze erreicht ?
Level4 -=1;} // Ja: Auf dunkler werden umschalten
// _delay_ms(delay2);
while(Level4 <= 120){
Time4( Level4 );
Level4 += 1;} // LED 4 soll heller werden
}
}
Wenn ich allerdings ein neues AVR GCC Projekt starte und genau den selben Code (also einen von den beiden) rein kopiere, (code wurde nicht verändert), dann dimmen die LED's nicht mehr so wie vorhin.
Die LED's dimmen normal so (richtig):
(a)
LED 1 ein , langsam ausdimmen
LED 2 ein , langsam ausdimmen
LED 3 ein , langsam ausdimmen
LED 4 ein , langsam ausdimmen
(b)
LED 1 langsam eindimmen, dann langsam ausdimmen
LED 2 langsam eindimmen, dann langsam ausdimmen
LED 3 langsam eindimmen, dann langsam ausdimmen
LED 4 langsam eindimmen, dann langsam ausdimmen
LED 1 langsam eindimmen, dann langsam ausdimmen
Immer so weiter: LED langsam eindimmen, dann langsam ausdimmen.
Der erste Durchgang (a) wird nur einmal ausgeführt dann immer mit (b) weiter.
wenn ich aber wie gesagt den selben Code kopiere, dann dimmen die LED's so(falsch):
LED 1 ein dann einmal ausblinken dann lange Pause, Pause wird mit jeden Blink vorgang immer kürzer, bis dunkel. weiter mit LED 2.
Ich weis nicht wie das genau passieren kann denn es wird einfach die verzögerung erhöht, richtiger weise sind es 100 us, dieser Takt wird einfach immer schneller bis die LED schliesslich aus ist dann weiter mit LED 2.
Ich habe alles beachtet bei den Kompilierungsoptionen wurde der ATmega88 ausgewählt bei AVRDude auch ATmega88 ich habe nichts verändert beim kopierten Code.
Aber wenn ich einen neuen Code schreibe zb. Irgend etwas mit Schaltern wo nichts mit dimmen ist, dann klappt alles.
Aber wiso nicht beim kopierten Code ?
Das habe ich schon oft gemacht wenn ich einen Code in mehreren ausführungen brauche zb. einmal mit 2 und einmal mit 4 LED's.
Ich hoffe jemand kann mir helfen.
Danke schonmal für die Hilfe.
Gruss rob_88_20p