Hallo,
ich bräuchte eure Hilfe
Ich möchte ein Lauflicht nach links u. rechts mit je einem Taster laufen
lassen....siehe CODE aber es klappt nicht so recht.
begin:
rjmp main ; RESET External Pin, Power-on
Reset, Brown-out Reset and Watchdog Reset
reti ; INT0 External Interrupt
Request 0
reti ; INT1 External Interrupt
Request 1
reti ; TIMER2 COMP Timer/Counter2
Compare Match
reti ; TIMER2 OVF Timer/Counter2
Overflow
reti ; TIMER1 CAPT Timer/Counter1
Capture Event
reti ; TIMER1 COMPA Timer/Counter1
Compare Match A
reti ; TIMER1 COMPB Timer/Counter1
Compare Match B
reti ; TIMER1 OVF Timer/Counter1
Overflow
reti ; TIMER0 OVF Timer/Counter0
Overflow
reti ; SPI, STC Serial Transfer
Complete
reti ; USART, RXC USART, Rx Complete
reti ; USART, UDRE USART Data
Register Empty
reti ; USART, TXC USART, Tx Complete
reti ; ADC ADC Conversion Complete
reti ; EE_RDY EEPROM Ready
reti ; ANA_COMP Analog Comparator
reti ; TWI 2-wire Serial Interface
reti ; SPM_RDY Store Program Memory
Ready
;-----------------------------------------------------------------------
-------
main:
ldi r16,lo8(RAMEND) ; Main program start
out SPL,r16 ; Set Stack Pointer to top of RAM
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16 , 0b11111111
out DDRB , r16
cbi DDRD , 2
ldi r16 , 0b00000100
out PORTD , r16
ldi r16 , 0b00000000
ldi r17 , 0b00000000
ldi r18 , 0b00000001
ldi r16 , 0b11111111
out DDRB , r16
cbi DDRC , 0
cbi DDRC , 1
sbi DDRC, 1
ldi r16 , 0b00000001
out PORTC , r16
;-----------------------------------------------------------------------
-------
mainloop: ;Eingabe
getKey: in r24 , PIND
sbrc r24 , 2
rjmp getKey
;warten
inc r16
brne warte
inc r17
brne warte
;Verarbeitung
rol r18
;Ausgabe
out PORTB , r18
warte: rjmp mainloop
getKey2: in r24 , PINC
sbrc r24 , 0
rjmp getKey2
;warten
inc r16
brne warte
inc r17
brne warte
;
ror r18
;
out PORTB , r18
rjmp getKey2
;-----------------------------------------------------------------------
-------
Ich habe das Programm nur grob überflogen, zwei Punkte fielen mir auf: - getKey2: wird nie erreicht - die Befehle ror und rol sind etwas irreführend, eigentlich wird nicht rotiert, das herausgeschobene Bit bleibt 'im Carry stecken', siehe das "Instruction Set Manual"; könnte bei Ihnen aber noch halbwegs funktionieren, da das Carry sonst nirgendwo angefasst wird.
man kann auch in Assembler strukturiert programmieren!!! Welcher Controller ist es?
Bin ein Neuling habe mir das myAVR mk2 set für den einstieg gekauft
@ S. Landold Die Grundaufgabe im Lehrbuch gibt nur eine Richtung des Lauflichts vor eben mit dem Befehl rol .... danach sollte man mit dem 2ten Taster ein lauflicht in die andere richtung schalten ohne Vorgabe deshalb hab ich mir das mir ror mal so überlegt....klappt aber nicht so
Was genau klappt nicht? Der Taster an PC0 bewirkt nichts, da, wie schon gesagt, getKey2 nie erreicht wird. Wenn aber die Hardware stimmt, d.h. der Taster an PD2 gegen GND schließt und auch die "Lauflichter" (LEDs mit Vorwiderstand, nehme ich an) richtig angeschlossen sind, dann sollte da doch etwas laufen, solange der Taster gedrückt wird. Natürlich enthält das Programm noch etliche Anfängerfehler, aber das ist ja erstmal nicht das Thema.
Ja, die Seite mit dem PortD läuft ja auch doch wie bekomme ich mein lauflicht in die andere richtung gedreht mit PortC .... da blicke ich noch nicht durch
Nun, erstmal muss getKey2 überhaupt angesprungen werden, d.h. in Block getKey muss es statt rjmp getKey heißen rjmp getKey2. Und dann muss der Block getKey2 analog zu getKey aufgebaut sein, etwa so:
1 | getKey2: in r24 , PINC |
2 | sbrc r24 , 0 |
3 | rjmp getKey |
4 | ;warten |
5 | inc r16 |
6 | brne warte2 |
7 | inc r17 |
8 | brne warte2 |
9 | ;Verarbeitung |
10 | ror r18 |
11 | ;Ausgabe |
12 | out PORTB , r18 |
13 | warte2: rjmp mainloop |
Schön ist es nicht, aber mein erstes Programm sah wohl auch nicht besser aus.
Bin gerade draufgekommen wie es klappt:
mainloop: ;Eingabe
getKey: in r24 , PIND
sbrc r24 , 2
rjmp getKey2
;warten
inc r16
brne warte
inc r17
brne warte
;Verarbeitung
rol r18
;Ausgabe
out PORTB , r18
getKey2: in r24 , PINC
sbrc r24 , 0
rjmp mainloop
;warten
inc r16
brne warte
inc r17
brne warte
;
ror r18
;
out PORTB , r18
rjmp getKey
warte: rjmp mainloop
Nikolaus J. schrieb: > Bin gerade draufgekommen wie es klappt: Und immer noch mit Fehlern - Lauflicht kann am Anfang nicht nach rechts laufen. Ausserdem kann man mit rol und ror einen bit nicht rotieren, sondern nur um eine Stelle nach links oder rechts verschieben. Bei bit7 oder bit0 ist auf jeden Fall Schluss und jede weitere logische Operation verändert Carry Flag - der alte Wert ist verloren. Hier:
1 | begin:
|
2 | rjmp main ; RESET External Pin, Power-on |
3 | -------
|
4 | main: |
5 | ldi r16,lo8(RAMEND) ; Main program start |
6 | out SPL,r16 ; Set Stack Pointer to top of RAM |
7 | ldi r16,hi8(RAMEND) |
8 | out SPH,r16 |
9 | |
10 | ldi r16 , 0b11111111 ;* LED Ausgabe |
11 | out DDRB , r16 |
12 | |
13 | cbi DDRC, 0 ;* Lauflicht rechts |
14 | ldi r16 , 0b00000001 |
15 | out PORTC , r16 |
16 | |
17 | cbi DDRD , 2 ;* Lauflicht links |
18 | ldi r16 , 0b00000100 |
19 | out PORTD , r16 |
20 | |
21 | ldi r18 , 0b00000001 ;* Anfangszustand |
22 | out PORTB, r18 |
23 | |
24 | ;----------------------------------------------------------------------- |
25 | getKey1: |
26 | in r24, PIND |
27 | sbrc r24, 2 |
28 | rjmp getKey2 |
29 | lsl r18 |
30 | brcc gK1 |
31 | ldi r18, 0x01 ;* Anfangszustand |
32 | gK1: |
33 | rcall OutPort |
34 | |
35 | getKey2: |
36 | in r24, PINC |
37 | sbrc r24, 0 |
38 | rjmp getKey1 |
39 | lsr r18 |
40 | brcc gK2 |
41 | ldi r18, 0x80 ;* Anfangszustand |
42 | gK2: |
43 | rcall OutPort |
44 | |
45 | rjmp getKey1 ;* Und wieder von vorne |
46 | |
47 | OutPort: |
48 | out PORTB, r18 |
49 | clr r16 |
50 | clr r17 |
51 | warte: |
52 | inc r16 |
53 | brne warte |
54 | inc r17 |
55 | brne warte |
56 | ret
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.