Forum: Mikrocontroller und Digitale Elektronik Tasterschaltung in AVR


von Schwachströmler (Gast)


Lesenswert?

Hallo,

arbeite Grad mit AVR Studio (zum allerersten mal) und wollte wissen wie 
ich mit C und der Headerdatei <avr/io.h> eine einfach Taster"steuerung" 
mache.

Also mit "if ( *port & (1 << pin) )" dieser oder jener Eingang 1 dann 
Ausgang Port(z.B.:B) dieser oder jener Ausgang high.

Würde mit PORTX = 0xff auch einfach mal alle pulluppen, also wärs eig 
besser mit "if eingang X = low".



Bitte lasst doofe Kommentare - Ich hab gesucht und nichts gefunden, 
ausserdem bin ich ein noob =)

von gerd (Gast)


Lesenswert?

Zunächst brauchst du erstmal was zur Entprellung:

http://www.mikrocontroller.net/articles/Entprellung

Alles weitere ergibt sich dann automatisch. ;)

- gerd

von Floh (Gast)


Lesenswert?


von Schwachströmler (Gast)


Lesenswert?

Hi, hab beides schon durchgemacht.. Bzw beim AVR-GCC bin ich grade 
dabei. Allerdings find ichs da eben nicht. =/

von Schwachströmler (Gast)


Lesenswert?

Ich hab mir zum Enprellen dies hier angesehen, nur falls jemand 
interessiert.
Beitrag "Entprellen für Anfänger"

von gerd (Gast)


Lesenswert?

Schwachströmler schrieb:
> Hi, hab beides schon durchgemacht..

Ähem, kann ich nicht so recht glauben. Gerade in den Debounce-Beispielen 
von Peter Dannegger wird genau das gemacht, was du in deinem 
Eingangsposting erfragst.

- gerd

von Schwachströmler (Gast)


Lesenswert?

Genau bei dem häng ich gerade.

Wie müsste das aussehen, ohne debounce?
Will bei der Simulation beim AVR Studio die ganze Zeit den Ausgang auf 
High bringen, aber schaffs nicht.

von Karl H. (kbuchegg)


Lesenswert?

Schwachströmler schrieb:
> Genau bei dem häng ich gerade.
>
> Wie müsste das aussehen, ohne debounce?

Nicht 'ohne'
Du brauchst einen debounce

d.h. in manchen Fällen brauchst du ihn nicht.

Man muss unterscheiden zwischen

* etwas soll passieren (zb eine LED soll leuchten)
  solange eine Taste gedrückt wird

* etwas soll passieren, wenn eine Taste gedrückt wird.


Der Unterschied ist wie die Fensterheber in einem Auto.
In manchen Autos wird das Fenster bewegt, solange du eine Taste drückst. 
Drückst du, fährt die Fensterscheibe. Lässt du die Taste los, hört auch 
die Bewegung auf.

Der andere Fall ist:
Du drückst eine Taste und eine LED leuchtet auf. Du lässt die Taste los 
und nichts weiter passiert. Drückst du erneut auf die Taste so geht die 
LED wieder aus. Lässt du los passiert nichts weiter.


Der erste Fall ist der einfachere. Man muss dort auch nichts entprellen
1
int main()
2
{
3
   ....
4
5
  while( 1 ) {
6
7
    if( !( PORTB & ( 1 << TASTER_PIN ) ) )
8
      schalte LED ein
9
    else
10
      schalte LED aus
11
  }
12
}

hier steht klipp und klar: Taste gedrückt -> Led ein
                           Taste nicht gedrückt -> Led aus

und damit ergibt sich dann der Fall, dass die LED genau dann und nur 
dann leuchtet, wenn die Taste gedrückt ist. Dazu muss man auch nichts 
entprellen

Der andere Fall ist etwas komplizierter. Dazu muss man entprellen. Und 
am einfachsten nimmt man dazu zb die 'Komfortlösung' auf der weiter oben 
angegebenen Wiki-Seite

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:

>> Wie müsste das aussehen, ohne debounce?
>
> Nicht 'ohne'
> Du brauchst einen debounce

>> Will bei der *Simulation beim AVR Studio* die ganze Zeit den Ausgang auf
>> High bringen, aber schaffs nicht.

Im Simulator ist das Debounce nicht unbedingt notwendig (obwohl die 
Simulation dort nicht schadet, wenn es später auf die Hardware gehen 
soll).

Schwachströmler sollte halt mal seinen bisherigen Quellcode zeigen und 
angeben, was er im Simulator macht bzw. was er machen will und was nicht 
funktioniert.

von Schwachströmler (Gast)


Lesenswert?

Wieso wird da eine Schleife mit While gebraucht?

von Karl H. (kbuchegg)


Lesenswert?

Schwachströmler schrieb:
> Wieso wird da eine Schleife mit While gebraucht?

Weil du wohl kaum eine Taste in ein paar Nanosekunden drücken kannst, 
die der µC braucht um dein Programm ohne die Schleife zu Ende 
abzuarbeiten.


AVR-GCC-Tutorial

Fang vorne an zu lesen. Die Sache mit "was brauch ich an Hardware, was 
brauch ich an Software und wie installiere ich sie" kannst du überlesen. 
Das Kapitel 9 wäre ein ganz guter Einstiegspunkt.

von gerd (Gast)


Lesenswert?

Schwachströmler schrieb:
> Wieso wird da eine Schleife mit While gebraucht?

Vielleicht solltest du das AVR-GCC Tutorial mal gewissenhaft 
durcharbeiten.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Einf.C3.BChrungsbeispiel

- gerd

PS: Tipp - schau dir zeile 5a und die Erklärung dazu an.

von Schwachströmler (Gast)


Lesenswert?

/* Alle Zeichen zwischen Schrägstrich-Stern
   und Stern-Schrägstrich sind lediglich Kommentare */

// Zeilenkommentare sind ebenfalls möglich
// alle auf die beiden Schrägstriche folgenden
// Zeichen einer Zeile sind Kommentar

#include <avr/io.h>          // (1)

int main (void) {            // (2)

   DDRB  = 0xff;             // (3)   PortB = Ausgänge
 //  PORTB = 0x00;             // (4)

   PINC = 0b1011101;       //     Pull-UPs
   DDRC = 0x00;         //     PortC = Eingänge




   while(1) {                // (5a)  Hauptschleife


    if (PORT3==1)
      PORTB = PINB | (1 << PD7);


   }                         // (5c)


   return 0;                 // (6)
}


was macht ich falsch=?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schwachströmler schrieb:
> /* Alle Zeichen zwischen Schrägstrich-Stern
>    und Stern-Schrägstrich sind lediglich Kommentare */
>
> // Zeilenkommentare sind ebenfalls möglich
> // alle auf die beiden Schrägstriche folgenden
> // Zeichen einer Zeile sind Kommentar
Jupp, das wissen wir...  :-/

> was macht ich falsch=?
Was erwartest du von dieser Zeile:
>     if (PORT3==1)

> was macht ich falsch=?
Was sagt der Compiler?

von Justus S. (jussa)


Lesenswert?

Schwachströmler schrieb:
> (PORT3==1)

?

von Gaast (Gast)


Lesenswert?

#include <avr/io.h>

int main(void){

    DDRD |= _BV(PD0);      //Ausgang definieren (LED)

    DDRC &= ~_BV(PC0);     //Eingang definieren (Taster)
    PORTC|= _BV(PC0);      //internen Pull-Up-Widerstand einschalten

    while(1){
        if (bit_is_clear(PINC,0))
            {PORTD &=~_BV(PD0);} //LED an
            else
            {PORTD |=_BV(PD0);}  //LED aus
    }

    return(0);
}


Machs so!

von Gaast (Gast)


Lesenswert?

Was heisst das "_BV"?

von Tom (Gast)


Lesenswert?

Führst du Selbstgespräche oder hat da jmd deinen Namen geklaut?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Und hier
>       PORTB = PINB | (1 << PD7);
wird der PortB7 bestenfalls einmal gesetzt und bleibt dann in alle 
Ewigkeit so. Du könntest allerdings einfach den Portpin auf Masse 
kurzschliessen, dann wird er wieder gelöscht (weil dann PINB7 0 wird)...

> PORTB = PINB | (1 << PD7);
Glück gehabt, dass PD7 genauso wie PB7 definiert ist...

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.