Forum: Mikrocontroller und Digitale Elektronik Problem mit Code. Neuling braucht Hilfe.


von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Vorab: Ich bin absoluter Neuling. Ich habe einen Atmega8 und möchte 
damit gerne RGB LEDs beschalten. Angefangen hab ich damit, ein Programm 
(Anhang) für einen Regenbogenlauf der LED zu schreiben. Leider habe ich 
damit ein kleines Problem. Zum testen habe ich noc heinzelne LEDs 
angeschlossen.
Und zwar funktionieren die Stufen 3 und 4 nicht sauber. Die grüne LED 
spinnt rum. Um dem Problem auf den Grund zu gehen, habe ich mir den 
Ausgang für grün mit nem Oszilloskop angeguckt.
Bei den anderen Stufen sieht es so aus:

______->___...___->

......->...___...->_______

Bei der grünen so:


......->__..___..___->__________

______->____________->__________

Leider werden die Leerzeichen automatisch entfernt. Da wo Punkte sind 
ist nichts. Ich hoffe das ist irgendwie verständlich.

Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht. 
es liegt am Programm. Findet jemand den Fehler und kann mir helfen?

Danke im voraus.

Gruß Sebastian

von Falk B. (falk)


Lesenswert?

@  Sebastian (Gast)

>    * Code.txt (1,9 KB, 1 Downloads)

Das nächste mal einfach als .c Datei posten, siehe netiquette.

>Irgendwas stimmt da nicht. Habe schon die LED sowie den Port getauscht.
>es liegt am Programm. Findet jemand den Fehler und kann mir helfen?

Das Konzept deiner hangestrickten PWM durchschaue ich auf die Schnelle 
nicht. Mein Tipp. Dimme erstmal nur eine Farbe.

MFG
Falk

von Peter D. (peda)


Lesenswert?

Man kann PWM höllisch kompliziert machen und dann wegschmeißen, weil es 
nicht geht.

Oder man nimmt gleich einen Timerinterrupt für die PWM und läßt das Main 
nur die Ablaufsteuerung machen.


Peter

von Sebastian (Gast)


Lesenswert?

Danke für die schnellen Antworten.
@ Falk: eine Farbe dimmen funktioniert. alle anderen Stufen gehen auch. 
rot an, blau fährt hoch. alles kein problem. nur der grüne spinnt beim 
hochfahren und bei dauer an. beim rutnerfahren des grünen ist alles ok.

@Peter: Verstehe ich leider nicht. Wie gesagt ich hab da gerade erst mit 
angefangen und bin froh dass ich das was ich bisher habe hinbekommen 
hab.

Also noch mal zur Erklärung was ich da versucht habe. Ich hab für einen 
Regenbogendurchlauf die Schleife mit k benutzt. Dadurch wird wird die 
Farbzusammensetzung geändert. Bei Stufe 1 läuft der von 0 bis 255. Dabei 
ist rot dauerhaft an und blau wird hochgedimmt. dies übernimmt die 
schleife mit i. wenn k klein ist, sprich die gemischte farbe ziemlich 
nah bei rot ist, wird blau weniger häufig zugeschaltet als bei k bei 
255. Die i Schleife pulst die zu dimmende LED. Dadurch wird die LED hoch 
bzw rutner gedimmt.

Gruß Sebastian

von Falk B. (falk)


Lesenswert?

Mir schwahnt schlimmes. Deine If Schachtelungen stimmen wahrscheinlich 
nicht, Kein Wunder bei DER Formatierung.

Mach es mal hübsch und schau es dir an und poste noch einmal.

http://www.mikrocontroller.net/articles/Strukturierte_Programmierung_auf_Mikrocontrollern#Formatierung_des_Quelltextes

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

So. ich hoff das ist besser so.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Habs mal lesbar gemacht. Jetzt kann man erahnen, was du vorhast:
1
/*
2
 * AVRGCC1.c
3
 *
4
 * Created: 22.03.2012 21:17:34
5
 *  Author: Besitzer
6
 */
7
8
#define F_CPU   1000000UL
9
#define RED         PC5
10
#define GREEN       PC4
11
#define BLUE        PC3
12
#define RGB_PORT  PORTC
13
#define RGB_DDR    DDRC
14
15
#include <stdint.h>
16
#include <avr/io.h>
17
#include <util/delay.h>
18
19
20
int main(void)
21
{
22
  uint16_t i=0;
23
  uint16_t k=0;
24
25
  RGB_DDR = 255;
26
27
  while(1) {
28
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);       //alle aus
29
    _delay_ms(1000);                                        //pause
30
    RGB_PORT |=  _BV(RED) |  _BV(GREEN) |  _BV(BLUE);       //alle an
31
    _delay_ms(1000);                                        //pause
32
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);       //alle aus
33
    _delay_ms(1000);                                        //alle an
34
35
    for (k=0; k<=1530; k++) {                               //Zählschleife, eine Regebogendurchlauf
36
      for (i=0; i<=255; i++) {                              //Zählschleife, hoch, runter dimmen
37
        if (0<k && k<=255)  {                               //Stufe 1: rot an, blau hochdimmen
38
          RGB_PORT |= _BV(RED);
39
          if (i<=k)             RGB_PORT |= _BV(BLUE);
40
          else                  RGB_PORT &= ~_BV(BLUE);
41
        }
42
        else if (255<k && k<=510) {                  //Stufe 2: blau an, rot runter
43
          RGB_PORT |=  _BV(BLUE);
44
          if (!(i<=(k-255)))    RGB_PORT |=  _BV(RED); //!
45
          else                  RGB_PORT &= ~_BV(RED);
46
        }
47
        else if (510<k && k<=765) {                  //Stufe 3: blau an, grün hoch
48
          RGB_PORT |= _BV(BLUE);
49
          if (i<=(k-510))       RGB_PORT |=  _BV(GREEN);
50
          else                  RGB_PORT &= ~_BV(GREEN);
51
        }
52
        else if (765<k && k<=1020) {                  //Stufe 4: grün an, blau runter
53
          RGB_PORT |= _BV(GREEN);
54
          if (!(i<=(k-765)))    RGB_PORT |=  _BV(BLUE); //!
55
          else                  RGB_PORT &= ~_BV(BLUE);
56
        }
57
        else if (1020<k && k<=1275) {                //Stufe 5: grün an, rot hoch
58
          RGB_PORT |= _BV(GREEN);
59
          if (i<=(k-1020))      RGB_PORT |=  _BV(RED);
60
          else                  RGB_PORT &= ~_BV(RED);
61
        }
62
        else if (1275<k && k<=1530) {                  //Stufe 6: rot an, grün runter
63
          RGB_PORT |= _BV(RED);
64
          if (!(i<=(k-1275)))   RGB_PORT |=  _BV(GREEN); //!
65
          else                  RGB_PORT &= ~_BV(GREEN);
66
        }
67
      }
68
    }
69
  }
70
}

von User 0815 (Gast)


Lesenswert?

1
/*
2
* AVRGCC1.c
3
*
4
* Created: 22.03.2012 21:17:34
5
*  Author: Besitzer
6
*/ 
7
#define F_CPU 1000000UL
8
#define RED     PC5
9
#define GREEN    PC4
10
#define BLUE     PC3
11
#define RGB_PORT  PORTC
12
#define RGB_DDR    DDRC
13
#include <stdint.h>
14
#include <avr/io.h>
15
#include <util/delay.h>
16
int main(void)
17
{
18
  uint16_t i=0;
19
  uint16_t k=0;
20
21
  RGB_DDR=255;
22
23
  while(1)
24
  {
25
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);      //alle aus
26
    _delay_ms(1000);                      //pause
27
    RGB_PORT |= _BV(RED) | _BV(GREEN) | _BV(BLUE);        //alle an
28
    _delay_ms(1000);                      //pause
29
    RGB_PORT &= ~_BV(RED) & ~_BV(GREEN) & ~_BV(BLUE);      //alle aus
30
    _delay_ms(1000);                      //alle an
31
    
32
    for (k=0;k<=1530;++k)              //Zählschleife, eine Regebogendurchlauf
33
    {
34
      for (i=0;i<=255;++i)              //Zählschleife, hoch, runter dimmen
35
      {
36
        if (0<k && k<=255)              //Stufe 1: rot an, blau hochdimmen
37
        {
38
          RGB_PORT |= _BV(RED);
39
          if (i<=k)
40
          RGB_PORT |= _BV(BLUE);
41
          else
42
          RGB_PORT &= ~_BV(BLUE);
43
        }
44
        else if (255<k && k<=510)            //Stufe 2: blau an, rot runter
45
        {
46
          RGB_PORT |= _BV(BLUE);
47
          if (!(i<=(k-255)))
48
          RGB_PORT |= _BV(RED); //!
49
          else
50
          RGB_PORT &= ~_BV(RED);
51
        }
52
        else if (510<k && k<=765)            //Stufe 3: blau an, grün hoch
53
        {
54
          RGB_PORT |= _BV(BLUE);
55
          if (i<=(k-510))
56
          RGB_PORT |=_BV(GREEN);
57
          else
58
          RGB_PORT &=~_BV(GREEN);
59
        }
60
        else if (765<k && k<=1020)            //Stufe 4: grün an, blau runter
61
        {
62
          RGB_PORT |= _BV(GREEN);
63
          if (!(i<=(k-765)))
64
          RGB_PORT |= _BV(BLUE); //!
65
          else
66
          RGB_PORT &= ~_BV(BLUE);
67
        }
68
        else if (1020<k && k<=1275)            //Stufe 5: grün an, rot hoch
69
        {
70
          RGB_PORT |= _BV(GREEN);
71
          if (i<=(k-1020))
72
          RGB_PORT |= _BV(RED);
73
          else
74
          RGB_PORT &= ~_BV(RED);
75
        }
76
        else if (1275<k && k<=1530)            //Stufe 6: rot an, grün runter
77
        {
78
          RGB_PORT |= _BV(RED);
79
          if (!(i<=(k-1275)))
80
          RGB_PORT |= _BV(GREEN); //!
81
          else
82
          RGB_PORT &= ~_BV(GREEN);
83
        }
84
      }
85
    }
86
  }
87
}

so wäre noch besser, dann hättest du auch selbst deinen { } Klammern 
Fehler gefunden.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

**LOL**

von Sebastian (Gast)


Lesenswert?

jo perfekt danke. es funktioniert :)))

von Falk B. (falk)


Lesenswert?

Wo war jetzt der Fehler?

von remote1 (Gast)


Lesenswert?

ich glaube hinter
1
else if (1275<k && k<=1530)
fehlte ein {

von Falk B. (falk)


Lesenswert?

Hätte da nicht der Compiler meckern müssen, weil eine Klammer auf fehlt?

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> Hätte da nicht der Compiler meckern müssen, weil eine Klammer auf fehlt?
er hat unten ja genug drangezimmert :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.