Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

27 Mar 2006 00:40 3290 18
  • Poziom 19  
    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):
    Code:

     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 ?
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 13  
    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.
  • Poziom 32  
    Potwierdzam opinie maly35 Sam też straciłem kilka godzin, jak po wymianie procka było to samo i skasowałem fuza od JTAG-a.
  • Poziom 19  
    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.
  • Poziom 28  
    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.
  • Poziom 19  
    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."
  • Poziom 19  
    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ć...
  • Poziom 19  
    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
    Poziom 13  
    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ć:)
  • Poziom 19  
    No - Pony Prog zadziałał - wyłączyłem JTAGEN i jest ok... Wszystko chodzi tak jak powinno... Dzięki za pomoc. Temat zamknięto.
  • Poziom 11  
    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!
  • Poziom 29  
    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
  • Poziom 11  
    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?
  • Poziom 29  
    Po co wpisujesz do eeproma to samo co do flascha? Odznacz ptaszka przy Reset.
  • Poziom 11  
    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...
  • Poziom 29  
    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.
  • Poziom 11  
    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
  • Poziom 11  
    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.
  • Poziom 11  
    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!