mikrocontroller.net

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


Autor: Stefan S. (onkel-stefan)
Datum:

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

Autor: Johannes L. (joejoe)
Datum:

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

Autor: Stefan S. (onkel-stefan)
Datum:

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  int k;

8 Bits sind genug für k und brauchen weniger Register bzw. Speicher:
#include <stdint.h>
// ...
  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
  int i = 1;
  while(i==1)

beginnt man besser so:
  while(1)

oder so:
  for(;;)

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

besser so:
  PORTB = ~(1 << k);

Autor: yalu (Gast)
Datum:

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

Autor: Stefan S. (onkel-stefan)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan S. (onkel-stefan)
Datum:

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

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.