ATtiny2313

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
chapp

ATtiny2313

#1 Příspěvek 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?

tdc

ATtiny2313

#2 Příspěvek od tdc »

Vypada to, ze kompiler pri optimalizaci usoudi, ze se k tomu kodu nikdy nedostane, tak ho uplne vypusti.

chapp

Re: ATtiny2313

#3 Příspěvek 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:(

Uživatelský avatar
Mica
Příspěvky: 163
Registrován: 21 říj 2005, 02:00
Bydliště: Praha
Kontaktovat uživatele:

Re: ATtiny2313

#4 Příspěvek 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(;;)

Uživatelský avatar
Modemo
Příspěvky: 90
Registrován: 13 kvě 2007, 02:00
Bydliště: Brno, Pov. Bystrica

#5 Příspěvek 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....

\_Honza_/

#6 Příspěvek 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

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“