logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[jezyk c] ustawienie predkosci wykonywania programu

marianpl 20 Sty 2010 13:27 1361 5
REKLAMA
  • #1 7563361
    marianpl
    Poziom 10  
    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:
     
    #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;
    
     
    }
  • REKLAMA
  • REKLAMA
  • #3 7563788
    marianpl
    Poziom 10  
    tak juz probowalem, tylko problem w tym ze komenda ta spowoduje spowolnienie calej petli wypisywania znakow, a nie przesuniecia w tablicy o jeden :P
  • REKLAMA
  • #4 7567361
    ZbeeGin
    Poziom 39  
    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.
  • REKLAMA
  • #6 7567527
    mirekk36
    Poziom 42  
    to też jest "arcy"-ciekawa koństrukcja:

    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
REKLAMA