Forum: Compiler & IDEs C Programmierung Schleife


von IWANN (Gast)


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 :-)

von Sven P. (Gast)


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 :-)

von IWANN (Gast)


Lesenswert?

>>Speicher direkt die Bitmasken ab.

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

von Walter (Gast)


Lesenswert?

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

von der mechatroniker (Gast)


Lesenswert?

Er meinte so:
1
int8_t bitmask[10] ={0x80, 0x20, 0x40, 0x10, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20};
2
3
volatile unsigned char * ledport[10] = {&PORTB, &PORTD, &PORTD, &PORTD,
4
                   &PORTD, &PORTB, &PORTB, &PORTB, &PORTB, &PORTB }
5
6
int main()
7
{
8
    unsigned char i;
9
    // DDRs setzen überlaß ich dem Leser als Übung
10
11
    for(i=0; 1 ; i = (i+1) % 10; ) {
12
        *(ledport[i]) |= bitmask[i];
13
        _delay_ms(50);
14
        *(ledport[i]) &= ~bitmask[i];
15
    }
16
    // Abwechselndes Vor- und Rückwärtslaufen überlaß ich dem Leser
17
}

von IWANN (Gast)


Lesenswert?

ahhh :-)  die idee ist gut :-)  das probier ich mal aus :-)  dankee :-)

von IWANN (Gast)


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 :-)

von der mechatroniker (Gast)


Lesenswert?

Du hast vergessen in den Zeilen
1
_delay_ms(speed);

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

von Mano W. (Firma: ---) (manow)


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?

von IWANN (Gast)


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 ?

von Sven P. (Gast)


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.

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.