FAQ | Points | Add... | Recent posts | Search | Register | Log in


Optymalizacja kodu w C na atttiny2313


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Optymalizacja kodu w C na atttiny2313
Author
Message
djbpm
Poziom 16
Poziom 16


Joined: 22 Jan 2003
Posts: 337
Location: -

Post#1 Post from the author of the topic 24 May 2006 17:16   

Optymalizacja kodu w C na atttiny2313


Jako że to jeden z pierwszych programów w C, i kombinuje z nim już sporo czasu, straciłem cierpliwość, a właściwie brak mi pomysłów.
Ma to chodzić na attiny2313, w następujący sposób.
Procek sprawdza stan PINB1 i jeśli 1 to wysyła dane z tablicy „jedynka” jeśli zero to „zero” na PORTD. Wysłanie jedynki zmienia fazę, w taki sposób, że następna wysyłana tablica będzie wysyłana w odwrotną stronę (od końca). Mniej więcej w połowie wysyłania tablicy ma zostać ustawiona 1 na PORTB0. Po skończeniu wysyłania tablicy ma być 0 na PORTB0, sprawdzenie stanu PINB1, fazy, i wysyłanie. Tablica dla 0 jest wysyłana 2krotnie, ponieważ ma 192 elementy, a powinna mieć 384.

Program działa, ale problem jest to, że wartości na portach mają się pojawiać co 19 taktów. Teraz pojawiają się co 9 lub 11, można wstawić _NOP() lub coś pożytecznego, bo sprawdzenie stanu portu, i fazy trwa dużo za długo. Też powinno się zmieścić w 19 taktach. Ewentualnie można wyciąć ostatni i pierwszy element z tablicy, i zyskamy 19+2*19 czyli razem 57 taktów, ale to wciąż za mało. Czy ktoś wie jak to znacząco przyspieszyć?
Korzystam z avr studio i winavr, włączyłem optymalizacje na 0s


Code:

#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#include <avr\io.h>
#include <avr\iom8.h>
#include <compat/ina90.h>

unsigned char zero[] = {128, 134, 136, 134, 128, 116, 111, 116, 128, 146, 153, 146, 128, 105, 95, 105, 128, 157, 169, 157, 128, 94, 79, 94, 128, 168, 184, 168, 128, 83, 65, 83, 128, 178, 199, 178, 128, 73, 51, 73, 128, 187, 212, 187, 128, 69, 44, 69, 128, 192, 218, 192, 128, 60, 33, 60, 128, 199, 229, 199, 128, 53, 22, 53, 128, 206, 238, 206, 128, 47, 14, 47, 128, 211, 245, 211, 128, 43, 8, 43, 128, 215, 251, 215, 128, 40, 3, 40, 128, 217, 254, 217, 128, 38, 1, 38, 128, 218, 255, 218, 128, 38, 1, 38, 128, 217, 254, 217, 128, 40, 3, 40, 128, 215, 251, 215, 128, 43, 8, 43, 128, 211, 245, 211, 128, 47, 14, 47, 128, 206, 238, 206, 128, 53, 22, 53, 128, 199, 229, 199, 128, 60, 33, 60, 128, 196, 218, 192, 128, 69, 44, 69, 128, 183, 205, 183, 128, 78, 57, 78, 128, 173, 192, 173, 128, 88, 72, 88, 128, 162, 177, 162, 128, 99, 87, 99, 128, 151, 161, 151, 128, 110, 103, 110, 128, 140, 145, 140, 128, 122, 120, 122, 128};
unsigned char jedynka[] = {128, 124, 122, 124, 128, 137, 141, 137, 128, 112, 105, 112, 128, 149, 158, 149, 128, 100, 88, 100, 128, 161, 175, 161, 128, 89, 73, 89, 128, 172, 190, 172, 128, 79, 58, 79, 128, 181, 203, 181, 128, 69, 45, 69, 128, 190, 215, 190, 128, 62, 34, 62, 128, 197, 225, 197, 128, 55, 25, 55, 128, 202, 233, 202, 128, 51, 19, 51, 128, 206, 239, 206, 128, 47, 14, 47, 128, 209, 243, 209, 128, 45, 11, 45, 128, 211, 245, 211, 128, 45, 10, 45, 128, 210, 244, 210, 128, 45, 11, 45, 128, 209, 243, 209, 128, 47, 14, 47, 128, 207, 240, 207, 128, 50, 18, 50, 128, 204, 235, 204, 128, 53, 22, 53, 128, 200, 230, 200, 128, 57, 28, 57, 128, 197, 225, 197, 128, 61, 33, 61, 128, 192, 219, 192, 128, 65, 39, 65, 128, 188, 213, 188, 128, 69, 44, 69, 128, 185, 208, 185, 128, 72, 49, 72, 128, 182, 204, 182, 128, 75, 53, 75, 128, 180, 201, 180, 128, 77, 56, 77, 128, 177, 198, 177, 128, 78, 57, 78, 128, 177, 198, 177, 128, 78, 57, 78, 128, 177, 198, 177, 128, 77, 56, 77, 128, 179, 200, 179, 128, 76, 54, 76, 128, 180, 202, 180, 128, 74, 51, 74, 128, 183, 206, 183, 128, 70, 46, 70, 128, 187, 211, 187, 128, 66, 41, 66, 128, 191, 217, 191, 128, 63, 36, 63, 128, 194, 222, 194, 128, 59, 30, 59, 128, 199, 228, 199, 128, 54, 24, 54, 128, 202, 233, 202, 128, 51, 19, 51, 128, 206, 238, 206, 128, 48, 15, 48, 128, 209, 242, 209, 128, 46, 12, 46, 128, 210, 244, 210, 128, 45, 11, 45, 128, 211, 245, 211, 128, 45, 11, 45, 128, 210, 244, 210, 128, 47, 13, 47, 128, 208, 241, 208, 128, 49, 16, 49, 128, 204, 236, 204, 128, 53, 22, 53, 128, 199, 229, 199, 128, 59, 30, 59, 128, 193, 220, 193, 128, 66, 41, 66, 128, 185, 209, 185, 128, 75, 53, 75, 128, 175, 195, 175, 128, 85, 67, 85, 128, 165, 181, 165, 128, 95, 82, 95, 128, 154, 165, 154, 128, 107, 98, 107, 128, 142, 148, 142, 128, 119, 115, 119, 128, 130, 131, 130, 128};
int i=0;
char faza=0;


void initialization(void)
{
DDRD = 0xff; // Set PORTD as output
DDRB = 0x01; // set pin 0 as output, 1, 2, 3, 4, 5, 6, 7 as input
PORTB = 0xff;
}

void wyslijzero(void)
    {

      if (faza==0)         //dla fazy 0
      {
      for (i=191; i >= 0; i=i-1)
       {
        PORTD = zero[i];
       }
   PORTB |= (1<<0);
        for (i = 1; 192 >= i; i=i+1)
      {
        PORTD = zero[i];
       }
   PORTB &= ~(1 << (0));
      }
      
      else               //dla fazy 1

      {

      for (i = 1; 192 >= i; i=i+1)
        {
        PORTD = zero[i];
        }
   PORTB=PORTB|(1<<0);
        for (i=191; i >= 0; i=i-1)
        {
        PORTD = zero[i];
       }

   PORTB &= ~(1 << (0));
      }

   }


void wyslijjeden(void)



    {
       if (faza==0)         // dla fazy 0
      
      {
      faza = 1;
         for (i = 1; 192 >= i; i=i+1)
        {
        PORTD = jedynka[i];
        }
   PORTB=PORTB|(1<<0);
        for (i = 193; 384 >= i; i=i+1)
        {
      PORTD = jedynka[i];
        }
   PORTB &= ~(1 << (0));
      }
      else               // dla fazy 1
      {
      faza = 0;
         for (i=383; i >= 192; i=i-1)
        {
        PORTD = jedynka[i];
        }
   PORTB=PORTB|(1<<0);
        for (i=191; i >= 0; i=i-1)
        {
      PORTD = jedynka[i];
        }
   PORTB &= ~(1 << (0));
      }


   }




void main (void)
{
initialization(); //Initialize Pheripherals
   while (1)
   {
      if(CHECKBIT(PINB,PINB1))
      {
      wyslijjeden();
      }
      else       
      {
      wyslijzero();
      }
   }
}

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 24 May 2006 17:16   





Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Optymalizacja kodu w C na atttiny2313
Page 1 of 1
Similar topics
Optymalizacja Kodu - AVR Studio (5)
Optymalizacja kodu ATmega8 + ADXL202 (9)
Optymalizacja kodu c++ keil (8)
[Avr][C] Optymalizacja kodu (4)
[C] Opóźnienia i optymalizacja kodu (12)
DSP a C - optymalizacja kodu. (2)
DS18B20 Optymalizacja kodu (4)
optymalizacja kodu w C... (3)
Optymalizacja kodu AVR-GCC (4)
BASCOM VU meter optymalizacja kodu (11)

Page generation time: 0.106 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed