mikrocontroller.net

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


Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h> //Controllerspezifikationenen
#include <stdlib.h> //Standard Library
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 3686400UL // Quarz mit 3.6864 Mhz
#endif
#include <util/delay.h> //Verz�gerungen max 71ms -->262.14/3.6864
//-------------------------------------------------------------------------
int main(void)
{
  int i;
  int switchtime=12000;// ms/10
  int daytime=30000;// ms/10
  int nighttime=30000;// ms/10
  int now;
  DDRA=0b11111111;
  DDRB=0b11111111;
  DDRC=0b11111111;
  DDRD=0b11111111;
  //Tag-Nacht-Schleife
  while(1)
  {
    int remaining[32];// 32 Lichter
    //Nacht
    for(i=0;i<nighttime;i++)
    {
      _delay_ms(10);
    }
    //�bergang
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
    srand(remaining[10]);
    for(i=0;i<32;i++)
    {
      remaining[i] = rand()%switchtime;
    }
    for(now=0;now<switchtime;now++)
    {
      for(i=0;i<8;i++)// alle am Port A
      {
        if(remaining[i]==now)
        {
              PORTA|=(1<<i);
        }
          }
      for(i=0;i<8;i++)// alle am Port B
      {
        if(remaining[i+8]==now)
        {
              PORTB|=(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port C
      {
        if(remaining[i+16]==now)
        {
          PORTC|=(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port D
      {
        if(remaining[i+24]==now)
        {
          PORTD|=(1<<i);
        }
      }
    _delay_ms(10);
    }
    //Tag
    for(i=0;i<daytime;i++)
    {
      _delay_ms(10);
    }
    //�bergang
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
    for(i=0;i<32;i++)
    {
      remaining[i] = rand()%(switchtime+1);
    }
    for(now=0;now<switchtime;now++)
    {
      for(i=0;i<8;i++)// alle am Port A
      {
        if(remaining[i]==now)
        {
              PORTA|=(0<<i);
        }
          }
      for(i=0;i<8;i++)// alle am Port B
      {
        if(remaining[i+8]==now)
        {
              PORTB|=(0<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port C
      {
        if(remaining[i+16]==now)
        {
          PORTC|=(0<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port D
      {
        if(remaining[i+24]==now)
        {
          PORTD|=(0<<i);
        }
      }
    _delay_ms(10);
    }
  }
}

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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTD|=(0<<i);

Das geht so nicht. Du kannst keine 0 schieben.

Autor: Bastler II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht schon ;-)

PORTD |= 0;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastler II wrote:

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

Oder kürzer:
PORTD = PORTD;

Soll heißen: unsinnige Operation.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Christian Rutschmann (bqzero)
Datum:

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

Ja kommt hin. versuchs mal

Autor: Christian Rutschmann (bqzero)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Wie sieht dein Programm jetzt aus?

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also nun sieht mein script so aus:
#include <avr/io.h> //Controllerspezifikationenen
#include <stdlib.h> //Standard Library
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 3686400UL // Quarz mit 3.6864 Mhz
#endif
#include <util/delay.h> //Verz�gerungen max 71ms -->262.14/3.6864
//-------------------------------------------------------------------------
int main(void)
{
  int i;
  int switchtime=12;// ms/10
  int daytime=30;// ms/10
  int nighttime=30;// ms/10
  int now;
  DDRA=0b11111111;
  DDRB=0b11111111;
  DDRC=0b11111111;
  DDRD=0b11111111;
  //Tag-Nacht-Schleife
  while(1)
  {
    int remaining[32];// 32 Lichter
    //Nacht
    for(i=0;i<nighttime;i++)
    {
      _delay_ms(10);
    }
    //�bergang
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
    for(i=0;i<32;i++)
    {
      remaining[i] = rand()%switchtime;
    }
    for(now=0;now<switchtime;now++)
    {
      for(i=0;i<8;i++)// alle am Port A
      {
        if(remaining[i]==now)
        {
              PORTA|=(1<<i);
        }
          }
      for(i=0;i<8;i++)// alle am Port B
      {
        if(remaining[i+8]==now)
        {
              PORTB|=(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port C
      {
        if(remaining[i+16]==now)
        {
          PORTC|=(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port D
      {
        if(remaining[i+24]==now)
        {
          PORTD|=(1<<i);
        }
      }
    _delay_ms(10);
    }
    //Tag
    for(i=0;i<daytime;i++)
    {
      _delay_ms(10);
    }
    //�bergang
    // f�r jedes Licht mal eine zuf�llig Zeitdauer festlegen
    for(i=0;i<32;i++)
    {
      remaining[i] = rand()%(switchtime+1);
    }
    for(now=0;now<switchtime;now++)
    {
      for(i=0;i<8;i++)// alle am Port A
      {
        if(remaining[i]==now)
        {
            PORTA&=~(1<<i);
        }
       }
      for(i=0;i<8;i++)// alle am Port B
      {
        if(remaining[i+8]==now)
        {
            PORTB&=~(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port C
      {
        if(remaining[i+16]==now)
        {
          PORTC&=~(1<<i);
        }
      }
      for(i=0;i<8;i++)// alle am Port D
      {
        if(remaining[i+24]==now)
        {
          PORTD&=~(1<<i);
        }
      }
    _delay_ms(10);
    }
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rutschmann (bqzero)
Datum:

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

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na daran, das es viel zu schnell läuft..........

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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
  int i;
  int switchtime=12000;// ms/10
  int daytime=30000;// ms/10
  int nighttime=30000;// ms/10

oder hab ich da einen fehler?

Autor: Knut J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Knut J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?!

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
taktfrequenz stimmt, aber optimierunge an?!?!? wie was wo? bin da noch 
was neu

Autor: Knut J. (Gast)
Datum:

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

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Knut J. (Gast)
Datum:

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

Autor: Knut J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.......;-)

Autor: Christian Rutschmann (bqzero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA HAST JA EIGENTLICH RECHT.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.