und verknüpfung zweier Taster

OP #674790
Lesenswert?

Hallo an alle!!!

habe mich hier gerade neu angemeldet weil ich mir das STK500 zugelegt 
habe und mich mit der Programmierung beschäftigen will!!!

ich habe schon einiges hinbekommen mit dem Bord nur eins verstehe ich 
absolut nicht!!!!

Ich will eine einfache und-verknüpfung herstellen zwischen zwei tastern
die mir wenn ich beide zugleich drücke eine Diode aum ausgang 
schalten!!!

Ich werd auch aus dem Tut.nicht schlau!!!!

Habe schon gegooglet und hier im Forum gelesen auch den querverweis auf 
die andere avr seite ich kapier es einfach nicht!!!!

ich hab auch kein bsp. wo das einfach erklärt ist!!!

Ich danke euch!!!!

Bitte helft mir!!!!!!!
Gast #674796
Lesenswert?

Beide Taster in Reihe schalten. Beispiel:
Pull Up-Widerstand an einen Portpin, der als Eingang deklariert wurde. 
Portpin Taster 1 Pin 1 verbinden
Taster 1 Pin 2 an Taster 2 Pin 1
Taster 2 Pin 2 auf Gnd
Wenn kein oder ein Taster gedrückt Portpin high
wenn beide gedrückt Portpin low

MW
OP #674810
Lesenswert?

An crazy horse !!!!!!!!

Danke!!!!

Also ich habe bereits Dioden über Taster ein ,aus geschaltet, alle oder 
einzeln!!!!

alles in assambler mit avr studio 4!!!!!!!

und jetzt will ich halt weiter gehen und da hab ich ein Problem, das mit 
der logic verknüpfung!!!!

Hab das bord erst vor 2 h ausgepackt also absoluter Anfänger!!

Danke im voraus
#674836
Lesenswert?

Uwe Leibiger wrote:

> ich habe schon einiges hinbekommen mit dem Bord nur eins verstehe ich
> absolut nicht!!!!
>
> Ich will eine einfache und-verknüpfung herstellen zwischen zwei tastern
> die mir wenn ich beide zugleich drücke eine Diode aum ausgang
> schalten!!!

Dein Ausrufezeichen klemmt!

Was hast Du schon hinbekommen?

Machs erstmal mit einer Taste.
Wenn Du es nicht schaffst, zeig mal Deinen Code, wie Du es probiert 
hast.

Und wenn das geht, eben mit 2 Tasten.
Wenn Du es nicht schaffst, zeig mal Deinen Code, wie Du es probiert 
hast.

Einfach nur fertigen Code geben, hilft Dir ja kein bischen weiter.


Peter
#674837
Lesenswert?

Ich geb dir mal ein Flussdiagramm, das dich weiterbringen
sollte (ein fertiges Programm dazu wäre zu trivial, da lernst du
nichts dabei)


     +---------------------------+
     | Hardware initialisieren:  |
     |   die benötigten Portpins |
     |   auf Ein bzw. Ausgabe    |
     |   schalten                |
     |                           |
     +---------------------------+
                |
     +---------------------------+
     | An den Eingängen die Pull |
     | up Widerstände einschalten|
     | damit die Taster saubere  |
     | Pegel liefern             |
     +---------------------------+
                |
                |   <------------------------------+
                v                                  |
     +---------------------------+                 |
     |     LED ausschalten       |                 |
     +---------------------------+                 |
                |                                  |
+-------------> |                                  |
|               v                                  |
|    +---------------------------+                 |
|    |    Taster 1 abfragen      |                 |
|    +---------------------------+                 |
|               |                                  |
|        /-----------\                             |
|       /             \    Nein                    |
|      |   gedrückt ? |   -------------------------+
|       \            /                             ^
|        \----------/                              |
|             |                                    |
|             |  Ja                                |
|             v                                    |
|    +---------------------------+                 |
|    |    Taster 2 abfragen      |                 |
|    +---------------------------+                 |
|             |                                    |
|        /-----------\                             |
|       /             \    Nein                    |
|      |   gedrückt ? |   -------------------------+
|       \            /
|        \----------/
|             |
|             | Ja
|             v
|    +---------------------------+
|    |     LED einschalten       |
|    +---------------------------+
|             |
+-------------+

Das realisiert, dass die LED nur dann leuchtet, wenn beide
Taster gedrückt sind.
Details zu jeder Stufe, findest du im Tutorial.
Im Speziellen findest du alles was du für diese Aufgabe
brauchst auf der Seite
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
OP #674838
Lesenswert?

hier der Code wie weit ich bin:


.include "m8515def.inc"

        ldi r16, 0xFF
         out DDRB, r16       ; Port B ist Ausgang

         ldi r16, 0x00
         out DDRD, r16       ; Port D ist Eingang


         ldi r16, 0xFF
         out PORTB, r16      ; alle LEDs aus
ende:

loop:    sbic PIND, 0        ; nächsten Befehl überspringen,
                             ; (Taste 0 gedrückt)
         rjmp loop           ; Sprung zu "loop:" -> Endlosschleife

         cbi PORTB, 3        ; Bit 3 im IO-Register PORTB auf 0 setzen 
-> 4. LED an

loop1:    sbic PIND, 1
          rjmp loop1

      sbi PORTB,3


          rjmp ende           ; Endlosschleife
#674847
Lesenswert?

Uwe Leibiger wrote:
> loop:    sbic PIND, 0        ; nächsten Befehl überspringen,
>                              ; (Taste 0 gedrückt)
>          rjmp loop           ; Sprung zu "loop:" -> Endlosschleife

Hier wirst du wohl eingreifen mussen, du willst ja nicht
warten bis eine Taste gedrückt wurde, sondern du willst
nur wissen ob die Taste gedrückt wurde.

Wenn die Taste nicht gedrückt ist, dann gehts (laut Flussdiagramm
von oben) damit weiter, dass die LED gelöscht werden.
Um den Code dort anspringen zu können, brauchst du dort ein
Label:
1
LED_aus:
2
         ldi r16, 0xFF
3
         out PORTB, r16      ; alle LEDs aus
4

5
Taste1:  sbic PIND, 0        ; nächsten Befehl überspringen,
6
                             ; wenn Taste gedrückt
7
         rjmp LED_aus        ; Taste war nicht gedrückt, LEDs ausschalten
8

9
        ; Soweit, so gut. AN diese Stelle kommt das Programm nur
10
        ; wenn Taste 1 gedrückt ist. Das reicht aber noch nicht
11
        ; AUch Taste 2 muss gedrückt sein. Ergo
12

13
Taste2:  sbic PIND, 1        ; Ist sie gedrückt?
14
         rjmp LED_aus        ; nein, ist sie nicht, -> LEDs ausschalten
15

16
       ; Um hier her zu kommen, musste sowohl Taster 1 als auch
17
       ; Taster 2 gedrückt sein. Daher wird die LED eingeschaltet
18

19
         ldi r16, 0x00
20
         out PORTB, r16
21

22
       ; das wars, die Abfragerei kann von vorne anfangen
23

24
         rjmp Taste1
OP #674851
Lesenswert?

hey habs hinbekommen :)


.include "m8515def.inc"

        ldi r16, 0xFF
         out DDRB, r16       ; Port B ist Ausgang

         ldi r16, 0x00
         out DDRD, r16       ; Port D ist Eingang


         ldi r16, 0xFF
         out PORTB, r16      ; alle LEDs aus
ende:

loop:        sbic PIND, 0        ; nächsten Befehl überspringen,
                                 ; (Taste 0 gedrückt)
             rjmp loop           ; Sprung zu "loop:" -> Endlosschleife
taste1:      sbic PIND, 1         ; Abfrage Taste1
             rjmp taste1         ;
             cbi PORTB, 3        ;  setzen -> 4. LED an


loop1:       sbic PIND, 2       ; ausschalten, wenn taste2 gedrückt
             rjmp loop1
             sbi PORTB,3


             rjmp ende           ; Endlosschleife
#674856
Lesenswert?

Uwe Leibiger wrote:
> hey habs hinbekommen :)

Teste das ganze noch mal gründlich.
Dein Programm macht was anderes:

   Zuerst muss Taste1 gedrückt werden.
   Die kannst du dann auch wieder loslassen
   Danach muss Taste2 gedrückt werden.
   Dadurch schaltet sich die LED ein (und Taste2
      kann losgelassen werden)
   Um die LED wieder auszuschalten muss dann Taste 3
   gedrückt werden.

Das ist aber was anderes als: Eine LED soll dann und nur dann
leuchten, wenn beide Tasten zugleich gedrückt sind.

zb.
   Grundzustand

   Taste2 drücken                      -> nichts passiert, LED aus
   Taste2 gedrückt halten

   Taste1 drücken und gedrückt halten  -> LED leuchtet auf

   Taste2 loslassen                    -> LED verlischt

   Taste2 drücken                      -> LED leuchtet

   Taste 1 loslassen                   -> LED verlischt

   Taste 2 loslassen                   -> nichts passiert, LED aus

   Grundzustand


Das versteht man unter: Eine LED leuchtet nur dann, wenn beide
Tasten gedrückt sind. Egal in welcher Reihenfolge die Tasten
gedrückt oder losgelassen werden, in dem Moment in dem beide
gedrückt sind, soll die LED leuchten und ansonsten aus sein.
OP #674894
Lesenswert?

Hatte mir das ganze nochmal 2h durch den Kopf gehen lassen und 
festgestellt das ich noch SPS versaut bin!!

War falsch an die theorie schon rangegangen!!!

Gedanken: Hatte gedacht ich muss den Eingang gleich mit nem Ausgang 
verknüpfen!!! (wie bei SPS-Programmierung)

Danke nochmal!

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