# ATMEL mikrokontrolleri >  pulkstenis uz amteļa.

## dmd

atvainojiet dumjo jautājumu, bet šodien jau esmu iztērējis savus smadzeņu resursus un pat googlē nevaru atrast nepieciešamo. 

tātad dotie:
1,2mhz kristāls
attiny12 

vajag kautkādā saprotamā veidā nonākt līdz sekundes simtdaļām, optimāli tūkstošdaļām. 
cik saprotu reģistri ir 8 bitus plati un pret to arī es atduros.

man nevajag kodu, bet tikai matemātisku ideju, kā to izdarīt. help?

----------


## marcina

1 200 000/100=12 000 (frekvence/sekundes daļas = taktis vienā sekundes daļā)
Tā kā Timer ir tikai 8bit un tā lielākā vērtība ir 255, tad ņemam dalītāju (Prescaler), piemēram, ja dalītājs mums būs 256, tad:
12 000/256 = ~47 (Ja Timer "notikšķinājis" (ar dalītāju 256) 47 reizes, tad tas būs līdzvērtīgs sekundes simtdaļai) 
255-47= 208 (Jo Attiny12 atbalsta tikai Overflow Interrupt).

----------


## dmd

mjā. laikam man šodienai pietiks darboties. 
ja jau tik elementāras lietas nevarēju izdomat, tad labi nav  :: 

paldies  ::

----------


## Velko

Reģistru 8-bitīgumu var viegli apiet izmantojot papildus reģistrus un nedaudz koda. Timer overflow interruptā palielini kādu reģistru, kad tas "apgriežas" un kļūst par 0, palielini nākošo, utt. Lai būtu uzskatāmāk - piemērs off-timerim pēc ~1h, pie 1.2MHz ar prescaleri 1. 


```
        inc off_timer0
        brne timer_exit
        inc off_timer1
        brne timer_exit
        inc off_timer2
        brne timer_exit
        ;; turn it off
        cbi PORTB, PB0
timer_exit:
        reti
```

 Izmantojot šādu tehniku, katru sekundes simtdaļu off_timer0 reģistrs palielinās par 47. Lai tiktu pie sīkāka dalījuma - jāvelk ārā vērtība no TCNT0.

----------


## karloslv

```
uint32_t ticks;

ISR(TIMER0_OVF_vect) {
   ticks++;
}
```

----------


## Velko

karloslv, C tur neies cauri. ATtiny12 nav RAM. Vismaz avr-gcc nemāk nokompilēt izmantojot tikai reģistrus.

----------


## karloslv

ok, tricky. tad nekā  ::  es ar piemēru gribēju teikt, ka nav taču problēmu izmantot vairāk kā 8 bitus, to pašu, ko jau teici.

----------


## dmd

taa, ir kaarteejais jautaajums. shoreiz par 16bitu taimeri. ir attiny2313, cik no datasheeta noprotu vinju var piespiest gjenereet interaptu peec noteiktas taimera veertiibas. taa kaa esmu galiigs iesaaceejs, diezko neizdodas.  google pagaidaam dod tikai, C,  ::  ja nu kaads no no foruma koderiem vareetu  uzrakstiit koda gabalinju ASMaa, es buutu bezgala pateiciigs  :: 

/atvainojiet translitu, garumziimes izbeigushaas.

----------


## Epis

Kur tad īsti ir tā problēma koda rakstīšanā pasaki ko tu īsti tur nesaproti? piemēram kā kodēt tos taimerus, pārtraukuma vekotrus vai katko citu, ja esi mēģinājis kautko kodēt tad ieliec kodu apskatīsos  un ja būs kļūdas varbūt palabošu, varu arī apskatītes kas ir manā kodu arhībā tur noteikti jābūt šitiem PWM taimeru uztādišanas kodiem (tikai citām mikrenēm).

šeit uz ātro atradu vienu kur es pirms gada testēju 16bit taimeri ar CTC režimu (Clear Timer on Compare match). vektoros nekā nav un vari paņemt no šitā pašu pamatu, ja reģistir visi sakrīt jo štias kods ir priekš Atmegas128, vispār paņem un šito kodu avr simulātorā pa soļiem izdebago, jo tur nekā pārāk sarežģita nav.


```
#include "m128def.inc"
   
  ;Fast PWM  
     ;_____________
 rjmp	Starts


.org	$0018
	rjmp	PWM1A	;compare match OCR1A
.org	$001C
	rjmp	Timer1OVF


Starts:
	ldi		r16,0b00100000  ; Motoram 1 PB5 output 
	out		DDRB,r16		;
	ldi		r16,0b00100000	; 
	out		PORTB,r16	

	ldi		r16,0b00010100
	out		TIMSK,r16     ;aktivizç TOIE overflow interupt taimerim 0
	ldi		r16,0b01000000   ;Motors 1 Counter controll reìistrs kurâ liek NON PWM mode ar WGM13:0 = 0) 
	out		TCCR1A,r16

	ldi		r16,1		; Stack point.0x0120
	out		SPH,r16
	ldi		r16,0x20	; laikam uzstâda stack pointeri
	out		SPL,r16



;--------------------
	ldi		r18,0b01000000
	ldi		r17,0b00000000		
	out		ocr1ah,r17	; 
	out		ocr1al,r18

	ldi		r16,0b00001001	; Pec sitaa iesleedzas taimeri un sâk skaitît laiku lîdz ocr1aH,ocr1al TOP
	out		TCCR1B,r16
	ldi		r16,0b00111111 ; ielâdç 111 lai nodzçstu TIFR bitus 
	out		TIFR,r16
	sei
end:   ; izlaist instrukciju ja PinB 0 bits ir set (1) PB0
	nop
	rjmp 	end
PWM1A:
Timer1OVF:
	reti
```

----------


## dmd

sapinos, kuri biti, kuros regjistros ir vajadziigi. taimeris iet, bet interaptu nedod. overflowu, katraa laikaa, kuram tik taimerim gribi, interaptu - nepachom. palasiijos avrfreakus, bet arii tur visaas malaas C. bet es jau esmu pjuurists  :: 

tuuliit paskatiishos kodu un doshu zinju par rezultaatiem.

----------


## dmd

taimeris iet, pa nulleem nometas, tachu TIMSK ir nepareizs prieksh 3213 tinija riit novilkshu 128 megas sheetu un meegjinaashu izsmadzenjot pareizo.

paldies par kodu  ::

----------


## dmd

Pamodās manī programmētājs (pusdivos naktī, vaitad var būt labāks laiks?) un pietjūnoju epja koda piemēru tinijam. vēl piestrādāšu un rīt iepostēšu, ja nu gadījumā vēl kādam rodas šāds jautājums  ::  

vēlreiz paldies epim  :: 

UPD: mana versija par notiekošo


```
.include "tn2313def.inc" ;ielaadeejam 2313. tinija definiicijas

.org $0000
	rjmp reset	; resets
.org   $0004
        rjmp   over   ;compare match OCR1A

reset:

   ldi r16, low(RAMEND) ;steki
   out SPL, r16 

   ldi      r16,0b11000000   ;biti OCIE1A un TOIE1
   out      TIMSK,r16     
   ldi      r16,0b01000000   ; Counter controll regjistrs kurs liek NON PWM mode ar WGM13:0 = 0)
   out      TCCR1A,r16       ; COM1A0
   ldi      r18,0b01000000   ;apaksheejais baits
   ldi      r17,0b00000000   ;augsheejais baits  
   out      ocr1ah,r17       ;shis ir lielums ar kuru saliidzinaasies taimeris
   out      ocr1al,r18       ;taakaa tas ir 16 bitus plats, mums jaamuhljaas ar H un L baitu
   ldi      r16,0b00001001   ;waveforma un  prescale 1
   out      TCCR1B,r16
   sei

loop:     
   rjmp    loop

over:
   reti
```

----------

