mikrocontroller.net

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


Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

.equ t_oben      = 6
.equ t_links    = 4
.equ t_rechts    = 7
.equ t_enter    = 5

menu:    
  push  temp1
  push  temp2
  push  temp3
  mov    temp1, taster_state     
  cpi    m_reg, 2
  brsh  m_jmp        ; Tasten auswerten


  sbrc  temp1, t_rechts
  inc    m_reg

  sbrc  temp1, t_links
  dec    m_reg

m_jmp:  
  clr    temp2
   ldi   zl,low(m_punkte)        
   ldi   zh,high(m_punkte)
   add   zl,m_reg                  
   adc   zh,temp2
  ldi    temp1, $FF
  cbr    temp1, (1<<t_links | 1<<t_rechts)
  mov    temp1, taster_state
  
   ijmp                   ; zu Menupunkt springen

;;;;;;;;;;;
m_punkte:              ; Menu-Punkte
 rjmp    mp_0
 rjmp   mp_1
 rjmp   mp_2
 rjmp   mp_3
 rjmp   mp_4;, mt_e_3, mt_e_4, mt_e_5, mt_e_6 

mp_0:  
  sbrc  temp1, t_enter
  ldi    m_reg, 3
  rjmp  menu_end
mp_1:
  sbrc  temp1, t_enter
  ldi    m_reg, 8
  rjmp  menu_end          
mp_2:
  sbrc  temp1, t_enter
  ldi    m_reg, 5
  rjmp  menu_end
mp_3:
  sbrs  temp1, t_enter
  rjmp  menu_end
  inc    m_reg
  clr    temp1
  sbr    temp1, (1<<modus_hi)
  sts    modus, temp1
  rjmp  menu_end
mp_4:
  sbrs  temp1, t_enter
  rjmp  menu_end
  ldi    m_reg, 0
  clr    temp1
  sts    modus, temp1
  rjmp  menu_end
  
menu_end:
       .       ; der Code spielt beim Prob keine Rolle
       .
       .
  clr    taster_state
  pop    temp2
  pop    temp2
  pop    temp1
  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

Autor: Andreas W. (geier99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

kann man ja durch:
  mov    temp1, taster_state

ersetzen.

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

Bye
  Andreas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Noch was

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

MfG Spess

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
>   ldi    temp1, $FF
>   cbr    temp1, (1<<t_links | 1<<t_rechts)
>   mov    temp1, taster_state
> 
>
> kann man ja durch:
>
>
>   mov    temp1, taster_state
> 
>
> ersetzen.

Stimmt das ist auch ein dummer Fehler muss so hier sein:
    ldi    temp1, $ff
   cbr      temp1, (1<<t_links | 1<<t_rechts)
     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.

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe jetzt erstmal noch einen Fehler gefunden, und zwar wenn 
ich i Menupunkt 2 bin
 push  temp1
  push  temp2
  push  temp3
  mov    temp1, taster_state     
  cpi    m_reg, 2
  brsh  m_jmp        ; Tasten auswerten


  sbrc  temp1, t_rechts
  inc    m_reg

  sbrc  temp1, t_links
  dec    m_reg

m_jmp:  
  clr    temp2
   ldi   zl,low(m_punkte)        
   ldi   zh,high(m_punkte)
   add   zl,m_reg                  
   adc   zh,temp2
  ldi    temp1, $FF
überspringe ich ja mit dem 
  cbr    temp1, (1<<t_links | 1<<t_rechts)
  mov    temp1, taster_state
  
   ijmp 
überspringe ich ja mit dem
        cpi    m_reg, 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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.
entprellen:   
  sei       
  push  temp1
  push  temp2
  push  temp3
  in    temp1, SREG
  push  temp1

taster_ep:
  lds    temp1, ct0_ta
  lds    temp3, ct1_ta
  in    temp2, taster_port    ;low active
  eor    temp2, taster
  and    temp1, temp2      ;reset counter
  and    temp3, temp2
  com    temp1          ;count
  eor    temp3, temp1
  and    temp2, temp1      ;input AND last counterstate
  and    temp2, temp3
  eor    taster, temp2      ;toggle state
  and    temp2, taster      ;0-1-transition
  or    taster_state, temp2  
  sts    ct0_ta, temp1
  sts    ct1_ta, temp3

  pop    temp1
  out    SREG, temp1
  pop    temp3
  pop    temp2
  pop    temp1
  reti 

Seht ihr hier einen Fehler?

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin K. (spyro07)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ps. du kannst JTAG auch aus dem Programm raus deaktivieren Bit7 im 
MCUCSR setzen.

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

Autor: Martin K. (spyro07)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber erstmal nur die halbe Wahrheit...

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

...

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.