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

Jak poprawnie ustawić kwarc ATMega16 i zewn16MHz - fuses

vadis0781 08 Lis 2009 09:05 1602 2
REKLAMA
  • #1 7230293
    vadis0781
    Poziom 11  
    Mam problem ze stabilnym przesyłem bajtów , czesto zdarza sie że poleci coś innego.moja aplikacja przesyła ciagi znaków na port rs,predkosc połaczenia to 9600.

    Nie wiem jak ostatecznie i na 200% poustawiać fuses dla zewn kwarca 16MHz. Czytałem gdzieś że powyżej 8MHz dla tego procesora trzeba dodatkowo włączyć" podwyższoną amplitude" - nie wiem co to jest , może ktoś wrzucił by screen całości ustawień fuses w wersji avr 4.17 ???
    proszę o pomoc, gdyż poblokowałem sobie już parę razy komunikację. Procesor uratowałem wtedy BEEPROGiem+

    Z gory dziękuje
  • REKLAMA
  • #2 7230352
    ZbeeGin
    Poziom 39  
    Nota katalogowa mówi wyraźnie:
    Cytat:
    For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed and 16 MHz with CKOPT programmed. C1 and C2 should always be equal for both crystals and resonators.
    Dla rezonatorów, maksymalna częstotliwość to 8MHz przy niezaprogramownym bicie CKOPT, a 16MHz z zaprogramowanym bitem CKOPT. C1 i C2 powinny zawsze mieć tą samą pojemność zarówno dla kwarców jak i rezonatorów.

    Domyślnie CKOPT jest w stanie "unprogrammed" (1).
  • #3 7230363
    vadis0781
    Poziom 11  
    Jak je włączyć to CKOPT ?? musi być zaznaczone ptaszkiem czy odznaczone???

    Czytałem note, dokładnie te słowa, które cytujesz, ale różnie różne programy traktują zaznaczenie"ptaszkiem".

    problem jest taki że moj procek wysyła na rs po każdym resecie ciut minimalnie inne dane

    
    #include <avr/io.h>
    #include <util/delay.h>   
    #include <compat/deprecated.h>              
    #include <string.h>
    
    
    unsigned char odebrane;
    
    #define CPU_Hz 1000000 // częstotliwość zegara w Hz
    #define OSC 16 // częstotliwość zegara w MHz
    
    #define BAUD 19200 // prędkość transmisji po RS232
    #define MYUBRR  (CPU_Hz/(1ul*BAUD)-1)// CPU_Hz/8/BAUD-1
    
    /// **** fukcje dla RS232 ****
    void UART_init(unsigned int ubrr) // inicjalizacja
    {
    	UBRRH = (unsigned char) (ubrr>>8); // ustawienie prędkości
    	UBRRL = (unsigned char) ubrr;
    	UCSRB = (1<<RXEN)|(1<<TXEN); // transmisja dwukierunkowa, odbieranie/nadawanie
    	UCSRC = (1<<URSEL)|(3<<UCSZ0); // ustawienie 8 bitów danych i 1 bity stopu
    }
    
    
    void USART_out (unsigned char data) // wysłanie znaku
    {
    	while (!(UCSRA & (1<<UDRE)));
    	odebrane=UDR;
    	UDR = data;
    }
    
    
    unsigned char USART_in (void) // odebranie znaku
    {
    	while (!(UCSRA & (1<<RXC)));
    	return UDR;
    }
    
    
    void USART_Flush( void ) 
    { 
        unsigned char dummy; 
        while ( UCSRA & (1<<RXC) ) dummy = UDR; 
    } 
    
    
    //********* moje funkcje do portow *****************
    void wyslijTekst(char *tekstDoWyslania)
    {
    	
    	while (!(UCSRA & (1<<UDRE)));
    
    	for(int i;i<=strlen(tekstDoWyslania);i++)
    	{	
    		USART_out(tekstDoWyslania[i]);
    	}
    	USART_out(10);
    	//USART_Flush();
    	
    }
    
    
    char bufor[100];
    char bufor1[100];
    
    char* czytajTekst()
    {
    	for (int i=0;i<100;i++)
    	{
    		bufor[i]=0;
    	}
    
    	char *czytanyTekst="";
    	int p=0;
    	char litera=USART_in();
    	bufor[p]=litera;
    	while((litera=USART_in())!=10)
    	{
    		p++;
    		bufor[p]=litera;
    		
    	}
    	//USART_Flush();
    	return bufor;
    
    	
    }
    
    int porownaj(char* polecenie)
    {
    	for (int i=0;i<100;i++)
    	{
    		bufor1[i]=0;
    	}
    
    	for (int i=0;i<=strlen(polecenie);i++)
    	{
    		bufor1[i]=polecenie[i];
    	}
    
    	int test=0;
    	for(int i=0;i<100;i++)
    	{
    		if (bufor[i]!=bufor1[i]) test+=1;
    	}
    	return test;
    }
    
    //************* obsloga diod ***************
    void startujDiody()
    {
    	DDRB=0xFF; //ustawiamy port b na wyjścia
    	wyslijTekst("Ustawiono port B na wyjscia");
    }
    
    void kasuj()
    {
    	sbi(PORTB,0);
    	sbi(PORTB,1);
    	sbi(PORTB,2);
    	sbi(PORTB,3);
    	sbi(PORTB,4);
    	sbi(PORTB,5);
    	sbi(PORTB,6);
    	sbi(PORTB,7);
    	wyslijTekst("Zgaszono wszystkie diody");
    	_delay_ms(10000);
    }
    
    void zapalWszystkie()
    {
    	cbi(PORTB,0);
    	cbi(PORTB,1);
    	cbi(PORTB,2);
    	cbi(PORTB,3);
    	cbi(PORTB,4);
    	cbi(PORTB,5);
    	cbi(PORTB,6);
    	cbi(PORTB,7);
    	wyslijTekst("Zapalono wszystkie diody");
    	_delay_ms(10000);
    }
    
    void zapal(int i)
    {
    	cbi(PORTB,i);
    	wyslijTekst("Zapalono diode");
    	_delay_ms(10000);
    }
    void zgas(int i)
    {
    	sbi(PORTB,i);
    	wyslijTekst("Zgaszono diode");
    	_delay_ms(10000);
    }
    
    
    
    
    
    
    int main(void)
    {
    	
    	UART_init(MYUBRR);
    	
    	char *tekst= "Zaczynamy, wyslij cos, jezeli nie wiesz co zrobic, to napisz pomoc";
    	
    	wyslijTekst(tekst);
    	
    	startujDiody();
    	kasuj();
    	
    
    	while(1)
    	{
    		/*
    		char a= USART_in();
    								
    		wyslijTekst(strncat("Odebrano: ",(char*)&a,1));
    		
    		_delay_ms(10000);
    		*/
    		//wyslijTekst(strcat("Odebrano: ",czytajTekst()));	
    
    		char* tt=czytajTekst();
    		//wyslijTekst(tt);
    		
    		_delay_ms(10000);
    
    		int wynik=0;
    
    		if(porownaj("test")==0)
    		{
    			wyslijTekst("Wyslalest test jest OK!");
    			wynik=1;
    		}
    		
    		
    		if (porownaj("status")==0)
    		{
    			wyslijTekst("System dziala poprawnie, DZIEKUJE!!!");
    			wynik=1;
    		}	
    		
    		if(porownaj("pomoc")==0)
    		{
    			wynik=1;
    			wyslijTekst("To jest pomoc do systemu. Polecenia, ktore rozumiem to: ");
    			//_delay_ms(10000);
    			wyslijTekst(" - test - testowe polecenie");
    			//_delay_ms(10000);
    			wyslijTekst(" - status - wyswietlam status systemu");
    			//_delay_ms(10000);
    			wyslijTekst(" - pomoc - wyswietlam ta pomoc");
    			wyslijTekst(" - diody zgas - gasi diody");
    			wyslijTekst(" - diody zapal - zapala diody");
    			wyslijTekst(" - diody zapal n - zapala diode n");
    			wyslijTekst(" - diody zgas n - gasi diode n");
    			//_delay_ms(10000);
    
    		}		
    
    		if(porownaj("diody zapal 0")==0)
    		{
    			zapal(0);
    			wynik=1;
    		}
    		if(porownaj("diody zgas 0")==0)
    		{
    			zgas(0);
    			wynik=1;
    		}
    
    		if(porownaj("diody zapal 1")==0)
    		{
    			zapal(1);
    			wynik=1;
    		}
    		if(porownaj("diody zgas 1")==0)
    		{
    			zgas(1);
    			wynik=1;
    		}
    
    		if(porownaj("diody zapal 2")==0)
    		{
    			zapal(2);
    			wynik=1;
    		}
    		if(porownaj("diody zgas 2")==0)
    		{
    			zgas(2);
    			wynik=1;
    		}
    
    		if(porownaj("diody zgas")==0)
    		{
    			kasuj();
    			wynik=1;
    		}
    
    		if(porownaj("diody zapal")==0)
    		{
    			zapalWszystkie();
    			wynik=1;
    		}
    
    		if(wynik==0)
    		{
    			wyslijTekst(strcat("Przepraszam, ale nie rozumiem polecenia: ",tt));
    		}
    
    		
     
    	}
     
    
     
     }
     
    


    Jak poprawnie ustawić kwarc ATMega16 i zewn16MHz - fuses

    jak widac w oknie terminala - program po resecie nadaje dziwnie. Nie rozumiem tego błędu.
REKLAMA