Taster einfügen

OP #6072415
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 :)
Beitrag #6072453 wurde von einem Moderator gelöscht.
Gast
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 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.
Gast
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.
Gast
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!
Gast
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.
Gast
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.
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...
Gast
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.
Gast
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!
OP
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);
}
Gast
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 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.