Forum: Mikrocontroller und Digitale Elektronik avr asm Menüsteuerung taster werden nicht beachtet


von Martin K. (spyro07)


Lesenswert?

1
.equ t_oben      = 6
2
.equ t_links    = 4
3
.equ t_rechts    = 7
4
.equ t_enter    = 5
5
6
menu:    
7
  push  temp1
8
  push  temp2
9
  push  temp3
10
  mov    temp1, taster_state     
11
  cpi    m_reg, 2
12
  brsh  m_jmp        ; Tasten auswerten
13
14
15
  sbrc  temp1, t_rechts
16
  inc    m_reg
17
18
  sbrc  temp1, t_links
19
  dec    m_reg
20
21
m_jmp:  
22
  clr    temp2
23
   ldi   zl,low(m_punkte)        
24
   ldi   zh,high(m_punkte)
25
   add   zl,m_reg                  
26
   adc   zh,temp2
27
  ldi    temp1, $FF
28
  cbr    temp1, (1<<t_links | 1<<t_rechts)
29
  mov    temp1, taster_state
30
  
31
   ijmp                   ; zu Menupunkt springen
32
33
;;;;;;;;;;;
34
m_punkte:              ; Menu-Punkte
35
 rjmp    mp_0
36
 rjmp   mp_1
37
 rjmp   mp_2
38
 rjmp   mp_3
39
 rjmp   mp_4;, mt_e_3, mt_e_4, mt_e_5, mt_e_6 
40
41
mp_0:  
42
  sbrc  temp1, t_enter
43
  ldi    m_reg, 3
44
  rjmp  menu_end
45
mp_1:
46
  sbrc  temp1, t_enter
47
  ldi    m_reg, 8
48
  rjmp  menu_end          
49
mp_2:
50
  sbrc  temp1, t_enter
51
  ldi    m_reg, 5
52
  rjmp  menu_end
53
mp_3:
54
  sbrs  temp1, t_enter
55
  rjmp  menu_end
56
  inc    m_reg
57
  clr    temp1
58
  sbr    temp1, (1<<modus_hi)
59
  sts    modus, temp1
60
  rjmp  menu_end
61
mp_4:
62
  sbrs  temp1, t_enter
63
  rjmp  menu_end
64
  ldi    m_reg, 0
65
  clr    temp1
66
  sts    modus, temp1
67
  rjmp  menu_end
68
  
69
menu_end:
70
       .       ; der Code spielt beim Prob keine Rolle
71
       .
72
       .
73
  clr    taster_state
74
  pop    temp2
75
  pop    temp2
76
  pop    temp1
77
  ret

Also ich habe folgendes Problem:
Das UP Menu wird alle 200ms in der Hauptschleife aufgerufen.
Zum Entprellen der Tasten nehme ich die Routine von Peter Danegger, 
taster_state wird also erst verändert, wenn ich es lösche.

Wenn ich das Programm starte und ich die rechteTaste drücke passiert das 
was soll. Jedoch nur bei t_rechts.
Alle anderen Tasten werden einfach nicht beachtet.
Weis jemand woran das liegt, ich kann keinen Fehler finden und im 
Simulator gehts auch so wie es soll.
An der Hardware liegt es definitiv nicht, habe alles mit Oszi 
nachgemessen da ist alles so wie es sein soll und pinc ist auch als 
Eingang konfiguriert.
Bei t_rechts gehts ja komischerweise aber bei allen anderen nicht.
Also denke ich das ich irgendein Denkfehler bei dem Codeabschnitt habe, 
aber ich finde kein.

Hoffe ihr könnt mir helfen.

mgh

von Andreas W. (geier99)


Lesenswert?

Hallo,

ich verstehe gerade hier den Sinn nicht:
1
  ldi    temp1, $FF
2
  cbr    temp1, (1<<t_links | 1<<t_rechts)
3
  mov    temp1, taster_state

kann man ja durch:
1
  mov    temp1, taster_state

ersetzen.

Ausserdem verwendest du nirgends temp3, ausser bei push/pop :-)

Bye
  Andreas

von spess53 (Gast)


Lesenswert?

Hi

Noch was

>  push  temp1
>  push  temp2
>  push  temp3
>....
>  pop    temp2
>  pop    temp2
>  pop    temp1

MfG Spess

von Martin K. (spyro07)


Lesenswert?

spess53 schrieb:
> Hi
>
> Noch was
>
>>  push  temp1
>>  push  temp2
>>  push  temp3
>>....
>>  pop    temp2
>>  pop    temp2
>>  pop    temp1
>
> MfG Spess

Oh ja, das ist mir gar nicht aufgefallen.

Das temp3 wird in den Stück Code verwendet, wo ich .., stehen hab, ist 
für die LCD-Ausgabe

> Hallo,
>
> ich verstehe gerade hier den Sinn nicht:
>
>
1
>   ldi    temp1, $FF
2
>   cbr    temp1, (1<<t_links | 1<<t_rechts)
3
>   mov    temp1, taster_state
4
>
>
> kann man ja durch:
>
>
1
>   mov    temp1, taster_state
2
>
>
> ersetzen.

Stimmt das ist auch ein dummer Fehler muss so hier sein:
1
    ldi    temp1, $ff
2
   cbr      temp1, (1<<t_links | 1<<t_rechts)
3
     and      temp1,taster_state
Das soll bezwecken, das die Tasten links und rechts auf 0 gesetzt 
werden, also nicht nochmal auslösen in der weiteren Menüroutine.

Das beides ändert aber leider immer noch nichts an meinem Problem, nach 
wie vor wird immer nur noch t_rechts beachtet.

von Martin K. (spyro07)


Lesenswert?

Also ich habe jetzt erstmal noch einen Fehler gefunden, und zwar wenn 
ich i Menupunkt 2 bin
1
 push  temp1
2
  push  temp2
3
  push  temp3
4
  mov    temp1, taster_state     
5
  cpi    m_reg, 2
6
  brsh  m_jmp        ; Tasten auswerten
7
8
9
  sbrc  temp1, t_rechts
10
  inc    m_reg
11
12
  sbrc  temp1, t_links
13
  dec    m_reg
14
15
m_jmp:  
16
  clr    temp2
17
   ldi   zl,low(m_punkte)        
18
   ldi   zh,high(m_punkte)
19
   add   zl,m_reg                  
20
   adc   zh,temp2
21
  ldi    temp1, $FF
22
überspringe ich ja mit dem 
23
  cbr    temp1, (1<<t_links | 1<<t_rechts)
24
  mov    temp1, taster_state
25
  
26
   ijmp
überspringe ich ja mit dem
1
        cpi    m_reg, 2
2
  brsh  m_jmp        ; Tasten auswerten
die Auswertung von t_links, das habe ich jetzt auch behoben, Problem ist 
trotzdem noch da, wenn ich z.B. t_enter bei mp_0 drücke wechsel ich 
nicht den Menüpunkt.

von spess53 (Gast)


Lesenswert?

Hi

Du solltest mal nicht so mit Kommentaren geizen. Auch schon mal 
überlegt, was passiert, wenn 2 Tasten gedrückt werden?

MfG Spess

von Martin K. (spyro07)


Lesenswert?

Ja 2 Tasten dürften keine Probs machen, nachdem ich es jetzt so
umgeschrieben habe das es funktionieren muss, bin ich zu dem Entschluss
gekommen, das meine Entpellroutine einen Fehler haben muss.
1
entprellen:   
2
  sei       
3
  push  temp1
4
  push  temp2
5
  push  temp3
6
  in    temp1, SREG
7
  push  temp1
8
9
taster_ep:
10
  lds    temp1, ct0_ta
11
  lds    temp3, ct1_ta
12
  in    temp2, taster_port    ;low active
13
  eor    temp2, taster
14
  and    temp1, temp2      ;reset counter
15
  and    temp3, temp2
16
  com    temp1          ;count
17
  eor    temp3, temp1
18
  and    temp2, temp1      ;input AND last counterstate
19
  and    temp2, temp3
20
  eor    taster, temp2      ;toggle state
21
  and    temp2, taster      ;0-1-transition
22
  or    taster_state, temp2  
23
  sts    ct0_ta, temp1
24
  sts    ct1_ta, temp3
25
26
  pop    temp1
27
  out    SREG, temp1
28
  pop    temp3
29
  pop    temp2
30
  pop    temp1
31
  reti

Seht ihr hier einen Fehler?

von Martin K. (spyro07)


Lesenswert?

Also ich weis jetzt das die Taster im taster_state nie erscheinen, auser 
eben t_rechts.
Nur habe ich das Problem bis jetzt noch nicht gefunden, gibts bei Mega 
16 am Pinc irgendwelche besonderheiten, muss ich da vielleicht iwas 
ausschalten?

von Martin K. (spyro07)


Lesenswert?

Die Probleme liegen genau bei PC5 (TDI) und PC4 (TDO).
Was sind das für besondere PINs?

von spess53 (Gast)


Lesenswert?

Hi

>Nur habe ich das Problem bis jetzt noch nicht gefunden, gibts bei Mega
>16 am Pinc irgendwelche besonderheiten, muss ich da vielleicht iwas
>ausschalten?

JTAG-Interface?

MfG Spess

von Martin K. (spyro07)


Lesenswert?

Ahhh, danke, das JTAg schon wieder.
Daran hing es bei mir auch schon mal ganz am Anfang, als ich mit µc´s 
anfing.

Jetzt geht es endlich.

Danke

von Thomas (kosmos)


Lesenswert?

ps. du kannst JTAG auch aus dem Programm raus deaktivieren Bit7 im 
MCUCSR setzen.

sbr temp, 0b10000000  ;JTAG Interface Disable;
out mcucsr, temp

von Martin K. (spyro07)


Lesenswert?

Thomas O. schrieb:
> ps. du kannst JTAG auch aus dem Programm raus deaktivieren Bit7 im
> MCUCSR setzen.
>
> sbr temp, 0b10000000  ;JTAG Interface Disable;
> out mcucsr, temp

Ah danke, das habe ich noch gar nicht gewusst.
Ist ne nützliche Sache vor allem verhindere ich damit die ewige erneute 
Problemsuche wegen dem JTAG.

Werde ich gleich mal in das Init von meinem Programm einbauen, da ich 
ehh kein JTAG benutze.

mfg

von Hannes L. (hannes)


Lesenswert?

Das ist aber erstmal nur die halbe Wahrheit...

Das JTD-Bit in MCUCSR ist zweimal hintereinander innerhalb von 4 
Taktzyklen zu setzen.

...

von Thomas (kosmos)


Lesenswert?

dann ist der Fehler auch im AVR Studio den hier genugt das ganze einmal.

Also dann korrigieren wir das mal.

sbr temp, 0b10000000  ;JTAG Interface Disable;
out mcucsr, temp      ;Wollen Sie wirklich das JTAG Interface 
ausschalten?
out mcucsr, temp      ;Ja

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.