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
|
:
Bearbeitet durch User
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.