Jak wyłączyć JTAG w ATmega328

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 5 kwie 2022, 18:37

Witam

Borykam się z problemem kupionej ATmegi328 która ma włączony JTAG. Wiem że wyłącza się to za pomocą fuesbitów ale kompletnie sobie nie umiem z tm poradzić. Muszę wyłączyć JTAG w Atmedze ponieważ blokuje on piny i nie mozna ich wykorzystać do projektu. Po wyłączeniu tej funkcji atmega ma aktywne wszystkie piny.
Obecnie spróbowałem dwów patentów:
====>PATENT1 Za pomocą USBasp - przy tej próbie nie mogłem wyłączyć JTAG ponieważ programy wywalają błąd firmware i każą zaaktualizować firmware w USBasp. I tu pojawia się kolejny problem bo kompletnie nie wiem jak to zrobić. Korzystałem z różnych programów lecz bez skutku. Jesli ktoś wie jak to zrobić korzystając z ArduinoUNO lub jakoś przez edycję programu ArduinoIDE to chętnie bym sie nauczyl.

====>PATENT2 Za pomocą programowego wyłaczenia w ArduinoIDE. Przy tej próbie wklejam w program dwie linijki które jak piszą w internecie bez problemu wyłączają JTAG. Wygląda to następująco:

Kod: Zaznacz cały

"Zmienne i stałe"
MCUCSR|= (1<<JTD); // Linijka odpowadająca za wyłaczenie JTAG przez program
MCUCSR|= (1<<JTD); // Linijka odpowadająca za wyłaczenie JTAG przez program
void setup(){
"Część programu"}
void loop(){
"Część programu"}
Po wpisaniu tych dwóch linijek powinno wszystko wykonać się bez problemu leczu mnie wywala błąd...
OLED_Ar2:15:1: error: 'MCUCSR' does not name a type; did you mean 'MCUCR'?
MCUCSR|= (1<<JTD);
^~~~~~
MCUCR
OLED_Ar2:16:1: error: 'MCUCSR' does not name a type; did you mean 'MCUCR'?
MCUCSR|= (1<<JTD);
^~~~~~
MCUCR
Jak zaleca program, usuwam literkę "S" i pojawia się to:
OLED_Ar2:15:1: error: expected unqualified-id before 'volatile'
MCUCR|= (1<<JTD);
^
OLED_Ar2:15:1: error: expected ')' before 'volatile'
OLED_Ar2:15:1: error: expected ')' before 'volatile'
OLED_Ar2:16:1: error: expected unqualified-id before 'volatile'
MCUCR|= (1<<JTD);
^
OLED_Ar2:16:1: error: expected ')' before 'volatile'
OLED_Ar2:16:1: error: expected ')' before 'volatile'
Czy ktoś ma sposób na ten problem? Pozdrawiam :)

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 6 kwie 2022, 10:05

Popatrzyłem w google i ATmega328 nie posiada w ogóle tego JTAG. Nie posiada też tych rejestrów MCUCSR i MCUCR. Skąd wziąłeś to, że ta atmega ma niby włączony JTAG?
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 6 kwie 2022, 20:47

Mam dziwne stany na pinach 2,3,4,5. Trochę poczytałem w interncie i niektórzy mieli ten sam problem. Na tych pinach niezależnie od zdefiniowania w programie czy to ma być wejscie czy wyjście, czy stan wysoki czy niski, występuje napiecie od 1,3 do 1,7V. W arduino trochę siedzę wiec jestem pewny że program mam napisany ok. Widziałem jak niektórzy przestawiali fuesbity wyłączając funkcje programowania przez JTAG i piny te zaczęły działać normalnie jako I/O.
stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 6 kwie 2022, 23:50

A to na pewno atmega328? :)
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 7 kwie 2022, 21:27

Sorki ale aż taki głupi to nie jestem... Po prostu jest taki problem, i tak to wygląda. Coś blokuje te porty.
stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 8 kwie 2022, 11:09

A w pinMode(), digitalWrite(), digitalRead() wpisujesz po prostu numery pinów, czyli na przykład pinMode(2, OUTPUT), ewentualnie zmienną z przypisaną wartością 2, czy oznaczenia w stylu PD2?
Bootloader wgrywałeś? Pomimo tego, że może używasz USBasp do wgrywania programów i ten bootloader jest wtedy niepotrzebny (a potem i tak zostaje skasowany przy wgraniu programu) to po zakupie "świeżej" atmegi (jeśli nie ma ona już wgranego bootloadera), to trzeba albo wgrać bootloader (przy okazji ustawiane są rejestry), albo w inny sposób ustawić odpowiednio rejestry atmegi. Bez tego atmega nie będzie działać prawidłowo.
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 9 kwie 2022, 17:45

Na początku programu definiuje piny za pomocą #define, w void setup mam ustawione pinMode tak jak powinno.Zanim utworzyłem temat próbowałem bezpośrednio przypisywac numery pinów ale to nie pomagało. To są rzeczy które bym na pewno nie pomylił bo arduino znam bardzo dobrze a taka sytuacja z nową kupioną atmegą mi sie przytrafiła pierwszy raz. Na innych pinach jest wszystko w porządku. Program nie koliduje tych pinów jesli chodzi o przypisanie funkcji ktorych oczekuje od tych pinów. Botloader wgrywałem używając bibliotek MiniCore dla arduino IDE. Myślę czy nie sprobować wgrać inny bootloader używając starszej wersji ArduinoIDE np 1.0.6 gdzie można w notatniku ustawiać fuesbity. Dokładnie z tego co wiem to trzeba coś pozmieniać w lowfuses i highfuses lecz boję się że uceglę atmegę.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1274
Rejestracja: 18 lis 2011, 02:18

Re: Jak wyłączyć JTAG w ATmega328

Post autor: Marhef » 10 kwie 2022, 13:36

Może w programie masz coś dodane, co wpływa na pracę tych pinów. Jak stworzysz nowy projekt i ustawisz te piny jako wyjścia, to jest to samo?
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 10 kwie 2022, 19:24

Tak, jest to samo. Filtrowania itp wszystkie podstawy dotyczące podłączenia atmego do zasilania są zachowane.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1274
Rejestracja: 18 lis 2011, 02:18

Re: Jak wyłączyć JTAG w ATmega328

Post autor: Marhef » 10 kwie 2022, 19:29

Atmegę masz 328? Bez dodatkowych liter?
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 10 kwie 2022, 19:56

Atmeg328P-U
stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 10 kwie 2022, 23:11

W arduino ide ustawiłeś jako atmega328 czy atmega328p? One są niby identyczne, ale jednak to są 2 różne mikrokontrolery. Nie wiem czy w ogóle da się wgrać bootloader i program przy odwrotnym ustawieniu, ale jeśli tak i mają jakieś różnice w rejestrach, to stąd może być problem.
Nie masz atmegi328, masz atmegę328p, ona również nie ma JTAG.
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 14 kwie 2022, 17:31

Problem nadal jest niestety...
Awatar użytkownika
Marhef
Złota rączka
Posty: 1274
Rejestracja: 18 lis 2011, 02:18

Re: Jak wyłączyć JTAG w ATmega328

Post autor: Marhef » 16 kwie 2022, 23:58

No to od początku:
1) schemat układu (albo przynajmniej wyraźne zdjęcie)
2) kod programu. Tego, który nie działa. BTW, takie napięcia na niepodciągniętym WEJŚCIU są normalne
3) opis arduinoide, którego używasz. Wersja, poinstalowane dodatki, tak, żeby można było powielić Twoją sytuację
4) skąd masz atmegę? Może to nie atmega, tylko chińska podróbka. Zgodna w 85% z oryginałem
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 17 kwie 2022, 09:31

1) Schematu nie podam niestety ale wszystkie zasady podłączenia atmegi są zachowane. Chodzi tu o kwarc 16MHz, kondensatory oraz zasilenie odpowiednich nóżek.
2) Kod programu najprostszy do testów:

Kod: Zaznacz cały

#define Procent1 2
#define Procent2 3
#define Procent3 4
#define Procent4 5
#define Procent5 6

void setup() {

  pinMode(Procent1, INPUT);
  pinMode(Procent2, INPUT);
  pinMode(Procent3, INPUT);
  pinMode(Procent4, INPUT);
  pinMode(Procent5, INPUT);
}
void loop(){} 
Jest to najprostszy kod który uzywam do testu czy do/od atmegi wychodzi odpowiednie napięcie na poszczególnych pinach. Teoretycznie jesli jest wpisny INPUT to na wyjściu powinno być 0-0,1V a u mnie cały czas jest ok 1,3-1,8V.

3) ArduinoIDE Ver.1.8.19
Dodatki:
*Menedżer płytek MiniCore
*Biblioteki GFX do OLED (nie sprawiają one problemu)
4) Atmega zakupiona na allegro w 2 sztukach, na obu sztukach jest ten sam problem.

Mam pewny pomysł na to jeszcze ale muszę mieć chwilę czasu żeby do tego zasiąść...

Co do podciągnięcia wejścia, to na każdym wejsciu do atmegi korzystając z INPUT-a muszę dołączyć rezystor np 10kOhm do GND tak? Czy jest możliwość podciągnięcia w taki sam sposób jak wpisanie programowe INPUT_PULLUP bez kombinacji na płytce wytrawionej?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1274
Rejestracja: 18 lis 2011, 02:18

Re: Jak wyłączyć JTAG w ATmega328

Post autor: Marhef » 17 kwie 2022, 09:59

LorEnzoo pisze:
17 kwie 2022, 09:31
Chodzi tu o kwarc 16MHz, kondensatory oraz zasilenie odpowiednich nóżek.
I jeszcze podciągnięcie resetu na przykład. Najlepiej poczytaj sobie na tej stronie i podłącz tak jak tam.
LorEnzoo pisze:
17 kwie 2022, 09:31
Teoretycznie jesli jest wpisny INPUT to na wyjściu powinno być 0-0,1V a u mnie cały czas jest ok 1,3-1,8V.
A praktycznie wejście "wisi w powietrzu", więc możesz na nim zmierzyć od 0V do napięcia zasilania.
LorEnzoo pisze:
17 kwie 2022, 09:31
Co do podciągnięcia wejścia, to na każdym wejsciu do atmegi korzystając z INPUT-a muszę dołączyć rezystor np 10kOhm do GND tak?
To zależy. Od tego, co chcesz podłączyć. Jeśli przycisk, to najlepiej rezystor do Vcc a przycisk pomiędzy wejście i GND.
LorEnzoo pisze:
17 kwie 2022, 09:31
Czy jest możliwość podciągnięcia w taki sam sposób jak wpisanie programowe INPUT_PULLUP bez kombinacji na płytce wytrawionej?
Na pewno w arduino jest opcja do podciągnięcia do zasilania (właśnie INPUT_PULLUP). Sprawdź, jakie napięcie wtedy zmierzysz.
Możliwe, że można podciągnąć do GND stosując poniższe instrukcje:

Kod: Zaznacz cały

pinMode(pin,INPUT);
digitalWrite(pin,LOW);
Ale nie jestem pewien, czy to zadziała.
stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 17 kwie 2022, 22:13

Wcześniej pisałem o tych możliwych różnicach w ustawieniach rejestrów, ale z tego co można znaleźć w internecie, to obie atmegi mają taką samą architekturę, atmega328p ma mniejszy pobór prądu i dodatkowy timer. Jednak ustawienia fusebitów mają takie same.

W przypadku, kiedy pin jest ustawiony jako wejście i nic się do niego nie podłączy podającego jakiś stan logiczny (odpowiednie napięcie), ani nie zrobi podciągnięcia, to taki pin sobie może "pływać" i tam może być cokolwiek, więc to 1,3-1,8V nie jest niczym niezwykłym. Tyle że @LorEnzoo pisał wcześniej, że przy ustawieniu pinu jako wyjście i ustawieniu stanu niskiego lub wysokiego, też zawsze jest napięcie w tym przedziale, a to już nie jest normalne.
LorEnzoo
Młodszy majsterkowicz
Posty: 40
Rejestracja: 6 mar 2015, 20:22

Re: Jak wyłączyć JTAG w ATmega328

Post autor: LorEnzoo » 18 kwie 2022, 20:18

Dokładnie, steruję wyświetlaczem OLED na którym pokazuje się postęp pracy urządzenia. Chodzi o to że jeśli na pinach 2,3,4,5,6 po kolei wskoczy stan WYSOKI lub NISKI to na wyświetlaczu przestawi się pasek ładowania. Teraz mam trochę zagwozdkę co może byc nie tak. Sygnał z głownego kontrolera ardunio nano jest wysyłany poprzez stany wysokie/niskie do ATmegi. Główny kontroler arduino nano nie sieje żadnych zakoceń bo sprawdziłem to wczesniej. Wszystko jest zasilane przez stabilizator lm7805. Podłączone jest w nastepujący sposób 12V=>LM7805=>ArduinoNANO (pinVIN)=>ATmega328p(Piny vcc i gnd dla czesci cyfrowej i analogowej). Cały program jest sterowany jak najprościej czyli przez wejścia do ATmegi, jest na wejsciu dane napięcie = wykonuje sie instrukcja.
Co zauważyłem dziwnego.
*Program działa tak samo czy zmienie w programach że steroanie odbywa sie stanem wysokim czy niskim, napiecie sie nie zmienia na atmedze.
*Całość inaczej sie zachowuje gdy nie dotykam płytki a inaczej się zachowuje gdy dotknę płytki nawet w część ktora jest odizolowana (laminat)
Program na arduino nano wykonuje się perfekcyjnie a na atmedze róznie, zależy czy dotknę płytki czy nie. Myśle że coś może być nie tak z filtrowaniem, lecz dokładałem dodatkowe kondensatory 100uf miedzy vcc a gnd, przy kontrolerze konensatory i oscylator podłączyłem maksymalnie blisko mikrokontrolera aby uniknąć jakieś indukcji na ścieżkach.
stiven
Złota rączka
Posty: 1667
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Jak wyłączyć JTAG w ATmega328

Post autor: stiven » 18 kwie 2022, 22:16

Opowiedz więcej o zasilaniu. Arduino i atmegę328p, oba zasilasz ze stabilizatora lm7805? Jeśli tak, to 5V ze stabilizatora podłączasz do Vin arduino? To nie jest prawidłowe, ale już nie raz czytałem, że i tak arduino wtedy działa (to może mieć teoretycznie negatywny wpływ na komunikację z inną atmegą). No ale prawidłowo 5V podaje się na właśnie pin 5V na płytce arduino.
Kondensatory filtrujące. To zawsze powinna być para kondensatorów, elektrolityczny plus ceramiczny. Przy arduino elektrolityczny 22uF i ceramiczny 100nF (osobna para dla części analogowej i cyfrowej). Jeśli chodzi o stabilizator lm7805, to są różnie podawane wartości, ale też najlepiej żeby poza elektrolitycznym był też ceramiczny 100nF i na wejściu i na wyjściu.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1274
Rejestracja: 18 lis 2011, 02:18

Re: Jak wyłączyć JTAG w ATmega328

Post autor: Marhef » 19 kwie 2022, 17:26

LorEnzoo pisze:
18 kwie 2022, 20:18
*Program działa tak samo czy zmienie w programach że steroanie odbywa sie stanem wysokim czy niskim, napiecie sie nie zmienia na atmedze.
Jeśli nie zmienia się napięcie, to może arduino nie wystawia stanu wysokiego?
LorEnzoo pisze:
18 kwie 2022, 20:18
*Całość inaczej sie zachowuje gdy nie dotykam płytki a inaczej się zachowuje gdy dotknę płytki nawet w część ktora jest odizolowana (laminat)
Sprawdź lutowanie. Zrób zdjęcia (jeśli to nie jest tajne), tylko żeby dokładnie było widać, jak masz połączone.
LorEnzoo pisze:
18 kwie 2022, 20:18
Program na arduino nano wykonuje się perfekcyjnie a na atmedze róznie, zależy czy dotknę płytki czy nie.
Ale jeżeli napięcie na atmedze się nie zmienia, to gdzie "znika"? Może jednak arduino? :-P
LorEnzoo pisze:
18 kwie 2022, 20:18
Myśle że coś może być nie tak z filtrowaniem, lecz dokładałem dodatkowe kondensatory 100uf miedzy vcc a gnd, przy kontrolerze konensatory i oscylator podłączyłem maksymalnie blisko mikrokontrolera aby uniknąć jakieś indukcji na ścieżkach.
JAKIE KONDENSATORY?! 100nF to standard, nie 100uF (literówka?)

Ogólnie ja zawsze daję jeden elektrolit na wyjściu stabilizatora i 100nF przy każdej linii zasilania mikrokontrolera. I w większości przypadków to wystarcza.
Bardzo blisko nie musisz dawać oscylatora, ile tam masz, 20 MHz? To nie będzie miało dużego wpływu.

Zrób test. Podłącz do jednego z pinów atmegi tylko diodę LED z rezystorem. I napisz program, który będzie tą diodą migał co sekundę. I napisz, co się stało
ODPOWIEDZ

Strony partnerskie: