Forum: Mikrocontroller und Digitale Elektronik Assembler-Codeproblem


von simon s. (Firma: hunziker) (simonhu)


Lesenswert?

Hallo zusammen,
ich habe auf einem Atmel Experimentierkasten folgendes vor:
Mit dem Taster 1 soll eine rote LED leuchten auf Knopfdruck. Mit dem 
Taster 2 soll die gleiche LED leuchten, diesmal aber gedimmt. mit Taster 
1&2 zusammen soll eine gelbe LED leuchten.
Folgendes habe ich vor:
Taster 1: Eingang (Pin B.0)
Taster2: (Pin B.1)
Taster 1&2: (Pin B.0 & B.1)

LED 1 Ausgang (Port B.2)
LED 1 Ausgang (Port B.3)
LED 2 Ausgang (Port B.4)

Ich möchte dafür 3 Unterprogramme machen:

mainloop
- Unterprogramm 1->rote LED
- Unterprogramm 2->rote LED gedimmt
. Unterprogramm 3 ->gelbe LED
zurück

Leider habe ich schon Probleme den Port B.2 als Ausgan zu definieren, 
wenn die ersten beiden Pins die Eingänge sind (PinB.0, Pin B.1). Ich 
weiss nicht genau, ob allenfalls im main in der Konfigurierung der Ein- 
und Ausgänge schon Fehler sind. Zusätzlich habe ich ein Chaos mit den 
Registern, weil ich nicht genau weiss, wann ich welches einsetzen muss.

Unterprogramm 1 habe ich versucht zu machen
Unterprogramm 2 mit PWM noch nicht, da ich schon bei 1. Probleme habe
Unterprogramm 3 funktioniert nicht.

Momentan leuchten LED 1 und 2 gleichzeitig, wenn ich Taster 1 drücke. 
Bei Taster 2 passiert nichts.

Könnte mir vielleicht jemand helfen für diese Probleme irgendwie zu 
lösen?!?
Vielen Dank:-)
simonhu

Wo ich ein Problem sehe:
im mainloop:
  in  r17, PINB   ;Input Taster 1
  in  r19, PINB   ;Input Taster 2
Ich möchte eigentlich Taster 1 ins Register 17 schreiben und Taster 2 
ins Register 2. Aber so ist es falsch, so wie ich das glaube...????


Code:
;----------------------------------------------------------------------
; Title    : gedimmtes und ungedimmtes LED-Licht
;----------------------------------------------------------------------
; Funktion    : Mit Taster 1 und 2 kann man 3 verschiedene Modi 
einstellen
; Schaltung    : PORTB.1=COB-LED undgedimmt PORTB.2=COB-LED gedimmt 
PORTB.3=LED-Rot
;----------------------------------------------------------------------
; Prozessor    : ATmega8
; Takt    : 3,6864 MHz
; Sprache    : Assembler
; Datum    : 20.04.2013
; Version    : 1.0
; Programmer  :
; Port    :
;----------------------------------------------------------------------
.equ F_CPU, 3686400
.include  "AVR.H"
;-----------------------------------------------------------------------
;Reset and Interruptvectoren  ;VNr.  Beschreibung
begin:
  rjmp  main  ; 1    POWER ON RESET
  reti    ; 2    Int0-Interrupt
  reti    ; 3    Int1-Interrupt
  reti    ; 4    TC2 Compare Match
  reti    ; 5    TC2 Overflow
  reti    ; 6    TC1 Capture
  reti    ; 7    TC1 Compare Match A
  reti    ; 8    TC1 Compare Match B
  reti    ; 9    TC1 Overflow
  reti    ;10    TC0 Overflow
  reti    ;11    SPI, STC Serial Transfer Complete
  reti    ;12    UART Rx Complete
  reti    ;13    UART Data Register Empty
  reti    ;14    UART Tx Complete
  reti    ;15    ADC Conversion Complete
  reti    ;16    EEPROM Ready
  reti    ;17    Analog Comperator
  reti    ;18    TWI (I²C) Serial Interface
  reti    ;19    Strore Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, RESET
main:
  ldi  r16,lo8(RAMEND)
  out  SPL,r16  ;Init Stackpointer LO
  ldi  r16,hi8(RAMEND)
  out  SPH,r16  ;Init Stackpointer HI;

  cbi  DDRB,0  ;Definition Eingang
  cbi  DDRB,1  ;Definition Eingang
  sbi  PORTB,0  ;Pull up Port B.0
  sbi  PORTB,1  ;Pull up Port B.1
  sbi  DDRB,2  ;Port B.2 out
  sbi  DDRB,3  ;Port B.3 out
  ;sbi  DDRB,4  ;Port B.4 out
;----------------------------------------------------------------------- 
-

mainloop:
  ldi  r16, 0b00000001  ;Watchdor inizialisieren
  ldi  r18, 0b00000010  ;Watchdor inizialisieren
  in  r17, PINB   ;Input Taster 1
  in  r19, PINB   ;Input Taster 2
  rcall led1
  ;rcall led1dimm
  rcall ledgelb
  ;sbrs  r17, 0
  ;ldi  r16, 0b00000111  ;Register auf Ausgansmodus setzen
  ;out  PORTB, r16  ;wdr    ;Watchdor inizialisieren
  rjmp  mainloop  ;zurück auf Anfang
;----------------------------------------------------------------------- 
-

led1:
  sbrs  r19, 0
  ldi  r16, 0b00000101  ;Register auf Ausgansmodus setzen
  out  PORTB, r16    ;Port 3 auf B auf 1 setzen
  ret

;----------------------------------------------------------------------- 
-
;led1dimm:

  ;sbrs  r18, 0  ;Skip, wenn keine Taste auf 1
  ;ldi  r16, 0b00001001  ;Daten wenn Taster ein
  ;out  PORTB, r16
  ;push  r16
  ;sbi  ioPORTB,1  ; PWM-Chanel A
  ;ldi  r16,0b10000001  ; PWM-Mode
  ;out  ioTCCR1A,r16
  ;ldi  r16,0b00000010  ; Vorteiler / PWM Frequenz
  ;out  ioTCCR1B,r16
  ;pop  r16
  ;ret

  ;sbrs  r17, 0  ;Skip, wenn keine Taste auf 1
  ;ldi  r16, 0b00000011  ;Daten wenn Taster ein
  ;out  PORTB, r16  ;zurück auf Anfang
  ret

;----------------------------------------------------------------------- 
-
ledgelb:
  sbrs  r19, 0
  ldi  r18, 0b00001010
  out  PORTB, r18
  ret

: Verschoben durch Moderator
von troll (Gast)


Lesenswert?

simon simon schrieb:
> mainloop:
>   ldi  r16, 0b00000001  ;Watchdor inizialisieren
>   ldi  r18, 0b00000010  ;Watchdor inizialisieren
Hö? Du meinst Watchdog, aber mit diesem haben r16 und r18 absolut nichts 
zu tun.  Schalt das Ding per Fuse ab und kümmere dich darum wenn der 
Rest funktioniert.

Ich denke Bitmanipulation und das Tutorial oben links (-->Eingänge 
abfragen) könnten nützlich sein.

von troll (Gast)


Lesenswert?

simon simon schrieb:
>   ldi  r16,lo8(RAMEND)
>   out  SPL,r16  ;Init Stackpointer LO
>   ldi  r16,hi8(RAMEND)
>   out  SPH,r16  ;Init Stackpointer HI;
Laut AN AVR072 muss das umgekehrt: Es high und dann low.

von troll (Gast)


Lesenswert?

Erst*

von simon s. (Firma: hunziker) (simonhu)


Lesenswert?

troll schrieb:
> simon simon schrieb:
>> mainloop:
>>   ldi  r16, 0b00000001  ;Watchdor inizialisieren
>>   ldi  r18, 0b00000010  ;Watchdor inizialisieren
> Hö? Du meinst Watchdog, aber mit diesem haben r16 und r18 absolut nichts
> zu tun.  Schalt das Ding per Fuse ab und kümmere dich darum wenn der
> Rest funktioniert.
>
> Ich denke Bitmanipulation und das Tutorial oben links (-->Eingänge
> abfragen) könnten nützlich sein.


Ja sorry hier stimmt der Kommentar nicht. Sollte heissen
ldi  r16, 0b00000001  ;Ausgabedaten bei Taster 1 offen
ldi  r18, 0b00000010  ;Ausgabedaten bei Taster 2 offen

von simon s. (Firma: hunziker) (simonhu)


Lesenswert?

troll schrieb:
> simon simon schrieb:
>>   ldi  r16,lo8(RAMEND)
>>   out  SPL,r16  ;Init Stackpointer LO
>>   ldi  r16,hi8(RAMEND)
>>   out  SPH,r16  ;Init Stackpointer HI;
> Laut AN AVR072 muss das umgekehrt: Es high und dann low.


Laut meiner Basisstruktur/Vorlage stimmt das. Sollte auch so 
funktionieren.

von troll (Gast)


Lesenswert?

simon simon schrieb:
> troll schrieb:
>> Laut AN AVR072 muss das umgekehrt: Es high und dann low.
> Laut meiner Basisstruktur/Vorlage stimmt das. Sollte auch so
> funktionieren.
Mach was du willst, ich vertraue dem was Atmel schreibt. Die müssen es 
wissen, die stellen die Käfer her.

Mal so als Idee, ungefähr so würde ich das lösen. Die ISR-Tabelle ist 
gekürzt. Entprellung und die Unterprogramme fehlen. Ohne Gewähr, hab es 
nicht assembliert und getestet.
1
  .def temp=r16
2
3
  .equ F_CPU=3686400
4
  .equ LEDPORT=PORTB
5
  .equ TASTERPIN=PINB
6
  .equ DDRLEDTASTER=DDRB
7
  .equ TASTER1=PB0
8
  .equ TASTER2=PB1
9
  .equ LEDROT=PB2
10
  .equ LEDGELD=PB3
11
  
12
  .include  "AVR.H"
13
14
  rjmp  main  ; 1    POWER ON RESET
15
  reti    ; 2    Int0-Interrupt
16
  [...........]
17
18
main:
19
  ldi  temp,hi8(RAMEND)
20
  out  SPH,temp;Init Stackpointer HIGH
21
  ldi  temp,lo8(RAMEND)
22
  out  SPL,temp;Init Stackpointer LOW
23
24
  ;Eingänge
25
  ldi temp,(1<<LEDROT)|(1<<LEDGELB)
26
  out DDRLEDTASTER,temp
27
  ;Pullups
28
  ldi temp,(1<<TASTER1)|(1<<TASTER2)
29
  out LEDPORT,temp
30
31
mainloop:
32
  in temp,TASTERPIN
33
  andi temp,(1<<TASTER1)|(1<<TASTER2)
34
  cpi temp,(1<<TASTER1)
35
  breq ledrot
36
  cpi temp,(1<<TASTER2)
37
  breq ledrotgedimmt
38
  cpi temp,(1<<TASTER1)|(1<<TASTER2)
39
  breq ledgelb
40
  rjmp  mainloop

von troll (Gast)


Lesenswert?

Sorry für OT, wo ist eigentlich Karl Heinz Buchegger? Der ist doch sonst 
immer sofort zur Stelle... Im Urlaub?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

troll schrieb:
> Der ist doch sonst
> immer sofort zur Stelle... Im Urlaub?

Es steht "Assembler" drüber, dürfte nicht so sein Metier sein.

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch schrieb:
> troll schrieb:
>> Der ist doch sonst
>> immer sofort zur Stelle... Im Urlaub?
>
> Es steht "Assembler" drüber, dürfte nicht so sein Metier sein.

:-)
Doch.
Aber ich war bis vor kurzem beschäftigt.
Und ausserdem hab ich beschlossen mich mal etwas zurückzuhalten. 
Speziell in Konstellationen wie dieser hier

> ich habe xxxx vor
> Leider habe ich schon Probleme ... als Ausgang zu definieren
> wenn die ersten beiden Pins die Eingänge sind (PinB.0, Pin B.1).

Also Dinge, die im ersten echten Programmierkapitel des Tutorials m.M. 
nach erschöpfend abgehandelt werden.

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.