4.4.4   Reagieren auf beliebige Tasten am ASURO
    
Problembeschreibung
Schriftliche Problemlösung
Technische Aspekte zur Problemlösung                           <= zurück zur
Technische Informatik
Grafische Problemlösung                                                
Ausblicke                                                        <= zurück zum vorherigen Projekt    SOS mit ASURO morsen  
Informationen zum Thema                               
Schülerprojektdokumentationen                        weiter zum nächsten Projekt =>    Tasten unterscheiden am ASURO

 
an den
 Anfang
Problembeschreibung

 
Beim Drücken eines beliebigen der sechs vorhandenen Kollisionstaster am ASURO
 soll die FrontLED aufleuchten. Beim Loslassen des Tasters verlischt die FrontLED wieder.
 Der Vorgang soll beliebig oft wiederholt werden.
 
 
 
  Zum erneuten  Abspielen des Videos bitte Seite  
                                     aktualisieren (Taste F5).


 

   Tool zum umwandeln von Handy- und anderen Videos
                                     finden Sie hier.

an den
 Anfang
Schriftliche Problemlösung


 

 
 
an den
 Anfang
Technische Aspekte zur Problemlösung





Quelle: ATmega8-Datenblatt Seite 242 - ergänzt durch die Werte für den ASURO


 


      =>  kein Taster gedrückt
 

   =>  beliebiger Taster gedrückt

  



zum Vergrößern auf die Abbildung klicken

Simulation mit PSPICE



PSPICE-Projektordner (.zip)

 

  
an den
 Anfang
Grafische Problemlösung "ganz dicht am Mikrocontroller"

 

Das erste Symbol benutzt man, um den Start einer Funktion
darzustellen. Hier wird die main-Funktion begonnen.

Um einen Befehl zu visualisieren, benutzt man die einfachen
Rechtecke. Hier setzt man den Port C4 auf Eingang.

Im nächsten Befehlsymbol setzt man den Port D6 auf Ausgang.

Mit der Raute beschreibt man eine Bedingung, die erfüllt sein
muss, um den folgenden Befehl auszuführen. Hier fragt man,
ob ein beliebiger Taster gedrückt ist. Wenn ja, dann schaltet
man die Front LED an.

Wenn nicht, dann springt man automatisch in die nächste Bedingung
und fragt, ob kein Taster gedrückt ist. Trifft dies zu, so wird die Front LED
aus geschaltet bzw. gar nicht erst eingeschaltet.

Die Bedingungen und die damit verbundenen Befehle befinden sich in einer
Endlosschleife, die immer vorhanden sein muss, da die Funktion ansonsten
nur einmal laufen würde.


Programmablaufplan als Dateityp *.dia

by Igor Fertich & Jessica Rey
 

PAP Tasterabfrage

zum Öffnen der größeren Darstellung im pdf-Format
auf die Abbildung klicken

Quelltext hierzu direkt nachfolgend:


                                                                                                 
 

   

 

 

an den
 Anfang
Umsetzung in den Quelltext "ganz dicht am Mikrocontroller"

Pollingverfahren - die Taster werden regelmäßig, hier alle 1,5 µs vom Mikrocontroller abgefragt (mehr als 600 x pro Sekunde!!!)

Nachteil dieses Entwurfs: beim Loslassen eines beliebigen Tasters verlöscht die FrontLED sofort wieder

#include <avr/io.h>                       // io.h einbinden, Header-bzw. Bibliotheksdatei

 

int main ( void )                         // jedes C-Programm hat eine main-Funktion

{                                         // beim Aufrufen der main-Funktion wird nichts

                                          // (engl. void) übergeben

 

    DDRC  = 0b00000000;                   // Alle 6 Taster sind über Widerstände mit C4 und D3

                                          // verbunden. Von den Ports soll aber nur C4 als

                                          // normaler Eingang verwendet werden.

                                          // Daten-Richtung einstellen, Bit 4  auf 0 (Eingang)

                                          // Zählung von rechts beginnend mit Bit 0

                                  

                                          // Am PortC4 liegt ebenfalls der Analog/Digital-Wandler,

                                          // der aber nicht initialisiert bzw. eingeschaltet ist

                                          // Am PortD3 liegt ebenfalls der Interrupt 1

                                          // der aber nicht initialisiert bzw. eingeschaltet ist

 

    DDRD  = 0b01000000;                   // Daten-Richtung einstellen, Bit 6  auf 1 (Ausgang)

                                          // fuer FrontLED 

 

    while ( 1 )                           // Endlosschleife

    {                                     // solange Bedingung wahr (1 = wahr)

         

         if ( bit_is_clear ( PINC,4 ) )   // Wenn beliebiger Taster gedrückt, dann bit_is_clear

         {                                // 0,015 bis 0,33 V an Pin C4, als LOW gewertet

             PORTD = 0b01000000;          // Port anschalten, Port D6  (FrontLED einschalten)

         }

 

         if ( bit_is_set ( PINC,4 ) )     // Wenn kein Taster gedrückt, dann bit_is_set

         {                                // 4,74 V an Pin C4, als HIGH gewertet

             PORTD = 0b00000000;          // Port ausschalten, Port D6  (FrontLED ausschalten)

         }

 

    }                                     // LOW beim ASURO   -0,5 V  bis  1,04 V

                                          // HIGH beim ASURO   3,12 V  bis  5,7 V

    return 0;          

}                        

AVR Studio-Projekt (.zip)
                                                                                                 
 

   

 

 

an den
 Anfang
Umsetzung in den Quelltext "ganz dicht am Mikrocontroller"

Pollingverfahren mit Speichern des FrontLED-Zustandes ("richtige" Ein-Aus-Schaltung)

 #include <avr/io.h>                         // io.h einbinden, Header-bzw. Bibliotheksdatei

 

int main ( void )                            // jedes C-Programm hat eine main-Funktion

{                                            // beim Aufrufen der main-Funktion wird nichts

                                             // (engl. void) übergeben

 

    DDRC  = 0b00000000;                      // Alle 6 Taster sind über Widerstände mit C4 und D3

                                             // verbunden. Von den Ports soll aber nur C4 als

                                             // normaler Eingang verwendet werden.

                                             // Daten-Richtung einstellen, Bit 4  auf 0 (Eingang)

                                             // Zählung von rechts beginnend mit Bit 0

 

    DDRD  = 0b01000000;                      // Daten-Richtung einstellen, Bit 6  auf 1 (Ausgang)

                                             // fuer FrontLED 

 

    while ( 1 )                              // Endlosschleife

    {                                        // solange Bedingung wahr (1 = wahr)   

        if ( bit_is_clear ( PINC,4 ) )       // Wenn beliebiger Taster gedrückt, dann bit_is_clear

        {

            while ( bit_is_clear ( PINC,4 )) // 0,015 bis 0,33 V an Pin C4, als LOW gewertet

            {                                // Warte solange Taster1 gedrückt ist

                ;                            // ;  tue nichts

            }                                

            

            if ( bit_is_clear ( PIND,6 ) )   // wenn FrontLED aus ist, dann ...

            {

                                            

                PORTD = 0b01000000;          // Port anschalten, Port D6  (FrontLED einschalten)

            }

 

            else                             // ansonsten (dann war sie wohl an :-))

            {                               

                PORTD = 0b00000000;          // Port ausschalten, Port D6  (FrontLED ausschalten)

            }

        }

    }                                        // LOW beim ASURO   -0,5 V  bis  1,04 V

                                             // HIGH beim ASURO   3,12 V  bis  5,7 V

    return 0;          

}                             

     
AVR Studio-Projekt (.zip)

Der Zustand des Tasters wird hier kontinuierlich abgefragt, was auch als Polling (to poll engl. abfragen) bezeichnet wird. Nachteile hiervon sind, dass der Mikrocontroller unnötig beansprucht wird und, falls in weiteren Programmabschnitten Wartezeiten verwendet werden, ein Tastendruck eventuell "übersehen" wird.

Das Programm wartet vor der ersten Tastenabfrage, bis eine Taste gedrückt wird. Wenn diese dann gedrückt wird, wird nochmals gewartet, bis sie wieder losgelassen wird.

Im nächsten Schritt wird gefragt, ob die FrontLED ausgeschaltet war. Wenn "ja", wird sie eingeschaltet, wenn "nein" wird sie ausgeschaltet. 

Danach werden die Taster erneut abgefragt.

zum Öffnen der größeren Darstellung im pdf-Format
auf die Abbildung klicken

 

   

 

 

an den
 Anfang
Umsetzung in den Quelltext "ganz dicht am Mikrocontroller"

Interruptverfahren mit Speichern des FrontLED-Zustandes ("richtige" Ein-Aus-Schaltung)

#include <avr/io.h>                 // Header-Datei "io.h" einbinden

#include <avr/interrupt.h>          // Interrupt-Datei

#include <avr/signal.h>             // Signal für Interrupt

 

 

// ------------------------------------------------------------------------------------

// ------------------- Interrupt 1 -Unterprogramm -------------------------------------

// ------------------------------------------------------------------------------------

 

SIGNAL (SIG_INTERRUPT1)            // Interrupt 1 Sub-Routine (ISR)

{            

    if ( bit_is_clear ( PIND,6 ) ) // wenn FrontLED noch nicht leuchtet

    {

         PORTD = 0b01000000;       // FrontLED einschalten

    }

 

    else     

    {            

         PORTD = 0b00000000;       // ansonsten FrontLED ausschalten)

    }                                              

}                                  // Rücksprung in das Hauptprogramm

 

// -------------------------------------------------------------------------------------

// Hauptprogramm "main"-----------------------------------------------------------------

// -------------------------------------------------------------------------------------

 

int main ( void )

     DDRD  = 0b01000000;           // Daten-Richtung, D6 = 1 (Ausgang) FrontLED

                                   // Daten-Richtung, Bit 3  auf 0 (Eingang) Interrupt 1

     PORTD = 0b00000000;           // Port ausschalten, Port D6  => FrontLED aus

                                   // Zählung von rechts beginnend mit Bit 0

 

     GICR   = 0b10000000;          // Interrupt 1 (INT1) aktivieren

     MCUCR  = 0b00001000;          // fallende Flanke für Interrupt 1 (Wechsel von 5 V nach 1 V)

     sei();                        // alle Interruptquellen freigeben

 

 

     while ( 1 )                   // Ausführen der Schleife solange " 1 "

     {

         ;                         // tue nichts

     }                       

}                              

 
AVR Studio-Projekt (.zip)

Die Überwachung der Taster und die damit gewünschte Umschaltung der FrontLED geschieht hier durch den Interrupt 1, der nur durch den PORT D3 ausgelöst werden kann. Diese Möglichkeit des ATmega8 wurde beim Asuro verwendet, siehe Schaltskizze.

Der Interrupt wird im Programm nur initialisiert und aktiviert und läuft dann ganz eigenständig parallel zur eigentlichen Programmverarbeitung.

Wird ein Interrupt durch eine fallende Flanke (5 V => 0 V) am PORT D3 ausgelöst, wird die Programmbearbeitung unterbrochen und die Befehle abgearbeitet, die in der Interrupt Service Routine (ISR) stehen, abgearbeitet. Danach wird das eigentliche Programm an genau der Stelle wieder fortgesetzt, wo es verlassen wurde.

Weitere Informationen zur Interruptsteuerung.
 

zum Öffnen der größeren Darstellung im pdf-Format
auf die Abbildung klicken

   

 

 

an den
 Anfang

Informationen zum Thema





   

Abgeschlossene Schülerprojekte:





Stand:
27.02.2008

 <= zurück zur Technische Informatik