Attiny48, timer0

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Attiny48, timer0

Príspevok od používateľa DanielK » 25 Feb 2023, 16:57

Ahoj, mám problém s nastavením timer0 na attiny48 některé bity jsou tam jinak, než na ostatních Attinách.
Potřebuji generovat přerušení každou 1ms F_CPU/Početet_přerusení_za_sekundu/předdělička 1Mhz/1000/8=125
V datasheetu je naspáno, že PRITM0 musí mít nastaveno 0 pro chod časovače0
nastavil sejm Timer 0 na CTC módu
nastavil počáteční hodnotu
maximální honotu při jejímž přetečení dojde k přerušení
povolil přetečení
a nastavil předděličku

Ale žádné přerušení se nekoná, myslím si, že chybu budu mít nejspíš v nastavení to módu CTC, ale když píšou že to ma být v bitu TCCR0A, tak jse to tam dal.
Nemáte tušení, co jsem udělal špatně?

Kód: Vybrať všetko


ISR(TIMER0_COMPA_vect){
//
}

int main(void)
{
	//TIMER0
	PRR &= ~(1 << PRTIM0);//PRTIM0 = 0,  enable Timer0
	TCCR0A |= (1<<CTC0) ;// set Timer0 on CTC mode
	TCNT0 =0;		// start value 
	OCR0A = 124;	// top value for overflow 
	TIMSK0 |= (1<<TOIE0); // overflow interput enable
	TCCR0A |= (1<<CS01); // prescaler 8 

	sei();
	while(1){
	//
	}

0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1148
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Attiny48, timer0

Príspevok od používateľa Atlan » 25 Feb 2023, 19:16

Ako vies ze sa prerusenie nekona ? ked uvazim ze prekladac to cele vyhodil, kedze sa v preruseni nic nenachadza. Pozri diasembler, ci tam vobec nieci je.
0

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: Attiny48, timer0

Príspevok od používateľa DanielK » 25 Feb 2023, 19:32

Poslal jsem ořezaný kód, do přerušení můzeme dát třeba:

ISR(TIMER0_COMPA_vect){
return i++;
}
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 989
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Attiny48, timer0

Príspevok od používateľa budvar10 » 25 Feb 2023, 20:00

To tiež nič neznamená, i musí byť volatile. Pošli celý kód, aj ako si to kompiloval. Alebo skontroluj výstup, či to neovplyvnila optimalizácia.
0

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: Attiny48, timer0

Príspevok od používateľa DanielK » 25 Feb 2023, 20:17

Máš pravdu, zapomněl jsem dát volatile, ale i tak to nechce fungovat.

Kód: Vybrať všetko

//Attiny48
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>


volatile uint16_t i = 0;

ISR(TIMER0_COMPA_vect){ //1ms
	return i++;
}

int main(void)
{
	DDRD = 0b11111111;	// output 

	//TIMER0
	PRR &= ~(1 << PRTIM0);//PRTIM0 = 0,  enable Timer0
	TCCR0A |= (1<<CTC0) ;// set Timer0 on CTC mode
	TCNT0 =0;		// start value 
	OCR0A = 124;	// top value for overflow 
	TIMSK0 |= (1<<TOIE0); // overflow interput enable
	TCCR0A |= (1<<CS01); // prescaler 8 

	sei(); //enable global interrupt
        while (1){
		if(i >=1000){ //1s
                PORTD ^= (1 << 3); //invert PD3
                 }
         }
}
0

Používateľov profilový obrázok
balu
Pokročilý člen
Pokročilý člen
Príspevky: 540
Dátum registrácie: 21 Feb 2022, 12:06

Re: Attiny48, timer0

Príspevok od používateľa balu » 25 Feb 2023, 22:27

DanielK napísal:
25 Feb 2023, 16:57
Ale žádné přerušení se nekoná, myslím si, že chybu budu mít nejspíš v nastavení to módu CTC, ale když píšou že to ma být v bitu TCCR0A, tak jse to tam dal.

Kód: Vybrať všetko


ISR(TIMER0_COMPA_vect){
//
}

int main(void)
{
	//TIMER0
	PRR &= ~(1 << PRTIM0);//PRTIM0 = 0,  enable Timer0
	TCCR0A |= (1<<CTC0) ;// set Timer0 on CTC mode
	TCNT0 =0;		// start value 
	OCR0A = 124;	// top value for overflow 
	TIMSK0 |= (1<<TOIE0); // overflow interput enable
	TCCR0A |= (1<<CS01); // prescaler 8 

	sei();
	while(1){
	//
	}

  1. TCCR0A není bit, ale registr.
  2. ISR vektor je tam vždycky - ten překladač nevyhodí ani, když v něm nic není.
  3. Fungovat to nemůže - hned na první pohled. Koukni ještě jednou do datasheetu.
    Malá nápověda : Overflow interrupt logicky nikdy nastat nemůže (podívej se proč), z TIMSK0 musíš vybrat nějaký jiný. Vektor přerušení máš vybraný správně.
0

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Re: Attiny48, timer0

Príspevok od používateľa DanielK » 26 Feb 2023, 10:11

Děluji, TIMSK0 |= (1<<OCIE0A); // Compare Match A Interrupt Enable

Původně jsem se tam snažil narvat registr OCR0A :cry:
0

Používateľov profilový obrázok
balu
Pokročilý člen
Pokročilý člen
Príspevky: 540
Dátum registrácie: 21 Feb 2022, 12:06

Re: Attiny48, timer0

Príspevok od používateľa balu » 26 Feb 2023, 18:45

:thumbup:
0

Napísať odpoveď