Forum: Mikrocontroller und Digitale Elektronik Taster einfügen


von Marcel R. (marcelr1588)


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 :)

von Teo D. (teoderix)


Lesenswert?


von Opti Mist (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

Marcel R. schrieb:
> PORTB = (0<<PB2);
> PORTB = (0<<PB1);
> PORTB = (0<<PB0);

Autsch.

> Ich hoffe mir kann jemand helfen

Nicht wirklich

von Marcel R. (marcelr1588)


Lesenswert?

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....

von Marcel R. (marcelr1588)


Lesenswert?

Und danke an die anderen beiden :)

von Opti Mist (Gast)


Lesenswert?

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 von einem Moderator gelöscht.
von c-hater (Gast)


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.

von Holger L. (max5v)


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

von Nautilus (Gast)


Lesenswert?


von Rolf M. (rmagnus)


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.

von Bimbo. (Gast)


Lesenswert?

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.

von Opti Mist (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

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!

von Max B. (citgo)


Lesenswert?

Stefan F. schrieb:
> Bimbo. schrieb:
>> Autsch! Bitte nutzt doch das neueste Atmel Studio
>
> Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen!

Autsch!

von HildeK (Gast)


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.

von Wolfgang (Gast)


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.

von Thomas E. (thomase)


Lesenswert?

Stefan F. schrieb:
> Mit derartigem Verhalten wurde ich aus der Computer AG ausgeschlossen!

Als du zur Schule gegangen bist gab es schon Computer?

von Stefan F. (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Michael R. (mr-action)


Lesenswert?

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...

von HildeK (Gast)


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.

von Stefan F. (Gast)


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!

von Marcel R. (marcelr1588)


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);
}

von Stefan F. (Gast)


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
}

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
Noch kein Account? Hier anmelden.