Auf Register über Laufvariable zugreifen (C)

OP #1084903
Hallo! Habe heute zum ersten Mal versucht einen AVR mit C zu 
programmieren.
Meine C Kenntnisse sind auch noch nicht die Besten, aber ich bin dabei 
zu lernen.
Im Moment spiele ich einfach damit Leds über die Ports ein und 
auszuschalten.

Jetzt meine Frage, kann ich auf ein Register mit einer Laufvariablen 
zugreifen?

Was funktioniert ist der Zugriff über beispielsweise:

DDRB = (1 << DDB0) | (1 << DDB1);

Dann habe ich folgendes versucht:

for (k=0; k<7 ; k=k+2)
{
    DDRB = (1 << DDB(k));
}

Das geht so aber nicht.. Kann ich das irgendwie umschreiben dass es 
funktioniert?

Würde mich über Antworten freuen,

Gruß Stefan
OP
Hallo, Danke für die schnelle Antwort! War ein Schreibfehler, ich wollte 
auf PORTB mit k zugreifen, nicht auf DDRB.
Ich habe gerade ein Lauflicht programmiert, die Leds werden vom AVR auf 
Masse geschaltet und sind mit VCC über Vorwiderstand verbunden.
Das ganze funktioniert auch, gibt es Kritik oder Vorschläge wie man es 
anders/besser programmieren könnte? Hier das Programm:

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 9216000UL     // Quarz mit 9.2160 Mhz
#endif
#include <util/delay.h>


int main (void)
{
  DDRB = 0xff;           // Alle Pins von PortB Ausgang
  int i = 1;             // i für Endlosschleife
  int k;                 // Laufvariable

  while(i==1)
  {
  for (k=0; k<8 ; k++)
  {
  PORTB = 0xff;  // Setzt alle Bits auf High - alle LEDs aus
  PORTB &= ~(1 << k); // löscht nacheinander Bit 0 bis 7 ->LED an
  _delay_ms(100);       // Wartet 100ms
  }

  for (k=6; k>0 ; k--)
  {
  PORTB = 0xff;
  PORTB &= ~(1 << k);
  _delay_ms(100);
  }

  }
}


Gibt es irgendwo so etwas wie eine Befehlreferenz, was für Befehle es 
gibt und wie die genaue Syntax lautet?
Gruß Stefan
Gast
1
  int k;

8 Bits sind genug für k und brauchen weniger Register bzw. Speicher:
1
#include <stdint.h>
2
// ...
3
  uint8_t k;

In stdint.h sind weitere Integertypen int8_t, uint16_t, int16_t,
uint32_t und int32_t definiert, die gerade bei der µC-Programmierung
ganz praktisch sind.

Endlosschleifen wie diese
1
  int i = 1;
2
  while(i==1)

beginnt man besser so:
1
  while(1)

oder so:
1
  for(;;)

Statt
1
  PORTB = 0xff;
2
  PORTB &= ~(1 << k);

besser so:
1
  PORTB = ~(1 << k);
Gast
> Gibt es irgendwo so etwas wie eine Befehlreferenz, was für Befehle es
> gibt und wie die genaue Syntax lautet?

Für C-Sprache und die C-Laufzeitbibliothek gibt es das Buch von
Kernighan und Ritchie und den ISO-Standard 9899, wobei letzterer etwas
schwerer zu lesen ist :)

Für die AVR-Libc, die sich teilweise von der ISO-Standardbibliothek
unterscheidet, gibt es das Manual auf der AVR-Libc-Webseite.

Für I/O-Registernamen und -funktionen der AVR-Controller gibt es die
jeweiligen Datenblätter von Atmel.

For die Maschinenbefehler der AVRs (Assembler) gibt es das Dokument
"8-bit AVR Instruction Set" von Atmel.

Das dürfte das meiste an Informationen sein, was man für die
AVR-Programmierung braucht.
OP
Ok, Vielen Dank, finde solche Tips sehr hilfreich, als Anfänger weiß man 
oft gar nicht wo man anfangen und nachschauen soll.
Eine Frage noch, kennt ihr Seiten mit einfachen Programmbeispielen in C 
für AVRs programmiert? Anhand von Beispielen lern ich viel leichter.
Das Buch von Kernighan Richie bekomme ich zu Weihnachten!
Gruß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.