Forum: Mikrocontroller und Digitale Elektronik Auf Register über Laufvariable zugreifen (C)


von Stefan S. (onkel-stefan)


Lesenswert?

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

von Johannes L. (joejoe)


Lesenswert?

wenn du nur die entsprechenden Bits setzen willst (dabei wird aber 
jedesmal das gesamte DDR Register überschrieben und immer nur ein Pin 
von PortB ist Ausgang)

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

von Stefan S. (onkel-stefan)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

> 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.

von Stefan S. (onkel-stefan)


Lesenswert?

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ß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?


von Stefan S. (onkel-stefan)


Lesenswert?

Das war das erste, was ich entdeckt hatte, darüber bin ich auch auf das 
Forum hier gekommen. Dachte vll gibt es auch Alternativen, am Besten auf 
Deutsch. Aber mit der AVR Libc und dem Tutorial hier, werd ich wohl eine 
ganze Weile beschäftigt sein;-)

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.