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

JTAG ICE i AVRStudio-problem z debuggerem

Krzysiek^21 26 Cze 2008 17:28 1850 5
  • #1 5287831
    Krzysiek^21
    Poziom 13  
    Witam!
    Mam następujący problem: podłączyłem ATmege128 pod JTAG ICE. W AVRStudio jak włącze debuggowanie i przykładowo opcje AutoStep to pojawia się wspomniany problem ponieważ gdy kompilator natrafi na pętle for (przykład: for (i=0;i<1000;i++);) to program zatrzymuje się w tym miejscu (wyswietlane jest cały czas Running). Nie wiem co zrobić aby debugger przeszedł do następnych instrukcji.

    Pozdrawiam!
  • #2 5288411
    propa
    Poziom 13  
    Witam.
    Najprawdopodobniej masz ustawione w opcjach kompilatora polecenie "-Os", jeśli zmienisz na "-O0" to będziesz mógł debugować cały kod, ale niestety stracisz na pamięci.

    Pozdrawiam.
  • #3 5289120
    Krzysiek^21
    Poziom 13  
    Witam!
    Dziękuje za podpowiedź ale dalej problem nierozwiazany:|. Częsciowo udało mi się wyjść z sytuacji zaznaczając opcje Unsigned chars(-funsigned-char) która pozwolila na działanie pętli ze zmiennymi typu char.
    Mam jeszce jedno pytanie podobne do poprzedniego. Gdy debugger "wejdzie" do funkcji (podprogramu) to nie chce spowrotem powrócić do programu głównego :D zatrzymując się na końcu. Prosty przykład umieszczam poniżej:

    #include <avr/io.h>
     
     void test(void)
     {
     PORTC=0x34;   //// tu sie zatrzymuje
     }
     
     int main()
     {
     DDRC=0xFF;
     DDRA=0xFF;
     DDRB=0xFF;
     test();
     PORTC=0xFF;
     PORTB=0xff;
     }
  • #4 5404684
    stoowa
    Poziom 14  
    mam podobny problem.. moze ktos pomoc ?
  • #6 5404752
    stoowa
    Poziom 14  
    
    
    #include <inttypes.h>
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <avr/iom32.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #include "HD44780.h"
    
    
    //definicje zmiennych
    
    
    
    volatile int ms, s, m, h, znacznik;
    
    char buf[256];
    
    int aa, bb, cc;
    
    
    int main(void)
    {
    
    //ustawienia portów
    
    PORTA=0x00;
    DDRA=0xFF;
    
    PORTB=0xff;
    DDRB=0xFF;
    
    PORTC=0x00;
    DDRC=0x00;
    
    PORTD=0x00;
    DDRD=0x10;
    PORTD=0x00;
    
    
    
    
    
    
    // Timer/Counter 0 initialization
    
    TCCR0=0x02;   //2            4=preskaler 256
    TCNT0=0x00;
    OCR0=0x00;
    
    
    
    // Timer/Counter 1 initialization
    TCCR1A=0x00;
    TCCR1B=0x02;	// 02 = podzial przez 8
    TCNT1H=0x00;
    TCNT1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    ASSR=0x00;
    TCCR2=0x2C;  //podzial na 32
    TCNT2=0x00;		//9c
    OCR2=0x7C;
    
    // External Interrupt(s) initialization
    GICR|=0x40;
    MCUCR=0x03;  //3 zbocze narastajace INT0 generuje przerwani
    MCUCSR=0x00;
    GIFR=0x40;
    
    h=56;
    sprintf(buf,"czas-> %d:%02d:%02d ",h,m,s);
    
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    LCD_Initalize();
    LCD_GoTo(0,1);
    LCD_WriteText(buf);
    // LCD_init();
     //LCD_xy (0,0);
    
    GIMSK |=_BV(6);//odblokowanie przerwania INT0
    GICR |=_BV(6);
    TIMSK=0xC5;
    sei();
    
    
    
    while(1){
    
    
    
    if(znacznik>0){
    //LCD_xy(0,1);
    sprintf(buf,"czas-> %d:%02d:%02d ",h,m,s);
    //LCD_putstr(buf);
    znacznik=0;
    }
    
    
    
     }//koniec while(1)
    
    }//end main
    
    
    


    robie run... dochodzi do linii za //!!!!! z funkcja LCD_Initalize(); i tam sobie stoi...

    
    void LCD_Initalize(void)
    {
    unsigned char i;
    LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
    LCD_DB5_DIR |= LCD_DB5; //
    LCD_DB6_DIR |= LCD_DB6; //
    LCD_DB7_DIR |= LCD_DB7; //
    LCD_E_DIR 	|= LCD_E;   //
    LCD_RS_DIR 	|= LCD_RS;  //
    LCD_RW_DIR 	|= LCD_RW;  //
    _delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
    LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
    LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E
    LCD_RW_PORT &= ~LCD_RW;
    for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
      {
      LCD_E_PORT |= LCD_E; //  E = 1
      _LCD_OutNibble(0x03); // tryb 8-bitowy
      LCD_E_PORT &= ~LCD_E; // E = 0
      _delay_ms(5); // czekaj 5ms
      }
    
    LCD_E_PORT |= LCD_E; // E = 1
    _LCD_OutNibble(0x02); // tryb 4-bitowy
    LCD_E_PORT &= ~LCD_E; // E = 0
    
    _delay_ms(1); // czekaj 1ms 
    LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
    LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
    LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
    LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
    }
    
    

    ps.
    jest w ogole w debuggerze mozliwosc recznego zmieniania wartosci zmiennych ? ( podejrzec wartosc mozna...)[code]

    Dodano po 2 [godziny] 59 [minuty]:

    no to sobie sam odpowiem... zatrzymywalo sie bo jest zmienna zmieniana sprzetowo przez LCD.. nie ma odpowiedzi z LCD to zmienna sie nie zmienila.. . :)
    i tak da sie zmieniac wartowsci zmiennych w watchu :)
REKLAMA