AVR Register loggen

Gast #4494955
Lesenswert?
• ▲
▼
Luigi,

ein Simulation funktioniert nie zu 100% geschweige 100% richtig.

So Überprüfe ich Programmabschnitte
a) durch Ausgabe über einen seriellen Datenstrom - Uart,
b) bilde den Programmablauf einer Funktion geschrieben in einer 
Hochsprache auf dem Papier nach und kann dann deren Funktionalität 
beweisen oder
c) untersuche den Programmablauf einer Funktion auf Assemblerebene.

Dazu benötigt man nur das erzeugte Assembler Listing und zum Verständnis 
der Anweisungen, das Atmel AVR 8-bit Instruction Set:

* http://www.atmel.com/images/atmel-0856-avr-instruction-set-manual.pdf
Gast #4494988
Lesenswert?
• ▲
▼
in memoriam KLEN

DER INFORMATIONSVERDICHTER

Stumm berechnet gern und viel
darum ärgert ihn das Spiel
des (fast niemals Angeguckten)
Angezeigten, Ausgedruckten.

Meiste Information
steckt in sechs, acht Wörtern schon,
doch ein dump auf hundert Seiten
kann Entsetzen nur verbreiten.

Es erfindet drum sein Geist
etwas, was ihn dem entreißt:
Subroutinen, die verdichten
weil sie Redundanz - vernichten!

Beispielsweise dies Produkt
würd' - gelöscht, nicht ausgedruckt.
Tausend K gefüllt damit
gäben grade erst - Ein - - Bit!!
Gast #4495013
Lesenswert?
• ▲
▼
Luigi A.,

wie Du feststellen konntest, ist uns so eine Funktion nicht bekannt, 
deshalb auch die vielen anderen Wege.
Es kann schon sein, dass ein Anwender so ein Tool mal programmiert hat, 
aber ober der deinen Beitrag hier liest, ist eher unwahrscheinlich.

Bitte beschreibe genau um was es denn hier geht und was Dir unklar bei 
einem Programm ist.

Hast Du den Quellcode, nur den Assemblercode oder nur ein Intel HEX- 
oder Binär Datei ?
OP #4495043
Lesenswert?
• ▲
▼
... Es geht um die Routine hier aus dem Tutorial von P. Danneger. Unten 
habe ich meine Interpretation daneben geschrieben soweit ich es 
verstabden habe. Einige Schritte sind mir noch unklar.
1
timer_overflow0:               ; Timer Overflow Interrupt
2
 
3
    push    r0                 ; temporäre Register sichern
4
    in      r0, SREG
5
    push    r0
6
    push    iwr0
7
    push    iwr1
8
 
9
get8key:                       ;/old      state     iwr1      iwr0
10
    mov     iwr0, key_old      ;00110011  10101010            00110011
11
    in      key_old, key_pin   ;11110000
12
    eor     iwr0, key_old      ;                              11000011
13
    com     key_old            ;00001111
14
    mov     iwr1, key_state    ;                    10101010
15
    or      key_state, iwr0    ;          11101011
16
    and     iwr0, key_old      ;                              00000011
17
    eor     key_state, iwr0    ;          11101000
18
    and     iwr1, iwr0         ;                    00000010
19
    or      key_press, iwr1    ; gedrückte Taste merken
20
;
21
;
22
    pop     iwr1               ; Register wiederherstellen
23
    pop     iwr0
24
    pop     r0
25
    out     SREG, r0
26
    pop     r0
27
    reti

Hier meine Interpretation:
1
    mov     iwr0, key_old     ;alter Tastenzustand nach iwr0 sichern
2
    in      key_old, key_pin  ;Tastenzustand abfragen
3
    eor     iwr0, key_old     ;prüfen ob ein Flankenwechsel erfolgt ist 
4
    com     key_old           ;Tastenstastatus umkehren
5
    mov     iwr1, key_state   ;? 
6
    or      key_state, iwr0   ;?
7
    and     iwr0, key_old     ;Prellzähler hochzählen wenn Taste gedrückt.
8
    eor     key_state, iwr0   ;? 
9
    and     iwr1, iwr0        ;wenn Prellzähler Wert 3 erreicht Tastenzustand gedrückt weitergeben.
10
    or      key_press, iwr1   ;gedrückte Taste merken

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren