Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[jezyk c] ustawienie predkosci wykonywania programu

marianpl 20 Sty 2010 13:27 1169 5
  • #1 20 Sty 2010 13:27
    marianpl
    Poziom 8  

    Witam, napisałem program, który pozwala na wyświetlenie 16 znaków z tablicy na 16 7-segmentowych wyświetlaczach. Następnie program przesuwa znaki w tablicy o 1 wyświetla kolejny znak, tak że całość przesuwa się na wyświetlaczach. Problem w tym że dzieję się to za szybko i znaki biegną tak, że prawie nie można nic przeczytać na wyświetlaczu. Jeśli ktoś może, proszę o rady, w jaki sposób np. dopisać podprogram który by nam przesuwał z określoną prędkością znaki w tablicy po wyświetleniu 16 znaków jednorazowo bądź też jak opóźnić przejście gdy wykona się pętla wyświetlająca 16 znaków. Dzięki za wszelkie rady, poniżej wstawiam listing programu:

    Code:
     
    
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <avr/pgmspace.h>
    #include "font.h" 
    #include <avr/delay.h>

    static char dd,d,j,jj;

    unsigned char PROGMEM Fnt[]= Font;
    int k,l;
    char Buffer[128][8];


    ISR (TIMER0_OVF_vect)
    {
       
    do {
       
        for (jj=1;jj<8;jj++)
          {
           Buffer[k][l] =(pgm_read_byte(&Fnt[(jj*d)]));
          l++;
          }
       d++;
       k++;
       l=0;
       }
       while(k<128);
    if (k==128){
       k=0;
       l=0;
       d=0;}
          
    do{
       PORTB = 0;
       for (j=1;j<17;j++)
          {
           PORTD =(Buffer[j+k-1][l]);
            PORTB =j;   
          }
       PORTB=(dd<<4);
       l++;   
        dd++;
       
       if (dd==7)
       {
       dd=0;
       k++;
       l=0;
       czekaj();
       }
       if (k==111)
       k=0;
       PORTB |= 0x80;} while(1);
    }   
    //ISR (TIMER2_OVF_vect)   

    //void buffer (void)   

    void czekaj (void)   //to chyba zly pomysl na zwiekszenie przerwy???
    {
    ISR (TIMER2_OVF_vect)
    {
    PORTB |= 0x80;   
    PORTB = 0;   
    }
    }


    void ioinit (void)         
    {
       DDRB = 255;
       DDRD = 255;
       dd =0;
       k=0;
       l=0;
       TIMSK = _BV (TOIE2);

       TCCR2=1;  //TIMER1_PWM_INITmax5-ak bude treba zmen rychlost
             
                   //Load the timer counter with 0 to begin with.

       
        TCCR0 =3;   //TIMER1_PWM_INIT;max5
       
        // Enable timer 1 overflow interrupt.
          TIMSK = _BV (TOIE0);

        sei ();
    }


    int main (void)
    {
        ioinit ();
       
     

       while(1)
        {   
     //  lcd_goto(4);
       //lcd_writebyte(dd);
         

       }
       return 0;

     
    }

    0 5
  • #3 20 Sty 2010 15:00
    marianpl
    Poziom 8  

    tak juz probowalem, tylko problem w tym ze komenda ta spowoduje spowolnienie calej petli wypisywania znakow, a nie przesuniecia w tablicy o jeden :P

    0
  • #4 21 Sty 2010 06:46
    ZbeeGin
    Poziom 38  

    Podstawowa zasada: przemiatanie wyświetlaczy swoim cyklem, a operacje na tablicy swoim cyklem. Dobierając stosunek jednego do drugiego zmieniasz prędkość.

    Niestety kod jest nieczytelny! Brak wcięć. Nie jest w znacznikach. Zmienne ponazywane bele jak. Brak komentarzy.
    Nikt nie będzie zgadywał co jest tutaj czym.

    0
  • #5 21 Sty 2010 07:13
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Najlepsza jest pętla do { ... } while(1); wewnątrz przerwania od timera [; Takie coś nie śniło się architektom software'u nawet w najgorszych koszmarach <:

    4\/3!!

    0
  • #6 21 Sty 2010 08:44
    mirekk36
    Poziom 42  

    to też jest "arcy"-ciekawa koństrukcja:

    Code:
    void czekaj (void) //to chyba zly pomysl na zwiekszenie przerwy??? 
    
    {
    ISR (TIMER2_OVF_vect)
    {
    PORTB |= 0x80;
    PORTB = 0;
    }
    }


    coś mi pachnie, że ten twój cały program może nie tyle za szybko działa , a twoje "specyficzne" zabiegi jego spowalniania nie przynoszą żadnych efektów, bo on się co chwilę resetuje.

    Weź ty usiądź jak już mówiono wyżej, napisz ten program z odpowiednimi wcięciami to już sam po tym zabiegu spojrzysz na niego inaczej i być może sam zobaczysz mega błędy. A chcąc aby ktoś na niego rzucił okiem i go sobie nie połamał - włóż go w znaczniki CODE

    0
  Szukaj w 5mln produktów