Guten Tag liebes Forum, In der Schule haben wir gerade das Thema Mikrocontroller(attiny 2313) welchen wir mit AVR Studio 4 Programmieren. Da ich vom programmieren absolut keine Ahnung habe, versuche ich mich gerade ein wenig darin einzuarbeiten, indem ich mein kleines Programm immer versuche ein wenig zu erweitern. Anfangs habe ich nur eine LED zum Leuchten gebracht, jetzt sind es mitlerweile 4, die ich auch blinken lassen kann. Jetzt würde ich gerne als nächsten Schritt einen Taster einfügen. Der erstmal bei Betätigung alle 4 LED's ein/ausschalten soll. Später soll er dann verschieden Modi aktivieren können (einmal eine LED, bei einem zweiten Druck 2 LED'S etc.) Wie genau füge ich jetzt einen Taster hinzu? Mein bisheriges Programm sieht wie folgt aus: #include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> void lampeinit(void); void lampean(void); void lampeaus(void); void main(void) { lampeinit(); while(1) { lampean(); _delay_ms(500); lampeaus(); _delay_ms(500); }} void lampeinit(void) { DDRD |= (1<<PD6); DDRB |= (1<<PB2); DDRB |= (1<<PB1); DDRB |= (1<<PB0); } void lampean(void){ PORTD |= (1<<PD6); PORTB |= (1<<PB2); PORTB |= (1<<PB1); PORTB |= (1<<PB0); } void lampeaus(void) { PORTD = (0<<PD6); PORTB = (0<<PB2); PORTB = (0<<PB1); PORTB = (0<<PB0); } Ich hoffe mir kann jemand helfen, danke schön schonmal :)
Taster prellen! https://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten Hier steht wie das implementiert wird: https://rn-wissen.de/wiki/index.php/Taster-Abfrage_in_C
Marcel R. schrieb: > Ich hoffe mir kann jemand helfen Hier auf dieser Seite gibt es ein AVR Controller Tutorial. https://www.mikrocontroller.net/articles/AVR-Tutorial Dort kannst du alles lernen was du brauchst, ist dann ganz einfach.
Marcel R. schrieb: > PORTB = (0<<PB2); > PORTB = (0<<PB1); > PORTB = (0<<PB0); Autsch. > Ich hoffe mir kann jemand helfen Nicht wirklich
MaWin schrieb: > Marcel R. schrieb: >> PORTB = (0<<PB2); >> PORTB = (0<<PB1); >> PORTB = (0<<PB0); > > Autsch. > >> Ich hoffe mir kann jemand helfen > > Nicht wirklich wieso Autsch? das ich wahrscheinlich einige Fehler habe, kann ja möglich sein. Aber da könnte man doch direkt einen Verbesserungsvorschlag geben....
Marcel R. schrieb: > wieso Autsch? Analog zu Marcel R. schrieb: > PORTD |= (1<<PD6); löscht man ein Bit mit: PORTD &= ~(1<<PD6); Aber das solltest du im Tutorial unter anderem auch herausbekommen.
Beitrag #6072453 wurde vom Autor gelöscht.
Marcel R. schrieb: > das ich wahrscheinlich einige Fehler habe, kann ja möglich sein. > Aber da könnte man doch direkt einen Verbesserungsvorschlag geben.... Aber bitte: Lerne die Sprache, die du benutzt. Und zwar, bevor du sie benutzt. Das bewirkt eine erhebliche Verbesserung deiner Programme. Deswegen dieser Vorschlag.
Hier stehen Grundlagen zu Tastern: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29 Was speziell die Funktion lampeaus betrifft, der Abschnitt "Verändern von Registerinhalten" : https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Register Das sollte auch noch interessant sein: https://www.mikrocontroller.net/articles/Bitmanipulation
Marcel! der Stephan hat da eine nette und praktisch hilfreiche uC Webseite. Sieh es Dir mal an. http://stefanfrings.de/mikrocontroller_buch/ UC: http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf
Marcel R. schrieb: >>> PORTB = (0<<PB2); >>> PORTB = (0<<PB1); >>> PORTB = (0<<PB0); >> >> Autsch. >> >>> Ich hoffe mir kann jemand helfen >> >> Nicht wirklich > > wieso Autsch? > das ich wahrscheinlich einige Fehler habe, kann ja möglich sein. > Aber da könnte man doch direkt einen Verbesserungsvorschlag geben.... Was denkst du denn, was da passiert? Also was ist (0<<PB2), und was passiert, wenn man das an PORTB zuweist? Wenn du selbst drauf kommst, lernst du mehr, als wenn man dir einfach sagt, wie diese Zeile richtig aussehen würde.
Marcel R. schrieb: > In der Schule haben wir gerade das Thema Mikrocontroller(attiny 2313) > welchen wir mit AVR Studio 4 Programmieren. Autsch! Bitte nutzt doch das neueste Atmel Studio... und einen originalen Programmer geich dazu.
Bimbo. schrieb: > Autsch! Bitte nutzt doch das neueste Atmel Studio... Käse. AVR Studio 4 ist vollkommen aureichend für diese Lernzwecke. Atmel Studio ist dagegen viel zu kompliziert für Anfänger. Allein die Projekt-Einstellungen bringen jeden Anfänger zum Verzweifeln / Scheitern.
Bimbo. schrieb: > Autsch! Bitte nutzt doch das neueste Atmel Studio Soll Marcel jetzt die Schule davon überzeugen, dass das Atmel Studio 4 schlecht sei? Oder wie stellst du dir das vor? Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen!
Stefan F. schrieb: > Bimbo. schrieb: >> Autsch! Bitte nutzt doch das neueste Atmel Studio > > Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen! Autsch!
Rolf M. schrieb: > Was denkst du denn, was da passiert? Also was ist (0<<PB2), und was > passiert, wenn man das an PORTB zuweist? Deshalb funktioniert ja sein Programm mit dem Ausschalten der LEDs. Fehler die sich selbst aufheben - genial :-). @ Marcel R. Du wolltest mit dem hier: PORTB = (0<<PB2); Bit 2 des Ports ausschalten. Du hast aber alle Pins in PortB ausgeschaltet. (0<<PB2) = 0 Richtig heißt das: PORTB &= ~(1<<PB2); Nur das schaltet den PB2 aus und lässt alle anderen in Ruhe. (1<<PB2) = 0b0000 0100 ~(1<<PB2) = 0b1111 1011 Und das verUNDen mit dem PORT löscht Bit 2 und nur Bit 2.
Rolf M. schrieb: > Was denkst du denn, was da passiert? Also was ist (0<<PB2), und was > passiert, wenn man das an PORTB zuweist? Wenn du selbst drauf kommst, > lernst du mehr, als wenn man dir einfach sagt, wie diese Zeile richtig > aussehen würde. Mit dem Simulator von AVR Studio 4 kann man sich schön Schritt für Schritt angucken, was da am PORTB-Register passiert.
Stefan F. schrieb: > Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen! Als du zur Schule gegangen bist gab es schon Computer?
:
Bearbeitet durch User
Thomas E. schrieb: > Stefan F. schrieb: >> Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen! > > Als du zur Schule gegangen bist gab es schon Computer? Ja, aber nur 5 fürs ganze Gumminasium
Ich erinnere mich noch an meine Computer-AG. Da hab ich auf einem Schneider CPC ein Programm geschrieben, das ein Apfelmännchen berechnet und auf dem Drucker ausgibt - sogar im Grafikmodus.
Also ich hab in der ComputerAG gelernt, das man Arrays in C immer einen Größer anlegen muss, wie man sie braucht. Also wenn ich 5 Einträge im Array machen will, muss ich int array[6] eingeben, um dann über array[1], array[2] bis array[5] darauf zugreifen zu können...
Michael R. schrieb: > Also wenn ich 5 Einträge im Array machen will, muss ich int array[6] > eingeben, um dann über array[1], array[2] bis array[5] darauf zugreifen > zu können... Soso, doch nicht allzuviel gelernt? Wenn du fünf Einträge machen willst, dann brauchst du ein Array mit fünf Elementen und kannst auf array[0...4] zugreifen.
Michael R. schrieb: > Also ich hab in der ComputerAG gelernt, das man Arrays in C immer einen > Größer anlegen muss, wie man sie braucht. > Also wenn ich 5 Einträge im Array machen will, muss ich int array[6] > eingeben, um dann über array[1], array[2] bis array[5] darauf zugreifen > zu können... Das ist aber nur ein Workaround für einen fundamentalen Verständnisfehler, der wäre: Der Index beginnt mit 0!
Danke für die ganzen links und hilfen.
Bin es heute nochmal angegangen und es hat funktioniert.
es leuchten 2 Dioden, betätigt man den taster, gehen diese 2 aus, und es
leuchten 2 anderen.
Werde mich jetzt mal an den Interrupts versuchen.
Mein Programm sieht jetzt so aus: (könnte eventuell nochmal jmd. drüber
gucken ob es so in Ordnung ist oder ob da wieder mehrere Fehler drin
sind, die sich gegenseitig wieder aufheben?):
Danke schonmal
#include <avr/io.h>
void lampeinit (void);
void lampen1an (void);
void lampen1aus (void);
void tasterinit (void);
void main (void) {
lampeinit();
tasterinit();
while(1) {
if (PIND & (1<<PD2))
{
lampen1an();
}
else
{
lampen2an();
}
}
return(0);
}
void lampeinit(void) {
DDRD |= (1<<PD6);
DDRB |= (1<<PB2);
DDRB |= (1<<PB1);
DDRB |= (1<<PB0);
}
void lampen1an(void) {
PORTD |= (1<<PD6);
PORTB |= (1<<PB0);
PORTB &= ~(1<<PB2);
PORTB &= ~(1<<PB1);
}
void lampen2an(void) {
PORTB |= (1<<PB2);
PORTB |= (1<<PB1);
PORTD &= ~(1<<PD6);
PORTB &= ~(1<<PB0);
}
void tasterinit(void) {
DDRD &= ~(1<<PD2);
PORTD |= (1<<PD2);
}
Benutze code Tags, damit die Einrückung des Quelltext erhalten bleibt.
> if (PIND & (1<<PD2))
Das ist nicht aussagekräftig für den Leser. Verpacke es ein ein Makro:
1 | // Taster an PD2, ist LOW wenn gedrückt
|
2 | #define TASTER_LOSGELASSEN (PIND & (1<<PD2))
|
3 | |
4 | if (TASTER_LOSGELASSEN) { |
5 | ....
|
6 | }
|
oder in eine Funktion:
1 | #include <stdbool.h> |
2 | |
3 | // Taster an PD2, ist LOW wenn gedrückt
|
4 | bool taster_losgelassen() { |
5 | return (PIND & (1<<PD2); |
6 | }
|
7 | |
8 | if (taster_losgelassen) { |
9 | ....
|
10 | }
|
Bei der Gelegenheit würde ich es auf positive Ausdrucksweise umschrieben:
1 | // Taster an PD2, ist LOW wenn gedrückt
|
2 | #define TASTER_GEDRUECKT (!(PIND & (1<<PD2)))
|
3 | |
4 | if (TASTER_GEDRUECKT) { |
5 | ....
|
6 | }
|
7 | else { // Taster ist nicht gedrückt |
8 | ....
|
9 | }
|
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.