Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit ATmega8 und Assembler


von Nikolaus J. (Firma: 88Airbrush88) (jungertnik)


Lesenswert?

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
;----------------------------------------------------------------------- 
-------

von S. Landolt (Gast)


Lesenswert?

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.

von Carlos (Gast)


Lesenswert?

man kann auch in Assembler strukturiert programmieren!!!

Welcher Controller ist es?

von JungertNik (Gast)


Lesenswert?

Bin ein Neuling habe mir das myAVR mk2 set für den einstieg gekauft

von JungertNik (Gast)


Lesenswert?

@ 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

von S. Landolt (Gast)


Lesenswert?

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.

von JungertNik (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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.

von Nikolaus J. (Firma: 88Airbrush88) (jungertnik)


Lesenswert?

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

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


Lesenswert?

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
Noch kein Account? Hier anmelden.