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

Jak efektywnie obsługiwać symualcji w AVRStudio

grzece 16 Cze 2009 13:39 1455 7
  • #1 6663001
    grzece
    Poziom 15  
    Zrobiłem sobie programik pod Atmege8 wychylajacy serwo w jedna strone. Wiem, ze PWM można zrobić w pełni sprzętowo, ale jeszcze do tego nie doszedłem.
    #include <avr/io.h>
    #include <avr/interrupt.h>
    int b=0;
    int main (void)
    {
       
       DDRB |= (1 << 0); // Set LED as output
    
       TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
    
       TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
    
       sei(); //  Enable global interrupts
    
       OCR1A   = 1000; 
    
       TCCR1B |= (1 << CS11); // Start timer no preskaler
       PORTB |= (1 << 0); 
    
       for (;;)
       {
    
       }
    }
    
    ISR(TIMER1_COMPA_vect)
    {
    	b++;
    	if (b>=20) {
    		b=0;
    	}
    	if ((b>=1) && (b<20)) {
    		PORTB |= (0 << 0);	
    	}
    	if (b<1) {
    		PORTB |= (1 << 0);
    	}
      
    } 

    Część kodu pochodzi z tutoriala dotyczącego timerów. I teraz dochodzimy do AVRStudio. Gdy wlaczam debugera dlaczego muszę ustawić ręcznie co poniektóre rejestry, czy nie może sobie ich ustawić tak jak jest to w programie :/. Poza tym jak mam sprawdzić czy rzeczywiście wypełnienie trwa 1 ms, a 19 ms przerwy skoro na autostepie to leci tak wolno, że nie mam ochoty czekać 5 minut.
  • #2 6663529
    _Robak_
    Poziom 33  
    Jesli w symulatorze masz pokazane ze nie jest ustawiony rejestr, to tak wlasnie jest. Zmylic cie moze opytmalizacja, wtedy program dosc "skacze" i nie idzie po kolei. Jesli chodzi o pwm i symulacje, to sobie ja daruj, w avrstudio symulacja timerow jest zbugowana.
  • #3 6663558
    piti___
    Poziom 23  
    Witam

    Wydaje mi się że twoje instrukcje nie będą działać tak jakbyś chciał:
    
          PORTB |= (0 << 0);    
    

    ta instrukcja ORuje na cały port "0" czyli nie zmieni stanu portu.

    Co do symulacji ustalaj breakepointy i puszczaj program. Po jednym breaku sprawdzasz czas, puszczasz program i na następnym breaku znowu odczytujesz czas.

    Pozdrawiam

    Błąd poprawiony, sorry.
  • #4 6664450
    ZbeeGin
    Poziom 39  
    No i warto czasem się przełączyć na widok "Dissasembler Window".
    Jakbyś miał lepszą ATMegę (np. 16/32) to mógłbyś też skorzystać z dobrodziejstw JTAGa.
  • #5 6664708
    grzece
    Poziom 15  
    To tak właściwie jak przelączyć ten port, żeby się przełączył ten bit na zero nie wpływając na reszte bitów bo nie umiem wymyślić?
  • #7 6666659
    piti___
    Poziom 23  
    Instrukcja AND (&) i negacja bitowa (~)

    PORTB &= ~(1<<0);
  • #8 6666736
    grzece
    Poziom 15  
    Wiec zmienilem kod na taki:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    int b=0;
    int main (void)
    {
       
       DDRB |= (1 << 0); // Set LED as output
    
       TCCR1B |= (1 << 3); // Configure timer 1 for CTC mode
    
       TIMSK |= (1 << 4); // Enable CTC interrupt
    
       sei(); //  Enable global interrupts
    
       OCR1A   = 1000; // Set CTC compare value to 1Hz at 1MHz AVR clock, with a prescaler of 64
    
       TCCR1B |= (1 << 0); // Start timer no preskaler
       PORTB |= (1 << 0); 
    
       for (;;)
       {
    
       }
    }
    
    ISR(TIMER1_COMPA_vect)
    {
    	b++;
    	if (b>=5) {
    		b=0;
    	}
    	if ((b>=1) && (b<5)) {
    		PORTB &= ~(1 << 0);	
    	}
    	if (b<1) {
    		PORTB |= (1 << 0);
    	}
      
    } 
    

    Jednak w dalszym ciągu po odpaleniu debugera tylko rejestr DDRB oraz brak preskalera jest poprawnie ustawiony. Mógłby mi ktoś powiedzieć jak to się dzieje. Co do działania breakpointów to ich nie rozumiem. W zwykłym kompilatorze do np. C# na PC sobie je ustawiam i mi tam pauzuje, mogę sobie wtedy zobaczyć chociażby wartości zmiennych w tej itp. Natomiast tutaj nie ważne czy ustawie w pętli for czy w przerwaniu to mi zaznacza wykrzyknikiem i wypisuje: "Unable to bind line (...) in file (...) to a program memory address"
REKLAMA