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
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); }
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
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); |
> 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.
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.