www.mikrocontroller.net

Forum: Compiler & IDEs C Programmierung Schleife


Autor: IWANN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, habe ein Problemm beim programmieren, bin auch anfänger :-)

Habe ein atmega8 mit 10 LEDs jeweils eine an einem Ausgang. Jetzt will 
ich mit einer schleife die Leds in reihenfolge nach einander 
einschalten, wenn alle leuchten, dann wieder nacheinander ausschalten. 
Folgendes Programm:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/delay.h>    // definiert _delay_ms()



void delay_ms(int ms)
{
  int t;
  for(t=0; t<=ms; t++)
  _delay_ms(1);
}


int8_t array[10] ={PB7, PD5, PD6, PD7, PB0, PB1, PB2, PB3, PB4, PB5};


void main()
{
  //Port C auf Ausgang schalten (Auswahl)
  DDRB = 0xFF;
  //Port A auf Ausgang schalten (Daten)
  //DDRC = 0xFF;
  DDRD = 0xFF;
  DDRC = 0b00000000;

while(1){

unsigned char i=0;

  while(i<10){

    i |= (1 << array[i]);   // unsicher ob die schreibweise
          //möglich ist
    i++;
    _delay_ms(50);
        }


    while(i>0){

      i |= (1 << array[i]);
      i++;
      _delay_ms(50);
        }

    }



}




Problem ist halt dass die Leds nich in einer sinnvollen reihenfolge 
angelötet sind. IChhab jetzt keine ahnung wie ich mittels einer schleife 
die Leds nacheinander ein bzw ausschalten kann. Hab gedacht dass es mit 
einem array klappen könnte. Mit meinem Programm passiert aber nix :-)
für jede hilfe dankbar :-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IWANN wrote:
> int8_t array[10] ={PB7, PD5, PD6, PD7, PB0, PB1, PB2, PB3, PB4, PB5};
Speicher direkt die Bitmasken ab.

>     i |= (1 << array[i]);   // unsicher ob die schreibweise
>           //möglich ist
Möglich ja, aber auf dem AVR arschlahm, denn der kann immer nur um 1 
schieben.

Die Idee mit dem Array ist übrigens ordentlich :-)

Autor: IWANN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Speicher direkt die Bitmasken ab.

was bedeutet das ? :-)  voll anfänger ^^

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unter anderen Fehlern:
wenn du was an den Ausgängen sehen willst,
musst du schon auch mal was auf PORTB schreiben

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er meinte so:
int8_t bitmask[10] ={0x80, 0x20, 0x40, 0x10, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20};

volatile unsigned char * ledport[10] = {&PORTB, &PORTD, &PORTD, &PORTD,
                   &PORTD, &PORTB, &PORTB, &PORTB, &PORTB, &PORTB }

int main()
{
    unsigned char i;
    // DDRs setzen überlaß ich dem Leser als Übung

    for(i=0; 1 ; i = (i+1) % 10; ) {
        *(ledport[i]) |= bitmask[i];
        _delay_ms(50);
        *(ledport[i]) &= ~bitmask[i];
    }
    // Abwechselndes Vor- und Rückwärtslaufen überlaß ich dem Leser
}

Autor: IWANN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhh :-)  die idee ist gut :-)  das probier ich mal aus :-)  dankee :-)

Autor: IWANN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt so gemacht


#include <inttypes.h>
#include <avr/io.h>
#include <avr/delay.h>    // definiert _delay_ms()



void delay_ms(int ms)
{
  int t;
  for(t=0; t<=ms; t++)
  _delay_ms(1);
}


int8_t array[10] ={PB7, PD5, PD6, PD7, PB0, PB1, PB2, PB3, PB4, PB5};

volatile unsigned char * ledport[10] = {&PORTB, &PORTD, &PORTD, &PORTD,
                   &PORTB, &PORTB, &PORTB, &PORTB, &PORTB, &PORTB };

//int8_t bitmask[10] ={0x80, 0x20, 0x40, 0x10, 0x01, 0x02, 0x04, 0x08, 
0x10, 0x20};



void main()
{
  DDRB = 0xFF;
  DDRD = 0xFF;
  DDRC = 0b00000000;

unsigned short speed=50;


while(1){
lable:


if((PINC & 0x08) !=0) {

while(1) {

if((PINC & 0x04) !=0) {
  goto lable;       }

unsigned char i=0;

  while(i<10){

  *(ledport[i]) |= (1 << array[i]);

    i++;
    if ( (speed>4 && ( PINC & 0x20 ) != 0 ) ) {

          speed = speed-5;
            }

          if((PINC & 0x10) !=0) {
            speed = speed +1;
              }
      _delay_ms(speed);
          }
    i=0;

    while(i<10){

      *(ledport[i]) &= ~(1 << array[i]);
      i++;
      if ( (speed>4 && (PINC & 0x20 ) != 0 )) {
          speed = speed-5;
            }

          if((PINC & 0x10) !=0) {
            speed = speed +1;
              }
      _delay_ms(speed);
        }


}

}

    }



}


Läuft sehr gut :-)  verbraucht aber 50% des Speichers, ich hab da jetzt 
keine Erfahrung aber kann mir schon vorstellen, dass es garnicht optimal 
ist :-)

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast vergessen in den Zeilen
_delay_ms(speed);

den führenden Unterstrich zu entfernen, um tatsächlich deine eigene 
delay_ms aufzurufen. Da wird der Speicherverbrauch herkommen.

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf goto verzichtet man idR! In deinem Fall geht's sicher auch ohne.

Wieviele verschiedene Datentypen benützt Du eigentlich? Brauchst Du das 
wirklich?

Autor: IWANN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Du hast vergessen in den Zeilen _delay_ms(speed); den führenden Unterstrich zu 
entfernen

WOW  da hab ich den strich weggemacht und jetzt verbrauche ich nur noch 
4,8% unglaublich, wie kommt denn das verstehe ich garnicht :-)


>>Wieviele verschiedene Datentypen benützt Du eigentlich? Brauchst Du das
wirklich?

Meinst du die variable deklaration oder den ganze rest auch ?  welchen 
Datentyp soll ich denn am besten nutzen ?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IWANN wrote:
>>> Du hast vergessen in den Zeilen _delay_ms(speed); den führenden Unterstrich zu
> entfernen
>
> WOW  da hab ich den strich weggemacht und jetzt verbrauche ich nur noch
> 4,8% unglaublich, wie kommt denn das verstehe ich garnicht :-)
_delay_ms rechnet mit Fließkommazahlen; wenn du einen konstanten Wert 
als Argument mitgibst, fliegt das aber bei der Optimierung des Compilers 
alles wieder raus. Das geht aber logischerweise nur, wenns wirklich ein 
konstanter Wert ist :-)


>>>Wieviele verschiedene Datentypen benützt Du eigentlich? Brauchst Du das
> wirklich?
>
> Meinst du die variable deklaration oder den ganze rest auch ?  welchen
> Datentyp soll ich denn am besten nutzen ?
Ersetz inttypes.h durch stdint.h und ersetze den ganzen 'char', 'long', 
'int'-Kram durch die int_xx/uint_xx-Typen, dann stimmts wieder und ist 
auch sicher.

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.