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

[WinAVR] Dziwne resety i zwisy po przejsciu z ATmegi8 na 16

leonow32 31 Sty 2011 21:14 1077 4
REKLAMA
  • #1 9084463
    leonow32
    Poziom 30  
    Robię mini komputerek :) idea działania jest prosta:
    - człowiek wpisuje polecenie w terminalu i wciska enter
    - program rozpoznaje wpisany tekst i wywołuje odpowiednią funkcję
    coś na kształt starego dobrego DOSa

    Cały kod programu jest długi i znajduje się na tej stronie
    http://leon-instruments.blogspot.com/2009/01/test.html

    Problem pojawił się, kiedy przeszedłem z ATmegi8 na 16, bowiem funkcja ps2_type czasami działa, a czasami wariuje z niewiadomego powodu. Funkcja ma odczytywać znaki wpisane z klawiatury PS/2 podłączonej pod piny B1 i B2 (podciągnięte do zasilania przez 4,7k). Wszystko działa, aż tu nagle na terminalu pojawiają się jakieś bzdury i program skacze do przerwania BADISR, po czym żąda wpisania liczby i się resetuje, bez podania kodu resetu w MCUCSR (=0).

    Czasami zdarza się też, że program pokazuje na ekranie jakiś znaczek krzaczek, inny niż znak alfanumeryczny. Z kodu ps2_read wynika, że ta funkcja zwraca wyłącznie znaku alfanumeryczne, enter, escape albo 0 jeżeli człowiek wciśnie klawisz nieposiadający odpowiednika ASCII. Skąd więc biorą się znaczki-krzaczki?

    Od czasu porzucenia ATmegi8 nic nie grzebałem w funkcjach od PS2, a działały poprawnie. Funkcja ps2_hex (odczytuje scankody i wyświetla na terminau) działa całkowicie poprawnie. Podczas prób zmieniłem kwarc 16MHz na wewnętrzny oscylator RC 8MHz i problem z ps2_type całkowicie zniknął. Ale ze wszystkimi moimi kwarcami 16MHz ciągle jest ten problem i tylko w tej jednej funkcji. Dziwne zachowanie występuje mniej więcej raz na 30 znaków.

    W ps2_read jest dość długi switch(), który przerabia scankody z klawiatury na ASCII, ale nawet po zmniejszeniu go do kilku liter problem ciągle jest.

    I o co tu chodzi? :)

    EDIT:
    Zauważyłem, że program na ATmegę16 zajmuje 7072 bajty, a dokładnie to samo na ATmege8 zajmuje 6452 bajty. Czemu?
  • REKLAMA
  • #2 9086347
    leonow32
    Poziom 30  
    Wrzuciłem ten sam program na ATmegę32 i drugą ATmegę16 - wszystko działa. Wygląda na to, że ta pierwsza 16 z którą wczoraj się męczyłem jest uszkodzona... a procesory są prosto ze sklepu :evil:

    Czyżby to jakieś uszkodzenie pamięci? Jest jakiś sposób by to przetestować?
  • REKLAMA
  • #3 9087904
    LordBlick
    VIP Zasłużony dla elektroda
    leonow32 napisał:

    Zauważyłem, że program na ATmegę16 zajmuje 7072 bajty, a dokładnie to samo na ATmege8 zajmuje 6452 bajty. Czemu?
    Rozkazy długich skoków "asm(jmp)" zajmują dwa słowa rozkazowe w porównaniu do jednego skoku krótkiego "asm(rjmp)"
    Co do "wariowania" to pokaż fusebity jednej i drugiej ATmegi, to pomyślimy..
  • REKLAMA
  • #4 9098831
    leonow32
    Poziom 30  
    Fusebity w jednej i drugiej są identyczne
    [WinAVR] Dziwne resety i zwisy po przejsciu z ATmegi8 na 16
    hfuse = 81
    lfuse = FF
    zegar ustawiony na external crystal 8-16MHz, slowly rising power, zmiana kwarcu na inny o tej samej częstotliwości nic nie zmienia.
    JTAG włączony, mimo że nie używam.
  • #5 9101986
    LordBlick
    VIP Zasłużony dla elektroda
    Skoro nie używasz, to wyłącz JTAG, w kodzie i tak można go włączyć. W momencie, gdy jest włączony, na odpowiednich pinach będziesz miał sieczkę...
REKLAMA