Stránka 1 z 1

ATtiny2313

Napsal: 10 kvě 2007, 18:32
od chapp
Ahoj,
pokusim se na ATMELu tiny2313 rozchodit preruseni pri preteceni citace 0.

Kód: Vybrat vše

#include <avr/io.h> 
#include <stdio.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 4000000UL  // 4 MHz
    

int j,k;

ISR(TIM0_OVF_vect)
{
  j++;
  if(j >= 300){
    if(PORTB == 0) PORTB = 0xFF; 
 	else PORTB = 0x00; 
    j=0;
  }  
   
}


int main (void) {            
 
   // port B, ledka
   PORTB = 0x00;  //0x1C;             
   DDRB  = 0xFF;  //0x1C; 
   
   // port D
   PORTD=0x00;
   DDRD=0x00;
  
   // time/counter 0
   TCCR0A=0x00;
   TCCR0B=0x05;
   TCNT0=0x50;
   OCR0A=0x00;
   OCR0B=0x00;

   // povoleni preruseni od citacu
   TIMSK=0x02;

   //globalni povoleni preruseni
   sei();


   j=0;
 
   while(1) {                
     k=0;
	
   }                         
 
   return 0;                 
}

je to napsany ve WinAVR a vubec to nefunguje:( na vystupu tech pinu neni nic videt ani osciloskopem:(

kdyz dam do toho nekonecnyho cyklu

Kód: Vybrat vše

 while(1){ if(PORTB == 0) PORTB = 0xFF; 
 	else PORTB = 0x00;} 
a delay_ms(5)
tak vystup normalne kmita. Nenapada Vas cim to muze byt?

ATtiny2313

Napsal: 11 kvě 2007, 02:38
od tdc
Vypada to, ze kompiler pri optimalizaci usoudi, ze se k tomu kodu nikdy nedostane, tak ho uplne vypusti.

Re: ATtiny2313

Napsal: 12 kvě 2007, 21:05
od chapp
tdc píše:Vypada to, ze kompiler pri optimalizaci usoudi, ze se k tomu kodu nikdy nedostane, tak ho uplne vypusti.
Ahoj,
myslis ze se to muze stat? Koukal jsem na vytvoreny soubor s asemblerem a tam je to preruseni normalne ostrene. Take jsem zkusel prepnout optimalizaci z -s -0 nepomohlo to:(

Re: ATtiny2313

Napsal: 17 kvě 2007, 18:59
od Mica
chapp píše:
tdc píše:Vypada to, ze kompiler pri optimalizaci usoudi, ze se k tomu kodu nikdy nedostane, tak ho uplne vypusti.
Ahoj,
myslis ze se to muze stat? Koukal jsem na vytvoreny soubor s asemblerem a tam je to preruseni normalne ostrene. Take jsem zkusel prepnout optimalizaci z -s -0 nepomohlo to:(
zkus místo while(1) používat

Kód: Vybrat vše

 for(;;)

Napsal: 17 kvě 2007, 20:07
od Modemo
2Mica tym to veru nebude....

2Chapp
No najskor by som skusil nahodit najnovsiu verziu winavr, ale tym to asi nebude....
Nemam ti to cas cele kontrolovat ale vyskusaj toto

Kód: Vybrat vše


int k; 
volatile int j;

SIGNAL(TIMER0_OVF_vect) 
{ 
  j++; 
  if(j >= 300){ 

Zvysok rovnaky ako v tvojom prog. Premenne ktore pouzivas mimo hlavny program(prerusenie a take), jednoducho tie co sa mozu menit asynchrone od behu programu, tie musia byt volatile, to zabezpeci, aby ich kompilator neodignoroval alebo nenahradil konstantami....

Napsal: 18 kvě 2007, 15:10
od \_Honza_/
Premenne ktore pouzivas mimo hlavny program(prerusenie a take), jednoducho tie co sa mozu menit asynchrone od behu programu, tie musia byt volatile, to zabezpeci, aby ich kompilator neodignoroval alebo nenahradil konstantami....
Pøešnì v tom bude chyba. Promìnná použivaná v pøerušeních i ve standartním bìhu programu musí být deklarovaná s direktivou volatile viz http://www.nongnu.org/avr-libc/user-man ... q_volatile