PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED's Dimmen mit ATmega88 funktioniert... aber nicht immer.



rob_88_20p
22.03.2009, 19: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

Hubert.G
23.03.2009, 09:16
Hast du auch kontrolliert ob die gleiche Optimierung eingestellt ist, eventuell mal ohne Optimierung probieren.
Oder hast du aus den µsec vielleicht msec gemacht?
Divide Clock by8 nicht abgeschalten.
Oder fasche Taktquelle eingestellt

rob_88_20p
23.03.2009, 11:34
Also ich habe kontrolliert das es wirklich us sind und nicht ms.
Das kann also nicht die Ursache sein.

Was genau meinst Du mit den Optimierungen ist das das hier ?:
http://netzdateien.ne.funpic.de/AVR.bmp

Das ist übrigens von einem Code der funktioniert. Ich habe bei diesen einstellungen nichts geändert ausser dass ich den ATmega88 gewählt habe.
Ich weis garnicht was man bei den häckchen einstellen kann, ausser das ich eines haben muss und das wäre "Create hex File" sonst kann ich das nicht auf den uC brutzeln.

Hubert.G
23.03.2009, 17:17
Zwei Felder unter dem Mega88 seht "Optimization", dort stellst du den Optimierungsgrad ein.
Sonst ist es schwer den Unterschied zu erkennen.

rob_88_20p
24.03.2009, 10:02
was für einen Grad soll ich den da einstellen ich kan da ja wählen

Sorry, hab noch nicht so viel erfarung damit

aber wiso muss ich das jetzt plötzlich machen sonsts hats ja immer funktioniert ?

Hubert.G
24.03.2009, 10:10
Ich stelle immer -0s ein. Es muss aber nicht der Fehler sein, wäre nur eine Möglichkeit.

rob_88_20p
24.03.2009, 10:27
Danke
ich probiers mal grade schnell meld mich dann wieder

rob_88_20p
24.03.2009, 10:36
hey
vielen Dank

echt geil ich liebe dieses Forum
Ich habe zwar nichts daran geändert aber komischer weise sind bei alles neuen Codes die ich gemacht habe -0O gewählt
na toll jetzt kann ich alle projekte ändern super !!!¨

aber echt
vielen Dank Hubert