# ATMEL mikrokontrolleri >  kaut kas nestrādā... ASM

## lopiks

kroč uztaisīju tā, lai ik pēc laiciņa pogas reģistrs nodzēstos... kaut kas uzkaras. Sadaļa "kreisais" nešanī... simulātorā strādā, taču pēc laiciņa (noteikta ciklu skaita) apstājas... strādā tikai "labais" un reģistru dzēsējs "pulse"



```
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313def.inc"

.def time = r17

.org 0x0000
	rjmp reset

.org 0x0001
	rjmp inter0

.org 0x0002
	rjmp inter1

.org 0x0006
	rjmp tim0_ovf

reset:
	
	ldi r16, low(ramend)
	out spl, r16

	ldi r16, 0xff
	out ddrb, r16

	ldi r16, 0xff
	out ddrd, r16
	out portd, r16

	ldi time, 0x01 	; iestatu, no kurienes sāk skaitīt
	out tcnt0, time	; izvadu r16 regjistraa
	ldi r25, 0xff	; aktivizeju timer/overflow bitu TOIE0
	out tifr, r25
	out timsk, r25	; ierakstu to taimera maskā
	
	ldi r25, 1		; uzstādu dalītāju (clock/(2*N*(256-time))
	out tccr0, r25	; izvadu to timer/counter kontroles reģistrā
	

	;pogas
	ldi	r16,0x00
	out	gimsk,r16

	ldi	r16,0x11
	out	mcucr,r16


	sei

loop:
	
	nop
	rjmp loop

inter0:
	
	nop
	in r18, portb
	cpi r18, 0b10000000
	breq nekas
	ldi r19, (1<<ddb7)
	rjmp end

inter1:

	nop
	in r18, portb
	cpi r18, 0b01000000
	breq nekas
	ldi r19, (1<<ddb6)
	rjmp end


nekas:

	rjmp end

tim0_ovf:
	
	ldi r19, 0x00
	
end:

	out portb, r19
	reti
```

----------


## kvaris

Es esmu diezgan liels iesacejs, bet vai vieta, kur tiek inicializets steks, netrukst sadu rindinu?

ldi    r16, high(ramend)
out  sph,r16

Nezinu, vai tas palidzes.

----------


## lopiks

man ir attiny 2313, kas ir parādīts .include rindiņā... šim uC nav SPH

----------


## Velko

Nja, pie 128 baitu atmiņas nav vajadzības pēc SPH  ::  

Anyway:

Cik noprotu - pogas piekarināji pie INT0 un INT1, tā lai nospiežot pierautu pinu uz GND. Tomēr DDRD esi visus pinus nokonfigurējis kā output. Pareizāk būtu tos likt kā input (attiecīgais DDRDx bits = 0), bet ar ieslēgtu pull-up (PORTDx bits = 1). Var gadīties, ka pogas spaidot, pinus jau esi paspējis nosvilināt.

Tālāk, MCUCR reģistrs. Tajā esi katru interruptu nokonfigurējis savādāk. ISC0x = 01 (any logical change), ISC1x = 00 (low level). Pie viena vēl esi ieslēdzis SM0 bitu, kas attiecas uz sleep režīmiem.

Es ieteiktu abiem interruptiem likt uz falling edge -> MCUCR = 0x0A.

----------


## lopiks

tā proga ir ar kkādu gļuku... taimeris apiet apli, atlec uz loop: rjmp loop, taču ar nākošo klikšķi aizlec uz rindiņu virs taimera raksturošanas... pamēģiniet nosimulēt  ::

----------


## Velko

Nezinu, vai šis vairs ir aktuāls, tomēr man beidzot sagadījās pareizā kombinācija (brīvs laiks, palaists AVR Studio un atvērts forums) lai papētītu.

Vārdu sakot: nostrādā arī TIMER0_COMPA interrupts. Tev nav pilna interruptu vektoru tabula, bet interrupts jau to nezina - aizlec uz vietu, kur vajadzētu būt - kā reiz uz to rindiņu pirms taimera uzstādīšanas.

Uzstādot TOIE0 interrupta bitu, tu (ierakstot reģistrā 0xFF) ieslēdz arī visus pārējos - OCIE0A, OCIE0B, tāpat bitus, kas attiecas uz Timer1. Pēc tam, kad taimeris ir vienreiz "apgriezies" TCNT0 vērtība kļūst vienāda ar OCR0A vērtību un šis interrupts nostrādā. Normāli būtu TIMSK reģistrā rakstīt vērtību 0x02 - tikai TOIE0 bitu.

Protams, vieglāk saprast kur vaina, ja saliek pilnu interruptu tabulu (nevajadzīgos _rjmp_ aizstājot ar _reti_). Piemēram šādi:


```
.org 0x0000 
	rjmp reset  ; Reset Handler
.org 0x0001
	rjmp inter0 ; External Interrupt0 Handler
.org 0x0002
	rjmp inter1 ; External Interrupt1 Handler
.org 0x0003
	reti        ; Timer1 Capture Handler
.org 0x0004
	reti        ; Timer1 CompareA Handler
.org 0x0005
	reti        ; Timer1 Overflow Handler
.org 0x0006 
	rjmp tim0_ovf ; Timer0 Overflow Handler
.org 0x0007
	reti        ; USART0 RX Complete Handler
.org 0x0008
	reti        ; USART0,UDR Empty Handler
.org 0x0009 
	reti        ; USART0 TX Complete Handler
.org 0x000A 
	reti        ; Analog Comparator Handler
.org 0x000B 
	reti        ; Pin Change Interrupt
.org 0x000C 
	reti        ; Timer1 Compare B Handler
.org 0x000D
	reti        ; Timer0 Compare A Handler
.org 0x000E 
	reti        ; Timer0 Compare B Handler
.org 0x000F 
	reti        ; USI Start Handler
.org 0x0010 
	reti        ; USI Overflow Handler
.org 0x0011 
	reti        ; EEPROM Ready Handler
.org 0x0012 
	reti        ; Watchdog Overflow Handler
```

----------


## Texx

Velko, esi tagad pastiprināti pārslēdzies uz ASM programmēšanu?

----------


## Velko

> Velko, esi tagad pastiprināti pārslēdzies uz ASM programmēšanu?


 Ne īpaši. Vairāk man tomēr patīk C, bet ASM arī nesagādā nekādas problēmas. Pēdējā laikā gan maz sanāk laiku hobijiem veltīt.

----------

