Forum: Mikrocontroller und Digitale Elektronik Lauflicht 2 Taster für rechts und links


von Linda K. (linda_k)


Lesenswert?

Hallo,

habe mir von myAVR einen µkontroller und das entsprechende Lehrbuch dazu 
geholt. Einziges Problem ist, dass es keine Lösungen zu den Aufgaben 
gibt.

Ich wollte einen Lauflicht Programmieren, welches ich mit 2 Taster nach 
links und nach rechts schiebe.

ich bekomme leider nur die eine Richtung hin, ich denke ich habe iwo 
einen Denkfehler.
1
; Start, Power ON, Reset
2
main:    ldi     r16, lo8(RAMEND)
3
         out     SPL, r16
4
         ldi     r16, hi8(RAMEND)
5
         out     SPH, r16
6
         ; Hier Init-Code eintragen.
7
         ldi r16,0b11111111    ; High in r16 Laden
8
         out DDRB, r16      ; PINS PortB als Ausgang
9
         cbi DDRD, 2         ;PD.2 wird als Eingang
10
         cbi DDRD, 3
11
         ldi r16, 0b00001100  ;PULL UP 
12
         out PORTD, r16      ;PD.2 Wird auf High gesetzt  
13
         ldi r16, 0b00000000
14
         ldi r17, 0b00000000
15
         ldi r18, 0b10000001
16
;---------------------------------------------------------------------------
17
mainloop: ; Eingabe
18
getkey:    in   r24, PIND
19
           sbrc  r24, 2        ;Überspringt wenn GEDRÜCKT wird bzw wenn NULL
20
           rjmp  getkey
21
    ;warten...........
22
            inc r16
23
            brne warte
24
            inc r17
25
            brne warte
26
          ; Verarbeitung
27
            rol r18
28
          ; AUSAGABE
29
          
30
          
31
          
32
          out PORTB, r18  
33
                   
34
                     
35
warte:     rjmp mainloop





Mein Ansatz:
1
; Start, Power ON, Reset
2
main:    ldi     r16, lo8(RAMEND)
3
         out     SPL, r16
4
         ldi     r16, hi8(RAMEND)
5
         out     SPH, r16
6
         ; Hier Init-Code eintragen.
7
         ldi r16,0b11111111    ; High in r16 Laden
8
         out DDRB, r16      ; PINS PortB als Ausgang
9
         cbi DDRD, 2         ;PD.2 wird als Eingang
10
         cbi DDRD, 3
11
         ldi r16, 0b00001100  ;PULL UP 
12
         out PORTD, r16      ;PD.2 Wird auf High gesetzt  
13
         ldi r16, 0b00000000
14
         ldi r17, 0b00000000
15
         ldi r18, 0b10000001
16
;---------------------------------------------------------------------------
17
mainloop: ; Eingabe
18
getkey:    in   r24, PIND
19
    sbrc  r24, 2        ;Überspringt wenn GEDRÜCKT wird bzw wenn NULL
20
    rjmp  getkey
21
  ;warten...........
22
            inc r16
23
            brne warte
24
            inc r17
25
            brne warte
26
          ; Verarbeitung
27
            rol r18
28
          ; AUSAGABE
29
          
30
          
31
          
32
          out PORTB, r18  
33
          
34
         
35
getkey1:  in   r24, PIND
36
    sbrc  r24, 3        ;Überspringt wenn GEDRÜCKT wird bzw wenn NULL
37
    rjmp  getkey1
38
  ;warten...........
39
            inc r16
40
            brne warte
41
            inc r17
42
            brne warte
43
          ; Verarbeitung
44
            ror r18
45
          ; AUSAGABE
46
          
47
          
48
          
49
          out PORTB, r18
50
51
                     
52
warte:     rjmp mainloop


Leider ohne Erfolg.

Ich hoffe ihr könnt mir helfen.


Gruß

Linda

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Linda K. schrieb:
> Ich hoffe ihr könnt mir helfen.

 Hier:
1
; Start, Power ON, Reset
2
main:    ldi     r16, lo8(RAMEND)
3
         out     SPL, r16
4
         ldi     r16, hi8(RAMEND)
5
         out     SPH, r16
6
         ; Hier Init-Code eintragen.
7
         ldi r16,0b11111111    ; High in r16 Laden
8
         out DDRB, r16      ; PINS PortB als Ausgang
9
         cbi DDRD, 2         ;PD.2 wird als Eingang
10
         cbi DDRD, 3
11
         ldi r16, 0b00001100  ;PULL UP 
12
         out PORTD, r16      ;PD.2 Wird auf High gesetzt  
13
         ldi r16, 0b00000000
14
         ldi r17, 0b00000000
15
         ldi r18, 0b10000001
16
;---------------------------------------------------------------------------
17
18
GetKey:         in      r24, PIND
19
                sbrs    r24, 2        ;Überspringt wenn NICHT GEDRÜCKT
20
                rjmp    GoLeft          ;* Gedrueckt, Left Shift
21
                sbrc    r24, 3        ;Überspringt wenn GEDRÜCKT
22
                rjmp    GetKey
23
GoRight:        ror     r18             ;* Right Shift
24
                rjmp    OutPort
25
GoLeft:         rol     r18
26
OutPort:        out     PORTB, r18
27
Delay:          inc     r16
28
                brne    Delay
29
                inc     r17
30
                brne    Delay
31
                rjmp    GetKey

: Bearbeitet durch User
von Linda K. (linda_k)


Lesenswert?

Vielen dank, das ging sehr schnell.

Ich hatte einen Denkfehler.


Ab jetzt werde ich evtl öfters nerven ;)


Gruß

Linda

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Linda K. schrieb:
> Ab jetzt werde ich evtl öfters nerven ;)

 Tu das.
 Und nein, normales fragen nervt hier keinen.

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.