(hard)core test na AVR
Miroslav Šinko
sinkomiro@gmail.com
Čtvrtek Prosinec 4 22:24:03 CET 2008
Dňa 4.12.2008, Jan Waclawek <konfera@efton.sk> napísal(a):
> Este stale si myslim, ze realne spravanie sa zavisi od konkretnej implementacie; a moj tip je, ze tam bude ulozena neinkrementovana hodnota z r0. To "postinkrement" sa vztahuje na suslednost pouzitia adresy a inkrementu, ale v skutocnosti sa IMHO adresa latchne do interneho adresneho registra v prvej polovici prveho cyklu, inkrementovana hodnota sa ulozi v druhej polovici prveho cyklu (u predekrementu sa najprv dekrementne a potom sucasne s writebackom sa latchne v adresnom registri), register r0 sa vycita v prvej polovici druheho cyklu a zapise v druhej polovici druheho cyklu. Vychadzam z casovacieho diagramu v odstavci "Data Memory Access Times" v snad kazdom AVRkovom datasheete (okrem AT90S1200 ;-) ), aj ked takto explicitne to tam bohuzial nie je. Nevidim vsak pricinu, preco ak ukazuje Z (X, Y) na registre, by ta sekvencia mala byt ina.
Tak si mal pravdu :-) Relatko cvakne pri hodnote 0 v podmienke. Pri 1,
ako som predpokladal ja, si ani nepipne...
Testovane na tiny13, tento kod:
.include "tn13def.inc"
#define IO_PORT PORTB
#define IO_DDR DDRB
#define IO_OUT_RELAY 4
;init port
ldi r16, (1<<IO_OUT_RELAY)
out IO_DDR, r16
clr r0
clr r31
ldi r30, 30
st Z+,r0
cpi ZL, 0 ;<------ testovana hodnota
brne Loop
;relay on
sbi IO_PORT, IO_OUT_RELAY
Loop:
rjmp Loop
miro
Další informace o konferenci Hw-list