Forum: Mikrocontroller und Digitale Elektronik C-Script sieht den Wald vor lauter Bäumen nicht


von Christian R. (bqzero)


Lesenswert?

Hallo Zusammen

Hab ein problem mit meinem script. Eigentlich sollte es die I/O-Ports 
zufällig high beziehungsweis low stellen. meiner meinung nach sollte das 
so funktionieren.
1
#include <avr/io.h> //Controllerspezifikationenen
2
#include <stdlib.h> //Standard Library
3
#ifndef F_CPU
4
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
5
#define F_CPU 3686400UL // Quarz mit 3.6864 Mhz
6
#endif
7
#include <util/delay.h> //Verz�gerungen max 71ms -->262.14/3.6864
8
//-------------------------------------------------------------------------
9
int main(void)
10
{
11
  int i;
12
  int switchtime=12000;// ms/10
13
  int daytime=30000;// ms/10
14
  int nighttime=30000;// ms/10
15
  int now;
16
  DDRA=0b11111111;
17
  DDRB=0b11111111;
18
  DDRC=0b11111111;
19
  DDRD=0b11111111;
20
  //Tag-Nacht-Schleife
21
  while(1)
22
  {
23
    int remaining[32];// 32 Lichter
24
    //Nacht
25
    for(i=0;i<nighttime;i++)
26
    {
27
      _delay_ms(10);
28
    }
29
    //�bergang
30
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
31
    srand(remaining[10]);
32
    for(i=0;i<32;i++)
33
    {
34
      remaining[i] = rand()%switchtime;
35
    }
36
    for(now=0;now<switchtime;now++)
37
    {
38
      for(i=0;i<8;i++)// alle am Port A
39
      {
40
        if(remaining[i]==now)
41
        {
42
              PORTA|=(1<<i);
43
        }
44
          }
45
      for(i=0;i<8;i++)// alle am Port B
46
      {
47
        if(remaining[i+8]==now)
48
        {
49
              PORTB|=(1<<i);
50
        }
51
      }
52
      for(i=0;i<8;i++)// alle am Port C
53
      {
54
        if(remaining[i+16]==now)
55
        {
56
          PORTC|=(1<<i);
57
        }
58
      }
59
      for(i=0;i<8;i++)// alle am Port D
60
      {
61
        if(remaining[i+24]==now)
62
        {
63
          PORTD|=(1<<i);
64
        }
65
      }
66
    _delay_ms(10);
67
    }
68
    //Tag
69
    for(i=0;i<daytime;i++)
70
    {
71
      _delay_ms(10);
72
    }
73
    //�bergang
74
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
75
    for(i=0;i<32;i++)
76
    {
77
      remaining[i] = rand()%(switchtime+1);
78
    }
79
    for(now=0;now<switchtime;now++)
80
    {
81
      for(i=0;i<8;i++)// alle am Port A
82
      {
83
        if(remaining[i]==now)
84
        {
85
              PORTA|=(0<<i);
86
        }
87
          }
88
      for(i=0;i<8;i++)// alle am Port B
89
      {
90
        if(remaining[i+8]==now)
91
        {
92
              PORTB|=(0<<i);
93
        }
94
      }
95
      for(i=0;i<8;i++)// alle am Port C
96
      {
97
        if(remaining[i+16]==now)
98
        {
99
          PORTC|=(0<<i);
100
        }
101
      }
102
      for(i=0;i<8;i++)// alle am Port D
103
      {
104
        if(remaining[i+24]==now)
105
        {
106
          PORTD|=(0<<i);
107
        }
108
      }
109
    _delay_ms(10);
110
    }
111
  }
112
}

leider ist mein mikro nicht der gleichen ansicht ;-)
falls mir jemand helfen kann wär ich froh. seh den wald nämlich auch 
nicht mehr.

Gruss Christian

von Bastler (Gast)


Lesenswert?

PORTD|=(0<<i);

Das geht so nicht. Du kannst keine 0 schieben.

von Bastler II (Gast)


Lesenswert?

Geht schon ;-)

PORTD |= 0;

von Karl H. (kbuchegg)


Lesenswert?

> srand(remaining[10]);

Lass den Zufallszahlengenerator in Ruhe.
srand wird nur einmal aufgerufen, nämlich ganz am Anfang
des Programmlaufs. Danach lässt du den Generator seine
Arbeit tun ohne im ständig dazwischenzupfuschen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bastler II wrote:

> Geht schon ;-)
>
> PORTD |= 0;

Oder kürzer:
1
PORTD = PORTD;

Soll heißen: unsinnige Operation.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ach so, was du vermutlich eigentlich wolltest:
1
PORTD &= ~(1 << i);

von Christian R. (bqzero)


Lesenswert?

Jörg Wunsch wrote:
> Ach so, was du vermutlich eigentlich wolltest:
>
>
1
PORTD &= ~(1 << i);

Ja kommt hin. versuchs mal

von Christian R. (bqzero)


Lesenswert?

okay habs getestet, aber funktioniert immer noch nicht.
sonst noch ideen?????

von Karl H. (kbuchegg)


Lesenswert?

Christian Rutschmann wrote:
> okay habs getestet, aber funktioniert immer noch nicht.
> sonst noch ideen?????

Wie sieht dein Programm jetzt aus?

von Christian R. (bqzero)


Lesenswert?

also nun sieht mein script so aus:
1
#include <avr/io.h> //Controllerspezifikationenen
2
#include <stdlib.h> //Standard Library
3
#ifndef F_CPU
4
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
5
#define F_CPU 3686400UL // Quarz mit 3.6864 Mhz
6
#endif
7
#include <util/delay.h> //Verz�gerungen max 71ms -->262.14/3.6864
8
//-------------------------------------------------------------------------
9
int main(void)
10
{
11
  int i;
12
  int switchtime=12;// ms/10
13
  int daytime=30;// ms/10
14
  int nighttime=30;// ms/10
15
  int now;
16
  DDRA=0b11111111;
17
  DDRB=0b11111111;
18
  DDRC=0b11111111;
19
  DDRD=0b11111111;
20
  //Tag-Nacht-Schleife
21
  while(1)
22
  {
23
    int remaining[32];// 32 Lichter
24
    //Nacht
25
    for(i=0;i<nighttime;i++)
26
    {
27
      _delay_ms(10);
28
    }
29
    //�bergang
30
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
31
    for(i=0;i<32;i++)
32
    {
33
      remaining[i] = rand()%switchtime;
34
    }
35
    for(now=0;now<switchtime;now++)
36
    {
37
      for(i=0;i<8;i++)// alle am Port A
38
      {
39
        if(remaining[i]==now)
40
        {
41
              PORTA|=(1<<i);
42
        }
43
          }
44
      for(i=0;i<8;i++)// alle am Port B
45
      {
46
        if(remaining[i+8]==now)
47
        {
48
              PORTB|=(1<<i);
49
        }
50
      }
51
      for(i=0;i<8;i++)// alle am Port C
52
      {
53
        if(remaining[i+16]==now)
54
        {
55
          PORTC|=(1<<i);
56
        }
57
      }
58
      for(i=0;i<8;i++)// alle am Port D
59
      {
60
        if(remaining[i+24]==now)
61
        {
62
          PORTD|=(1<<i);
63
        }
64
      }
65
    _delay_ms(10);
66
    }
67
    //Tag
68
    for(i=0;i<daytime;i++)
69
    {
70
      _delay_ms(10);
71
    }
72
    //�bergang
73
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
74
    for(i=0;i<32;i++)
75
    {
76
      remaining[i] = rand()%(switchtime+1);
77
    }
78
    for(now=0;now<switchtime;now++)
79
    {
80
      for(i=0;i<8;i++)// alle am Port A
81
      {
82
        if(remaining[i]==now)
83
        {
84
            PORTA&=~(1<<i);
85
        }
86
       }
87
      for(i=0;i<8;i++)// alle am Port B
88
      {
89
        if(remaining[i+8]==now)
90
        {
91
            PORTB&=~(1<<i);
92
        }
93
      }
94
      for(i=0;i<8;i++)// alle am Port C
95
      {
96
        if(remaining[i+16]==now)
97
        {
98
          PORTC&=~(1<<i);
99
        }
100
      }
101
      for(i=0;i<8;i++)// alle am Port D
102
      {
103
        if(remaining[i+24]==now)
104
        {
105
          PORTD&=~(1<<i);
106
        }
107
      }
108
    _delay_ms(10);
109
    }
110
  }
111
}

von Karl H. (kbuchegg)


Lesenswert?

Das sieht erst mal beim drüber lesen nicht so schlecht aus.
Was muss ich mir unter 'funktioniert nicht' vorstellen.
Geht der erste Teil, sprich alle Led nacheinander an?

PS: Das was du da hast nennt man ein Programm und kein Skript.
Der Begriff 'Skript' wird bei interpretierender Programmierung
benutzt.

von Christian R. (bqzero)


Lesenswert?

okay problem gelöst. funktioniert doch so. aber vmlab hatte gerade ein 
problem. also läuft nun.

von Christian R. (bqzero)


Lesenswert?

hallo bins nochmal.

Habe das Programm mit VMlab getestet und es funktioniert, aber wenn ich 
es auf meinen mikro lade funktioniert es nicht. habe nur alle leds 
leuchten. An was kann das liegen?

Gruss bqzero

von Knut J. (Gast)


Lesenswert?

Na daran, das es viel zu schnell läuft..........

von Christian R. (bqzero)


Lesenswert?

Knut J. wrote:
> Na daran, das es viel zu schnell läuft..........

wieso zu schnell??? hast du da eine konkrete idee? mit dem takt un allem 
sollte doch alles stimmen? sprich
1
  int i;
2
  int switchtime=12000;// ms/10
3
  int daytime=30000;// ms/10
4
  int nighttime=30000;// ms/10

oder hab ich da einen fehler?

von Knut J. (Gast)


Lesenswert?

Schau doch mal auf die for-Schleifen....
Du machst irgendwas an den LEDs rum, wartest dann 10 ms und machst 
wieder an den LEDs rum.....

Was schätzt du, mit welcher Frequenz die blinken ?

von Christian R. (bqzero)


Lesenswert?

ca 100Hz? aber die blinken ja nicht alles gleichzeitig von der ersten 
bis zur letzten led verstreichen ja 300000ms respektive 5 minuten oder. 
dan sollte trotzdem was zu sehen sein?

von Knut J. (Gast)


Lesenswert?

>dan sollte trotzdem was zu sehen sein?

Hatte/habe keinen Bock, so genau hinzuschauen  ;-)......
Mach das delay doch einfach mal länger, dann siehst du, was ab geht
Ach ja, Optimierung ist an?! Taktfrequenz stimmt (Fuses)?!

von Christian R. (bqzero)


Lesenswert?

taktfrequenz stimmt, aber optimierunge an?!?!? wie was wo? bin da noch 
was neu

von Knut J. (Gast)


Lesenswert?

delay funktioniert nur bei eingeschalteter Optimierung richtig!
(sonst gibt es auch eine Warnung)

von Christian R. (bqzero)


Lesenswert?

okay hab ich nicht gewusst. kannst du mir evt sagen wie ich diese 
optimierung einstelle? hab vmlaab oder Avr studio. oder kann ich dies in 
meinem programm?

von Knut J. (Gast)


Lesenswert?

vmlab kenne ich nicht, in avrstudio an den Eigenschaften des Projektes 
oder im makefile

von Knut J. (Gast)


Lesenswert?

Nachtrag: ich mag diese ständigen Hinweise dieser Art hier im Forum 
eigentlich auch nicht, aber für solche Fragen könntest du ruhig mal die 
Suche hier im Forum bzw. die Doku zu AVR-Studio bemühen.......;-)

von Christian R. (bqzero)


Lesenswert?

JA HAST JA EIGENTLICH RECHT.

Bin am arbeiten und hätte eigentlich gar keine Ziet dazu, etwas zu 
programmieren

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.