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

[ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?

V3nom 12 Paź 2008 14:13 2341 4
REKLAMA
  • #1 5624034
    V3nom
    Poziom 11  
    Witam.
    Mam problem z połączeniem się z ATmegą 2561. Wcześniej wszystko chodziło dobrze do czasu aż wgrałem poprzez avr studio program do obsługi USART0. Użyłem do tego programatora USBisp z wgranym STK500v2. Nie ustawiałem żadnych Fusebitów (domyślne AVR Studio). Teraz nie mogę się połączyć z nim w żaden sposób. Próbowałem również przez ISPProg i STK200. W żaden sposób nie mogę uzyskać sygnatury M2561.
    [ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?
    Programatory są na pewno sprawne. Wcześniej wgrywane programy do obsługi LCD, diod LED i klawiszy działały bez problemu. Zmieniałem prędkości ISP Frequency ale zawsze jest to samo.

    Ostatni kod jaki wgrałem wyglądał mnie więcej tak:
    #include <avr/io.h>                // dostęp do rejestrów
    #include <avr/lcd.c>
    
    #define sbi(port,bit) (port)&=~_BV(bit)
    #define cbi(port,bit) (port)|=_BV(bit)
    
    // Zmieniając poniższe definicje można dostosować program do potrzeb
    
    #define F_CPU                16000000ul         // częstotliwość zegara w Hz
    #define UART_BAUD        4800ul                // prędkość transmisji bit/s
    
    #define LED_PORT        PORTA                // port diody LED
    #define LED_BIT                0                // bit diody LED
    
    #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
    #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
    
    #define LED_PORT_O        LED_PORT             // rejestr wyjściowy
    #define LED_PORT_D        DDR(LED_PORT)   // rejestr kierunkowy
    #define LED_PORT_I        PIN(LED_PORT)   // rejestr wejściowy
    
    #define UART_CONST        (F_CPU/(16ul*UART_BAUD)-1)
    
    // _UCR_
    
    #ifdef        UCR
    #define _UCR_        UCR
    #endif
    
    #ifdef        UCSRB
    #define _UCR_        UCSRB
    #endif
    
    #ifdef        UCSR0B
    #define _UCR_        UCSR0B
    #endif
    
    // _USR_
    
    #ifdef        USR
    #define _USR_        USR
    #endif
    
    #ifdef        UCSRA
    #define _USR_        UCSRA
    #endif
    
    #ifdef        UCSR0A
    #define _USR_        UCSR0A
    #endif
    
    // Definicje funkcji
    
    // inicjalizacja portu szeregowego
    void UART_init(void) 
    {
      UBRR0H = (unsigned char) (UART_CONST>>8); 	
      UBRR0L = (unsigned char)UART_CONST;         // ustaw prędkość transmisji 
      UCSR0B = _BV(RXEN0)|_BV(TXEN0);                // załącz tx, rx
    }
    
    // wysyła znak podany jako parametr na port szeregowy
    void UART_putchar (char c)
    {
      UDR0 = c;                                // wpisz c do rejestru UDR
      //loop_until_bit_is_set(_USR_,TXC0);        // czekaj na zakończenie transmisji
      sbi(UCSR0A,TXC0);                                // ustaw bit TXC w rej. USR
    }
    
    // odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
    char UART_getchar (void)
    {
      loop_until_bit_is_set(_USR_,RXC0);        // czekaj na zakończenie odbioru
      cbi(UCSR0A,RXC0);                                // skasuj bit RXC w rej. USR
      return UDR0;                                // zwróć zawartość rejestru UDR
    }
    
    int main(void)                        // program główny
    {
      UART_init();                        // inicjalizacja portu szeregowego
    
      //sbi(LED_PORT_D,LED_BIT);        // użyj linii jako wyjścia
      DDRA=0xff;
      lcd_init(LCD_DISP_ON_CURSOR);
      lcd_puts("cos");
    
      for(;;)                        // pętla nieskończona
      {
        //cbi(LED_PORT_O,LED_BIT);        // zapal diodę LED
    	cbi(PORTA,PA0);
        UART_putchar('1');                // wyślij '1' na port szeregowy
        UART_getchar();                // czekaj na znak z portu szeregowego
        //sbi(LED_PORT_O,LED_BIT);        // zgaś diodę LED
    	sbi(PORTA,PA0);
        UART_putchar('0');                // wyślij '0' na port szeregowy
        UART_getchar();                // czekaj na znak z portu szeregowego
      }
    }
    


    Jeśli to ma znaczenie to podczas programowania moduł RS232 był podłączony do portów.
    Czy mogłem w jakiś sposób wgrywając program do obsługi usart0 przestawić pracę mikrokontrolera tak że teraz nie ma dostępu do linii programowania? Jak wiadomo ta atmega używa linii PDI PDO na tych samych liniach co RXD0 i TXD0. Czy jest jakiś sposób aby ją zresetować? Posiadam też klona JTAG ICE ale nie ruszę tego procesora bo go nie obsługuje.
    Proszę o radę.
    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • #3 5626112
    V3nom
    Poziom 11  
    Przez JTAG ICE wykrywa prawidłową sygnaturę ale po kasowaniu pamięci flash dalej nie mogę programować po ISP.
    [ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?[ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?
    Próbowałem kasować poprzez JTAG ICE jak również przez avrdude ale nic to nie dało.

    Fusebity odczytane przez JTAGICE:
    [ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?

    Płyta uruchomieniowa na której pracuje atmega 2561 jest wyposażona w 16MHz rezonator. Czy odczytanym fusebitom można wierzyć?
    Jak je ustawić aby to ruszyło? Pytam bo nie chce zepsuć bardziej niż jest teraz. Odczytuje sygnaturę przez JTAG więc chyba nie jest źle.
    Co dalej robić ?
  • REKLAMA
  • Pomocny post
    #4 5626400
    Balu
    Poziom 38  
    Masz kwarc <1MHz?:>
    I jeszcze CKDIV8?:P

    Mhm...To nie będzie działać z ISP:) który miałeś na 56K ustawiony :)
    Zmień fusy na trochę na wew. oscylator i wywal ckdiva;)
    Ł.
  • #5 5626754
    V3nom
    Poziom 11  
    Idąc za twoją radą starałem się przestawić fusebity na wewnętrzny oscylator. Było trochę problemów z AVR Studio i nakładką Burn-O-Mat na avr-dude ale z czystej linii poleceń zadziałało.

    Wyniki poniżej:
    [ATmega2561][AVR Studio] Nie wykrywa sygnatury przez usart0?

    Dziękuję za rady które pomogły mi przywrócić płytkę do działania.
    Ale mam jeszcze pytanie czy AVR Studio mogło samo tak przestawić fusebity na podstawie napisanego przeze mnie programu? Sam nie zmieniałem ich nigdy w AVR Studio jedynie w ISPprog gdzie dokładnie wcześniej wiedziałem co chce ustawić w każdym z programowanych przeze mnie procesorów.
    Pozdrawiam
REKLAMA