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

[Atmega88][C][WinAvr]Migracja Atmega8->Atmega88 restart I

elektronik12z 23 Cze 2010 13:09 2141 7
REKLAMA
  • #1 8221955
    elektronik12z
    Poziom 13  
    Witam

    Z braku Atmega8 kupiłem Atmegę88, zastosowałem się do manuala migracji z Atmegi8 na Atmegę8, pozmieniałem rejestry..
    Wyświetlacz działa, ale nie działa najważniejsze obsługa zliczania impulsów z urządzenia zewnętrznego i podczas wchodzenia do przerwania INT0_vect samoczynnie się restartuje, wszystkie zmienne wewnątrz procedury przerwania są volatile.

    
    volatile uint16_t sum_of_bit=0;
    volatile uint8_t  is_start_frame=0;
    
    #define ENABLE_INTO_ANY EICRA|=_BV(ISC10);EICRA&=~_BV(ISC01);EICRA|=_BV(ISC00);EIFR = (1<<INTF0);EIMSK=_BV(INT0);
    
    #define max 100
    
    volatile uint16_t rfid_c=0;
    
    volatile uint8_t time_pin[max+1];
    volatile uint8_t time_pin2[max+1];
    
    #define TIMER_OFF_64()  TCCR0A=0; 
    #define TIMER_ON_64()  TCCR0A|=(1<<CS00)|(1<<CS01); 
    
    
    ISR(INT0_vect)
    {	
    		int _counter=0;
    
    		sum_of_bit=0;	
    				
    		if(rfid_c==max)
    			{
    				
    				uint8_t _i=0;
    				for (_i=0;_i<=max;_i++)
    					{
    						sum_of_bit+=time_pin[_i]+time_pin2[_i];
    					}					  
    		 	 }	
    
    				TIMER_OFF_64();
    				TIMER_ON_64();
    				TCNT0=0;
    				uint8_t _size=60;
    				uint8_t _size2=120;
    				
    				if(rfid_c< max)
    				{
    					uint8_t _counter=0;
    					
    					if(bit_is_clear(PIND,PD2))
    					{
    						for(_counter=0;_counter<=30000;_counter++)
    						{
    							if(bit_is_set(PIND,PD2))
    							{
    								break;
    							}
    						}	
    						
    						time_pin[rfid_c]=TCNT0;
    						if((time_pin[rfid_c]>20)&&(time_pin[rfid_c]<=_size)) time_pin[rfid_c]=45;
    						if((time_pin[rfid_c]>80)&&(time_pin[rfid_c]<=_size2)) time_pin[rfid_c]=90;
    						if(time_pin[rfid_c]>_size2)
    						{
    							rfid_c=0;	
    						}else
    						{
    							rfid_c++;	
    						}	
    						
    						
    					}else
    					{
    						for(_counter=0;_counter<=30000;_counter++)
    						{
    							if(bit_is_clear(PIND,PD2))
    							{
    								break;
    							}
    						}	
    						time_pin2[rfid_c]=TCNT0;
    						if((time_pin2[rfid_c]>20)&&(time_pin2[rfid_c]<=_size)) time_pin2[rfid_c]=45;
    						if((time_pin2[rfid_c]>80)&&(time_pin2[rfid_c]<=_size2)) time_pin2[rfid_c]=90;
    						
    					}
    					
    				
    				}
    			TIMER_OFF_64();
    }
    
    
    ....
    
    int main(void)
    {	
    
    //ustawienia portów
    init_ports();
    
    TIMSK0 = 0x04;
    TCCR1B = 0x01;
    
    ENABLE_INTO_ANY;
    sei();
    
    while (1)
    {									    
    	_delay_ms(1000);
    }
    
    


    Proszę o jakieś wskazówki.

    Pozdarwiam
  • REKLAMA
  • #2 8222640
    PO.
    Poziom 20  
    Definicja makra ENABLE_INTO_ANY nie powinna zadziałać nawet na a8, ale może mi się coś wydaje?
    Nie widzę obsługi wyświetlacza, który działa ;) .
    Może problem jest sprzętowy?
  • REKLAMA
  • #3 8222712
    elektronik12z
    Poziom 13  
    Witam

    Na 100% działa na Atmedze8:


    
    #define ENABLE_INTO_ANY MCUCR|=_BV(ISC10);MCUCR&=~_BV(ISC01);MCUCR|=_BV(ISC00);GIFR = (1<<INTF0);GICR=_BV(INT0);
    


    Nie ma kodu obsługi wyświetlacza ponieważ oryginalnie nie ma jej w przerwaniu i nie oddziaływuje na resetowanie procesora.

    Pozdrawiam
  • Pomocny post
    #4 8223664
    janbernat
    Poziom 38  
    Cytat:
    #define TIMER_ON_64() TCCR0A|=(1<<CS00)|(1<<CS01);

    Bity CS00, 01, 02 są w TCCR0B.
    WGM02 też jest w TCCR0B a WGM00 i 01 w TCCR0A.
    P.S.
    W ATmedze88
  • REKLAMA
  • #5 8225204
    elektronik12z
    Poziom 13  
    Witam

    Ok, faktycznie, są w TCCR0B a nie w TCCR0A, sprawdzę i dam znać, dzięki.

    Pozdrawiam
  • Pomocny post
    #6 8225361
    rpal
    Poziom 27  
    niech kolega właczy sobie symulator i w pracy krokowej od razu zobaczysz w którym miejscu programu program się resetuje, przerwanie zasymulujesz przez ustawienie z ręki odpowiedniej flagi.
  • REKLAMA
  • Pomocny post
    #7 8226628
    gaskoin
    Poziom 38  
    a nie włączasz gdzieś jakiegoś przerwania, którego nie obsługujesz?

    avry mają tak, że jeżeli włączysz jakieś przerwanie, np overflow od TC1, a go nie obsłużysz, to podczas wystąpienia przerwania następuje restart procka
  • #8 8229305
    elektronik12z
    Poziom 13  
    Witam

    Dziękuję za trafne rady, zaczęło działać, skoncentrowałem się nad przerwaniem INT0, okazało się, że zostawiłem nieobsługiwane przerwanie od USARTA i timera1, poza tym zamiast TCCR0B było TCCR0A.

    Pozdrawiam i zamykam temat
REKLAMA