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

[Atmega8][C] współpraca z SAA3010 i błędy przy odbiorze RC5

julek22 24 Sty 2010 16:42 1176 2
REKLAMA
  • #1 7584538
    julek22
    Poziom 10  
    Witam !

    Na początek zaznaczę, że jeszcze raczkuje w dziedzinie programowania choć mam za sobą już kilka projektów.

    Mój problem polega na tym iż nie mogę w żaden sposób poprawnie wyświetlić komend jakie nadaje pilot oparty na US SAA3010. Założeniem było aby rozkaz był wyświetlony na LCD w postaci binarnej. Wyświetlacz pokazuje 0 i 1 w różnych co prawda kombinacjach jednak przy dłuższym przytrzymaniu przycisku położenia tych zer i jedynek zmieniają się. Nie wiem co jest tego przyczyną mimo, że przeczytałem chyba wszystkie tematy o RC5, dokumentacje itp.
    Bardzo proszę doświadczonych programistów o pomoc w rozwiązaniu problemu.
    Z góry wielkie dzięki !

    Oto kod:
    
    #define F_CPU8000000L
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <hd44780.h>
    #include <hd44780.c>
    
    
    int tab[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    char t[4];
    int i,j,k;
    
    
    int main(void)
    {
    
    
    DDRB=0xFF;
    PORTB=0xFF;
    DDRC=0x00;
    PORTC=0x00;
    
    LCD_Initalize();
    LCD_Clear();
    
    GICR=0b10000000;
    MCUCR|=_BV(ISC10);
    sei();	
    
    	while(1)
    	{
    			for(j=8;j<14;j++)
    			{
    			itoa(tab[j],t,2);
    			LCD_GoTo(j-8,0);
    			LCD_WriteText(t);
    				
    			}
    		
    		
    	}
    
    }	
    	
    	ISR(INT1_vect)
    	{
    		_delay_us(1333);
    		
    		if(!(PIND & 0x08))
    		{
    			tab[i]=0;
    		
    		}
    		else;
    		
    		if(PIND & 0x08)
    		{
    			tab[i]=1;
    		
    		}
    		
    		i++;
    		
    		if(i==13)
    		{
    		i=0;
    		
    		}
    	}



    inventco.eu - post poprawiłem. Kod programu umieszczamy w znacznikach code. Regulamin forum.
  • REKLAMA
  • #2 7585837
    rodzio
    Poziom 12  
    Niestety w taki prosty sposób nie da się tego zrobić. Odstęp między każdymi bitami wynosi 1.728ms, 1333 przesuwa o jakieś 3/4...
    Dobrym rozwiązaniem będzie pozbyć się delay'i, na wejściu INT wykrywać każdą kolejną zmianę i z pomocą lecącego w tle timera wykrywać poszczególne stany.

    Dołączam plik Peter'a Fleury możesz się na nim wzorować lub wykorzystać w całości:)
  • #3 7598057
    julek22
    Poziom 10  
    Wielkie dzięki za kod źródłowy.
    Idealny do zrozumienia poprawnego odbioru kodu RC5.
    Po drobnych przeróbkach układzik wystartował :)).

    Temat uważam za zamknięty.

    Pozdrawiam !!!
REKLAMA