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
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
|
Vielen dank, das ging sehr schnell.
Ich hatte einen Denkfehler.
Ab jetzt werde ich evtl öfters nerven ;)
Gruß
Linda
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.
|