www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tasterschaltung in AVR


Autor: Schwachströmler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächst brauchst du erstmal was zur Entprellung:

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

Alles weitere ergibt sich dann automatisch. ;)

- gerd

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Schwachströmler (Gast)
Datum:

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

Autor: Schwachströmler (Gast)
Datum:

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

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schwachströmler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main()
{
   ....

  while( 1 ) {

    if( !( PORTB & ( 1 << TASTER_PIN ) ) )
      schalte LED ein
    else
      schalte LED aus
  }
}

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schwachströmler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso wird da eine Schleife mit While gebraucht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

- gerd

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

Autor: Schwachströmler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwachströmler schrieb:
> (PORT3==1)

?

Autor: Gaast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gaast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heisst das "_BV"?

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Führst du Selbstgespräche oder hat da jmd deinen Namen geklaut?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.