Taster einfügen

OP #6072415
Lesenswert?

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 #6072458
Lesenswert?

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.
#6072463
Lesenswert?

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
#6072489
Lesenswert?

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 #6072510
Lesenswert?

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 #6072625
Lesenswert?

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 #6072662
Lesenswert?

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.
Gast #6073006
Lesenswert?

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 #6073331
Lesenswert?

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 #6074186
Lesenswert?

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 #6074252
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren