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

przerwania na ATmega32,dziwne zachowanie się nóżek PC2 i PC3

pgp 27 Mar 2006 00:20 3455 18
REKLAMA
  • #1 2461579
    pgp
    Poziom 19  
    Posty: 412
    Pomógł: 6
    Ocena: 17
    Atmega 32, program obsługujący klawiaturę - 4 przyciski, odczytywane co 20 ms ( co któreś przerwanie timera 1), przyciski podpięte pod PC), PC0,PC1,PC2,PC3.

    jeżeli w programie wykorzystuję PC0 i PC1 to jest ok , ale jeśli w pętli obsługi przerwania odczytującego klawiaturę sprawdzam stan przycisków PC2 i PC3 to zgłoszenia przerwania są w każdym odczycie klawiatury...., chociaż napięcia na tych nóżkach jest 4,81. Luty posprawdzane , napięcia też. Czyżby chodziło o rezystory podciągające ?

    Oto funkcja main: (freagment):
    
     PORTC=0x0f;   //
     DDRC=0x00;// PC0-PC3 wejscie z podciąganiem; 
    //PC4-PC7 - nie ruszane - wysoka imp.
    TIMSK=1<<TOIE0;    //zezw na przerwania od Timera0
    sei();
    
    while(1)
    {
    	  	   if(x!=0x00)
      	   {
      	
     		piszilcd(0x01);     //czyść LCD
     		czekaj(1.64*tau);   //wymagane dla instrukcji czyszczenia ekranu opóźnienie
    		
    		
    		switch(x)
    			{
    		    case 0x01: 	pisztekst(tekst1);
    		    					break;
    		    case 0x02: 	pisztekst(tekst2);
    		    					break;
    		    case 0x03: 	pisztekst(tekst3);
    		    					break;
    		    case 0x04: 	pisztekst(tekst4);
    		    					break;											
    			}
    			x=0x00;
           }
    }
    
    
    
     funkcja obsługującej przerwanie :
    
    SIGNAL (SIG_OVERFLOW0)
    {
    
      TCNT0=tau0; //licznik timera0
      if(--liczt0==0) //czy czytac klawiature ?
      {
          x=0x00;
      		if(bit_is_clear(PINC,PC0))
      		{
      		x=0x01;
      		}
      		else{
      		     	if(bit_is_clear(PINC,PC1))
      				{
      				x=0x02;
      				}
      				else
      					{
      					if(bit_is_clear(PINC,PC2))
      					{
      					x=0x03;
      					}
      					else
      						{
      							if(bit_is_clear(PINC,PC3))
      							{
      							x=0x04;
      							}
      						}
      				} 
      		     }
    
      		liczt0=klaw;	
    	}
    }
    
    


    ________________________

    Jak widzicie w zależności które wykryto naciśnięcie klawisza to odpowiednia wartość zostaje wpisana do zmiennej x.

    Najdziwniejsze jest ze symulacja tego programy w VMLAb działa doskonale...

    Dodano po 19 [minuty]:

    Czyżby problem wynikał z tego że PC2 i PC3 są używane do JTAG-a ?
  • REKLAMA
  • #2 2461739
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    Ja się kiedyś też męczyłem z klawiszami PC2...PC5 i okazało się w fuse bitach właśnie miałem włączonego JTAGa. Zobacz jak masz u siebie. Być może to właśnie to.
  • REKLAMA
  • #3 2462018
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Potwierdzam opinie maly35 Sam też straciłem kilka godzin, jak po wymianie procka było to samo i skasowałem fuza od JTAG-a.
  • REKLAMA
  • #4 2462407
    pgp
    Poziom 19  
    Posty: 412
    Pomógł: 6
    Ocena: 17
    dodałem w main taką linijkę :

    sbi(MCUCSR,7);

    która rzekomo odpowiada za wyłaczenie JTAG-a ,
    jest to ustawienie na 1 bitu JTD (7 my bit w rejestrze MCUCSR)
    ale to nic nie dało.
  • #5 2462442
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    Ten bit nalezy ustawić dwukrotnie w ciągu 4 cykli (to takie zabezpieczenie przed przypadkowym wyłaczeniem jtaga) :
    Cytat:
    The application software must write this bit to the desired value twice within four
    cycles to change its value.
  • #6 2462454
    sepher
    Poziom 19  
    Posty: 301
    Pomógł: 21
    Ocena: 4
    Poprzednikom chodziło o fusebit JTAGEN. Jest on nadrzędny wobec bitu w rejestrze MCUCSR. Dokumentacja, strona 218:

    "When the JTAGEN fuse is unprogrammed, these four TAP pins are normal port pins
    and the TAP controller is in reset. When programmed and the JTD bit in MCUCSR is
    cleared, the TAP input signals are internally pulled high and the JTAG is enabled for
    Boundary-scan and programming."
  • #7 2462489
    pgp
    Poziom 19  
    Posty: 412
    Pomógł: 6
    Ocena: 17
    Ok, rozumiem.Ale jak dodam do main linijkę:

    sbi(JTAGEN,6);

    wyrzuca błąd:

    error : 'JTAGEN' undeclared(first use in this function).

    Moze pozostanę przy tym dwókrotnym wyzerowaniu bitu JTD ?? Ale jak to napisać ? Po prostu dwa razy to samo :

    sbi(MCUCSR,7);
    sbi(MCUCSR,7);

    ??

    Dodano po 35 [minuty]:

    Wpisanie :

    sbi(MCUCSR,7);
    sbi(MCUCSR,7);

    nic nie daje..., trzeba jakoś ten JTAGEN fuse wyłączyć, ale nie wiem jakim poleceniem to zrobić... Jest to 6 bit w rejestrze Fuse High Byte niby , jak sie do niego dostać ? polecenie:

    sbi(Fuse High Byte,6)

    nie chce sie skompilować...
  • #8 2462616
    sepher
    Poziom 19  
    Posty: 301
    Pomógł: 21
    Ocena: 4
    JTAGEN to FUSEBIT, a nie bt w rejestrze :). Przestawia się go za pomocą programatora, nie z poziomu programu w uC. Podobnie ustawia się na przykład źródło sygnału zegarowego. Jeśli napiszesz jakiego oprogramowania używasz do wygrywania firmware'u do procka, ktoś pewnie odpisze jak rzeczone bity za pomocą tego oprogramowania przestawić.
  • Pomocny post
    #9 2462638
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    fuse bity wyłączasz nie w programie tylko przy programowaniu. np w PonyProg klikasz "Command > Security i Configurations bits..." Potem wciśnij "Read" i zobaczysz jak masz ustawione te bity. Jeżeli tym się jeszcze nie bawiłeś to radzę nic nie ruszać poza wspomnianym bitem JTAGEN, który będzie zaznaczony ptaszkiem (trzeba go odznaczyć) i wcisnąć "Write". Wtedy zapisze ci nowe ustawienie bitów do procka.

    Powinno zadziałać:)
  • #10 2463117
    pgp
    Poziom 19  
    Posty: 412
    Pomógł: 6
    Ocena: 17
    No - Pony Prog zadziałał - wyłączyłem JTAGEN i jest ok... Wszystko chodzi tak jak powinno... Dzięki za pomoc. Temat zamknięto.
  • REKLAMA
  • #11 7759189
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    Witam!

    Mam ten sam problem, PC2-PC5 w Atmedze16 nie działają mi jako zwykłe piny typu I/O. Używam programatora USBasp, a programy, których już próbowałem to były: PonyProg, Bascom-AVR, AVRdude - tylko, że one nie "znają", czegoś takiego jak USBasp lub port USB. Programy wgrywam za pomocą WinAVR (mFile i programmers notepad). Mógłby mi ktoś poradzić co mam zrobić żeby JTAGEN zmienić??

    Pozdrawiam!
  • #12 7760495
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Philut napisał:
    PonyProg, Bascom-AVR, AVRdude - tylko, że one nie "znają", czegoś takiego jak USBasp lub port USB.
    Nie opowiadaj bajek. AVRdude jest wprost stworzony do USBasp. Także Bascom 1.11.9.8 już go obsługuje. W AVRdude przestawiasz HFuse z 99 na D9
  • #13 7762109
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    landy13 napisał:
    Philut napisał:
    PonyProg, Bascom-AVR, AVRdude - tylko, że one nie "znają", czegoś takiego jak USBasp lub port USB.
    Nie opowiadaj bajek. AVRdude jest wprost stworzony do USBasp. Także Bascom 1.11.9.8 już go obsługuje. W AVRdude przestawiasz HFuse z 99 na D9


    Zainstalowałem nowszą wersje AVRdude i faktycznie jest teraz opcja wybrania USBasp, ale nie ma opcji wybierania portu USB, więc dopisałem go ręcznie i nie wiem czy tak jest prawidłowo. Proszę mi powiedzieć czy mam wszystko dobrze ustawione i zaznaczone:
    przerwania na ATmega32,dziwne zachowanie się nóżek PC2 i PC3

    Zwróćcie proszę uwagę na komunikat o błędzie, co to oznacza?
  • #14 7762908
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Po co wpisujesz do eeproma to samo co do flascha? Odznacz ptaszka przy Reset.
  • #15 7763286
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    landy13 napisał:
    Po co wpisujesz do eeproma to samo co do flascha? Odznacz ptaszka przy Reset.


    Linijka z eeprom jest teraz pusta, ptaszek odznaczony. Komunikat:

    avrdude.exe: verifying ...
    avrdude.exe: verification error, first mismatch at byte 0x0000
    0x0c != 0xff
    avrdude.exe: verification error; content mismatch

    avrdude.exe done. Thanks

    czyli cały czas ten sam błąd... już nie mam pomysłów...
  • #16 7763424
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Nie rób wszystkiego naraz. Wgrywałeś programy przez WinAVR i było dobrze, więc niech tak tymczasem zostanie. Temat dotyczy wyłączenia JTAGa i na tym się skoncentruj. Odznacz zapis i weryfikację flascha i eeproma, zrób odczyt fusebitów. Gdy HFuse=99 a LFuse=E1 to wiesz że komunikacja działa a ustawienia są fabryczne. Wtedy zrób zapis HFuse=D9.
  • #17 7766689
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    Tak też zrobiłem, wszystkie kombinacje wypróbowałem, ale PC2-PC5 nadal nie działają jako porty I/O.
    Aha, komunikatu o błędzie już nie ma, więc można uznać, że jestem jakiś krok do przodu... :D
  • #18 7767524
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    Próbowałem dalej: Jak mam Hfuse ustawiony na 0xD9 i zaznaczony write, to wyświetla mi taki komunikat:

    reading input file "D9"
    error opening D9 auto detected as invalid format
    can't open input file D9: No such file or directory
    write to file 'D9' failed

    Ale gdy mam odznaczony write nie ma tego problemu.
  • #19 7787192
    Philut
    Poziom 11  
    Posty: 60
    Ocena: 92
    Problem rozwiązany:
    przy linijce Command line, całkiem na końcu ręcznie trzeba było coś zmienić.
    To:
    -U hfuse:w: D9 -e
    na to:
    -U hfuse:w:0xD9:m

    i działa!
    Landy13, Tobie też dziękuje za pomoc!
    Pozdrawiam!

Podsumowanie tematu

✨ Problem dotyczył nieprawidłowego działania pinów PC2 i PC3 mikrokontrolera Atmega32 podczas obsługi klawiatury w przerwaniach timera. Piny te nie reagowały poprawnie, mimo prawidłowych napięć i sprawdzonego lutowania. Przyczyną okazało się włączenie funkcji JTAG, która blokuje dostęp do tych linii jako zwykłych portów I/O. Wyłączenie JTAG wymaga zmiany bitu fuse JTAGEN, co nie jest możliwe z poziomu programu, lecz należy to zrobić za pomocą programatora i odpowiedniego oprogramowania do zapisu fusebitów, np. PonyProg lub AVRdude. W przypadku AVRdude konieczne było poprawne ustawienie komendy zapisu fusebitów (np. -U hfuse:w:0xD9:m) oraz użycie programatora USBasp. Po wyłączeniu JTAG piny PC2-PC5 zaczęły działać poprawnie jako wejścia/wyjścia. Dodatkowo zwrócono uwagę na konieczność dwukrotnego ustawienia bitu JTD w rejestrze MCUCSR, jednak to nie zastępuje zmiany fusebitu JTAGEN.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA