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

[Atmega8]Programuje się, ale nie pracuje.

aga69 04 Wrz 2010 21:31 6240 36
  • #1 8476107
    aga69
    Poziom 10  
    Ostatnio zainteresowałam się tematyką mikrokontrolerów, wykonałam programator na USB, zakupiłam płytkę stykową i zabrałam się za naukę.

    I tak na początek wzięłam ten schemat (stabilizator podpięłam tylko tak jak w nocie katalogowej jest):
    [Atmega8]Programuje się, ale nie pracuje.

    wraz z poniższym kodem:
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>				
    
    int main(void)
    {
    	DDRB  |= _BV(0)|_BV(1);
            PORTB |= _BV(0);
    	PORTB &= ~_BV(1);
    	DDRD  &= ~_BV(0);
    	PORTD |=  _BV(0);
    
    	unsigned char i,n;
    
    	while (1) 
    	{
    		PORTB ^=_BV(0);
    		PORTB ^=_BV(1);
    		
    		n = (PIND & _BV(0))? 100: 20; 
    
    		for (i = 0; i < n; i++)
    			         _delay_ms(10);
    	}
    	return 0;
    }
    

    Niestety nic się nie dzieje. Układ w ogóle nie reaguje. Potem podpięłam jedną diodę LED pod inny port z prostym programem:
    #include <avr/io.h>                // dostęp do rejestrów
    
    int main( void )                   // program główny
    {
      //sbi(DDRD,4); 
      DDRD|=_BV(PD4);  
      PORTD|=_BV(PD3);                 // użyj linii PD4 jako wyjścia
      //sbi(PORTD,3);                    // "podciągnij" do logicznej 1 linię PD3
    
      while(1)                               // pętla nieskończona
      {
        //cbi(PORTD,4);
    	PORTD&=~_BV(PD4);                        // zapal diodę LED podłączoną do  
                                             // linii PD4
        loop_until_bit_is_clear(PIND,3);     // czekaj na naciśnięcie przycisku 
                                             // na PD3 
        //sbi(PORTD,4); 
    	PORTD|=_BV(PD4);                      // zgaś diodę LED podłączoną do 
                                             // linii PD4
        loop_until_bit_is_clear(PIND,3);     // czekaj na naciśnięcie przycisku                    
                                             // na PD3 
      }
    }


    i również nie ma żadnej reakcji. Za każdym razem program jest wgrywany poprawnie. Napięcie 5V jest podawane na atmegę poprawnie. Zasilacz z jakiego korzystam to AC/DC 7,2V-250mA.

    Czy uszkodziłam tę atmegę? Niestety wszędzie w sklepach brak atmeg8 :(
  • Pomocny post
    #2 8476156
    rpal
    Poziom 27  
    Program nie będzie chodził tylko w jednym przypadku kiedy na stałe zwarty jest RESET do masy, programować się będzie ale nie wykonywać. Proponuję zmierzyć napięcie na tej linii.
  • #3 8476263
    aga69
    Poziom 10  
    Między resetem a gnd napięcie wynosi 4V.
  • Pomocny post
    #4 8476322
    rpal
    Poziom 27  
    To proponuje strawdzić na jaką wartość są ustawione fusebity odpowiedzialne za Brown-out. A zamiast jakiegoś migania diodami jako program głowny proponuję po prostu pin na którym jest podpięty led ustawić jako wyjście i po prostu zapalić diodę. Zakładam że led jest podpięty do plusa więc trzeba tam wpisać 0 i wprowadzić program w pętlę bez końca. Dioda się zapala znaczy że działa. Nie chce mi się wczytywac w notę ale Brown-out odpowiada za reset pod wpływem spadku napięcia więc te fuse bity definiują wartość napięcia przy którym następuje reset procka. Te napięcie na linii RESET trochę małe zwykle miewam więcej bo w okolicach 4,7-4-8.
  • Pomocny post
    #5 8476347
    McMonster
    Poziom 32  
    Kilka rzeczy na podstawie własnych błędów. Może nie wszystkie linie zasilania są doprowadzone do np. diod? W normalnych płytkach stykowych linie te trzeba ręcznie łączyć w połowie. Albo sama dioda włożona odwrotnie, lub gdzieś jakiś kabelek nie łączy?

    I jeszcze jedno, te ATmegi są teraz drogie i szkoda by było przez przypadek spalić, więc polecam porozglądać się za jakimś tańszym układem do zabawy, np. któryś 8-pinowy ATtiny, a z trochę większych ATtiny2313 (na alledrogo można tego tanio kupić), a z większych najtańsze widziałem ATmega48, wszystko w obudowie DIP oczywiście.
  • #6 8476556
    aga69
    Poziom 10  
    Ustawiłam piny jako wyjścia, podpinałam diody i nic. Miernik mam kiepski i na DC jest w zakresie 600V, więc spełnia rolę tylko podglądową. Ale na wejściu waha się między 4-5V, a na resecie pokazuje najczęściej 3-4V. W nocie katalogowej brown-out min wynosi 3,7V, poniżej tej wartości załącza reset. Jutro sprawdzę lepszym miernikiem.

    No właśnie, i jeżeli te napięcie jest tam takie niskie, to co jest przyczyną? W jaki sposób zepsułam?

    @McMonster
    Połączenia sprawdzałam miernikiem, a resztę własnych błędów wykluczyłam.
    BTW
    Jest szansa, że cena atmeg8 w końcu spadnie?

    Poza tym dzięki za zainteresowanie i konkretne odpowiedzi :)
  • Pomocny post
    #7 8476668
    McMonster
    Poziom 32  
    Kiepskiemu miernikowi nie można zbytnio wierzyć, a po wyeliminowaniu zupełnie wszystkich błędów w połączeniach zazwyczaj ich jeszcze ze dwa lub trzy zostaje, dlatego wynaleziono płytki stykowe, do szybkiego montowania układów od nowa. Piszę to z własnego doświadczenia, już kilka razy dopiero po zmontowaniu za którymś razem układu od nowa nagle zaczynał działać. :) Sama płytka stykowa podobno też może być winna, ale nigdy mi się nie udało stwierdzić, żeby to ona była kiedykolwiek powodem złego lub żadnego działania układu.

    Kiedyś te układy były tanie i przez kryzys podrożały, ale może w końcu stanieją, już się na elektrodzie kilka bardzo długich dyskusji o to przetoczyło.
  • #8 8476702
    gaskoin
    Poziom 38  
    McMonster napisał:
    Sama płytka stykowa podobno też może być winna, ale nigdy mi się nie udało stwierdzić, żeby to ona była kiedykolwiek powodem złego lub żadnego działania układu.


    Na mojej czasem zdarza się, że po wsadzeniu czegoś w otwór nie styka on z samą płytką. Np wsadzam diodę, tak, aby była połączona z nogą procesora, wizualnie wszystko ładnie pięknie, ale sprawdzając omomierzem, połączenia nie ma.
  • #9 8477190
    aga69
    Poziom 10  
    Jestem świadoma takich błędów, dlatego kilka razy połączenia i podłączenia sprawdziłam. Ustawiałam na piny stany niskie i wysokie z różnym podłączeniem diody LED(+,-).

    Czy zdarzają się tego typu uszkodzenia atmegi?
  • Pomocny post
    #10 8477289
    _Robak_
    Poziom 33  
    Cytat:

    Czy zdarzają się tego typu uszkodzenia atmegi?

    Biorąc pod uwagę info z tego forum, tak co druga atmega wychodzi z fabryki uszkodzona. Rzeczy z tymi procesorami dzieją się niesamowite a ludzie pracujący w Atmelu powinni zająć się czymś innym.

    Masz wyłączonego watchdoga fusami? Druga sprawa to przycisk masz na PD0 a sprawdzasz stan na PD3.
    Chcesz sprawdzić czy działa to nie kombinuj tylko wgraj program
    
    #include <inttypes.h>
    
    uint8_t i;
    
    void main (void)
    {
    DDRB=0xFF:
    while(1)
    {
    PORTB=0x00;
    for(i=0;i<100;i++) _delay_ms(10);
    PORTB=0xFF;
    for(i=0;i<100;i++) _delay_ms(10);
    }
    }
    
  • #11 8477458
    aga69
    Poziom 10  
    Podobne programiki wrzucałam.

    Teraz jeszcze raz żeby mieć 100% pewność:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <inttypes.h> 
    
    uint8_t i;
    
    int main(void)
    {
    DDRB=0xFF;
    while(1)
    {
    PORTB=0x00;
    for(i=0;i<100;i++) _delay_ms(10);
    PORTB=0xFF;
    for(i=0;i<100;i++) _delay_ms(10);
    }
    } 


    oraz moje połączenia na płytce:
    [Atmega8]Programuje się, ale nie pracuje. [Atmega8]Programuje się, ale nie pracuje.

    Fusebitów nie zmieniałam - ustawienia fabryczne.
    Powyższa kombinacja również nie działa. Nie zwalam oczywiście winy na ATMEL, ale zastanawiam się czy mogłam się dopuścić takiego uszkodzenia, że uC daje się programować, ale nie pracuje.
  • Pomocny post
    #12 8477522
    _Robak_
    Poziom 33  
    W takim razie powiem Ci czemu Ci nie działa;) Wszystkie linie są połączone na płytce. Wstawienie rezystora do diody tak jak teraz nie ma sensu bo cała linia 37 po lewej stronie procesora jest zwarta i tak samo po prawej;) Czy spaliłaś port, kto wie. Podłącz jak należy i sprawdź, pobaw się miernikiem żeby sprawdzić jak ta płytka jest skonstruowana.
  • #13 8477551
    aga69
    Poziom 10  
    Załączam odczyt fusebitów:
    [Atmega8]Programuje się, ale nie pracuje.
  • Pomocny post
    #14 8477555
    Samuraj
    Poziom 35  
    Odczytaj programatorem co jest w pamięci. Według mnie to wygląda tak że tylko wydaje Ci się że mikrokontroler się programuje a w rzeczywistości w pamięć dalej jest pusta.
    Tak więc zrób weryfikacji i zobacz czy to co wrzucasz do pamięci jest faktycznie tym co w niej się znajduje.
    Programator odczytuje prawidłowo sygnaturę mikrokontrolera :?:
  • Pomocny post
    #15 8477568
    gaskoin
    Poziom 38  
    Z tego co widzę to u Ciebie reset wisi w powietrzu! Na linii 37 tak jak mówił Robak - rezystor jest zwarty !! Zarówno po lewej jak i po prawej stronie.

    W związku z resetem wiszącym w powietrzu - układ się nie programuje
  • #16 8477623
    aga69
    Poziom 10  
    Aż mi głupio z tym rezystorem.

    Teraz dałam na PinC, których wcześniej nie używałam. Efekt taki sam.

    [Atmega8]Programuje się, ale nie pracuje. [Atmega8]Programuje się, ale nie pracuje.

    A zapis przedstawia się tak:
    > "make.exe" program
    avrdude -p atmega8 -P usb -c usbasp    -U flash:w:ledprosty.hex 
    
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.02s
    
    avrdude: Device signature = 0x1e9307
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: warning: cannot set sck period. please check for usbasp firmware update.
    avrdude: reading input file "ledprosty.hex"
    avrdude: input file ledprosty.hex auto detected as Intel Hex
    avrdude: writing flash (124 bytes):
    
    Writing | ################################################## | 100% 0.61s
    
    avrdude: 124 bytes of flash written
    avrdude: verifying flash memory against ledprosty.hex:
    avrdude: load data flash data from input file ledprosty.hex:
    avrdude: input file ledprosty.hex auto detected as Intel Hex
    avrdude: input file ledprosty.hex contains 124 bytes
    avrdude: reading on-chip flash data:
    
    Reading | ################################################## | 100% 0.55s
    
    avrdude: verifying ...
    avrdude: 124 bytes of flash verified
    
    avrdude done.  Thank you.
    
    
    > Process Exit Code: 0
    > Time Taken: 00:01
    
  • Pomocny post
    #17 8477658
    tymon_x
    Poziom 30  
    Z avrdude nie korzystam, ale z tego co widzę zapis do pamięci i jej weryfikacja się powiodła. Jak rozumiem chcesz coś zdziałać z tym zielonym LED'em. Sprawny jest po tym zwarciu? Dłuższa nóżka do tego rezystora, krótsza do masy? Najprostszy test to dać na przemian stany na portach (na stałe) i sprawdzić diodą LED/miernikiem czy jest oczekiwany rezultat.

    Do zmiany Fuse-Bits się przyda: Fuse-Bits
  • Pomocny post
    #18 8477668
    gaskoin
    Poziom 38  
    skoro nie grzebałaś w fusebitach to zwolniłaś programator zworką ? bo ma czasem problemy z programowaniem układów pracujących z zegarem <= 1Mhz na pełnej prędkości :)
  • #19 8477736
    aga69
    Poziom 10  
    Tak, programator w trybie "wolnego" programowania nastawiony zworką. LEDY sprawne (podłączyłam oba ledy pod 5V - świecą bez problemu) i dobrze podłączone - katodą do minusa. A miernik nie wykazuje żadnych napięć na tym pinie PC5.
  • Pomocny post
    #20 8477782
    gaskoin
    Poziom 38  
    a ja widzę, że rezystor jest na PC4, ale mogę się mylić bo słabo widać przy takim widoku :)
  • #21 8478528
    McMonster
    Poziom 32  
    Nie jestem pewien, czy to dotyczy tej płytki stykowej i czy to jest źródłem problemu (z takich samych korzystałem na studiach i wydaje mi się, że tak), ale w takich płytkach linie zasilania są w połowie długości dzielone, czyli po pięciu takich blokach 2x5, a widzę, że AVCC (a w poprzednich układach też diody) jest podłączone właśnie za tym podziałem.

    Na tym zdjęciu widać, jak są ręcznie łączone te linie na środku:

    [Atmega8]Programuje się, ale nie pracuje.
  • Pomocny post
    #23 8478991
    brummel
    Poziom 14  
    Miałem ostatnio podobny przypadek z Attiny2313. Procesor nowy ze sklepu jednak nie chciał wykonywać żadnego programu. Programowany USBaspem, weryfikacja poprawna, pamiętał zmiany fusebitów. Ruszył dopiero po dodaniu kwarcu (i oczywiście zmianie fusów), na wbudowanym generatorze niestety wisiał.

    Dużo roboty z dodaniem kwarcu nie ma, a może właśnie to go boli :D
  • Pomocny post
    #24 8479025
    upanie
    Poziom 22  
    Sprawdź wszystkie masy i zasilania. Miałem podobny problem na ATmega88.
    Program czasami chodził jak macałem ręką okolice procka i jego samego ;)
    Problemem okazał się brak zasilania na AVCC. Idiotyzm polega na tym, że czy
    go używasz czy nie napięcie na nim musi być.
  • Pomocny post
    #25 8479169
    mirekk36
    Poziom 42  
    upanie napisał:

    Program czasami chodził jak macałem ręką okolice procka i jego samego ;)
    Problemem okazał się brak zasilania na AVCC. Idiotyzm polega na tym, że czy
    go używasz czy nie napięcie na nim musi być.


    Jaki idiotyzm ??? niestety idiotyzmem jest nie podłączanie zasilania do AVCC szczególnie gdy wynika to z tego, że komuś nie chciało się doczytać w nocie PDF, że zasilanie podawane na AVCC jest również zasilaniem dla jednego z portów.

    Jeśli więc ktoś nie podłącza AVCC to potem niech sobie maca ;)

    ... a tu zdaje się, że autorka ma podłączone AVCC co widać na zdjęciach przecież.
  • #26 8479220
    gaskoin
    Poziom 38  
    µC wewnątrz ma połączenia między wszystkimi VCC jakie ma wyprowadzone na zewnątrz (mówię teraz ogólnie) jednak te połączenia służą TYLKO I WYŁĄCZNIE do tego, aby napięcie na wszystkich liniach było takie samo.

    Moderowany przez _Robak_:

    Proszę nie wypisywać takich bzdur.
    Nie kasuję aby wątek miał sens.

  • Pomocny post
    #27 8479388
    mirekk36
    Poziom 42  
    gaskoin napisał:
    µC wewnątrz ma połączenia między wszystkimi VCC jakie ma wyprowadzone na zewnątrz (mówię teraz ogólnie) jednak te połączenia służą TYLKO I WYŁĄCZNIE do tego, aby napięcie na wszystkich liniach było takie samo.


    Chyba pan kolega raczy teraz sobie żartować ? ;) .... ale to niedobrze bo niektórzy mogą uznać to za słuszne.

    Chyba pomyliło ci się z konkretnym przypadkiem procka ATmega8, który posiada błąd i tylko w nim jest wewnętrzne zwarcie VCC z AVCC - czego nie powinno być i w innych prockach nie ma. A to , że jest w mega8 to jak mówię tylko wypadek przy pracy ATMEL'a i zostało to udokumentowane.

    Zajrzy sobie kolega tak w ogóle do noty PDF, żeby dowiedzieć się do czego jest AVCC:

    Cytat:

    AVCC AVCC is the supply voltage pin for the A/D Converter, Port C (3..0), and ADC (7..6). It should be
    externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected
    to VCC through a low-pass filter. Note that Port C (5..4) use digital supply voltage, VCC.


    żeby więcej nie opowiadać takich herezji o złączonych wewnątrz VCC i AVCC we wszystkich prockach AVR ;)
  • #28 8479417
    aga69
    Poziom 10  
    brummel napisał:
    Ruszył dopiero po dodaniu kwarcu (i oczywiście zmianie fusów), na wbudowanym generatorze niestety wisiał.

    To interesująca propozycja, zwłaszcza że inne pomysły już mi się wyczerpały. Spróbuję dołączyć kwarc 4Mhz i oczywiście odpowiednio ustawić pod tym kątem mikroprocesor.

    Co do innych podpowiedzi to cała linia zasilania na tej płytce jest połączona. A "dojścia" zasilania i gnd sprawdziłam miernikiem - wszystko dochodzi.
  • Pomocny post
    #29 8479509
    mirekk36
    Poziom 42  
    aga69 napisał:
    brummel napisał:
    Ruszył dopiero po dodaniu kwarcu (i oczywiście zmianie fusów), na wbudowanym generatorze niestety wisiał.

    To interesująca propozycja, zwłaszcza że inne pomysły już mi się wyczerpały. Spróbuję dołączyć kwarc 4Mhz i oczywiście odpowiednio ustawić pod tym kątem mikroprocesor.
    .


    Jak mógł wisieć czy tam nie działać na wewnętrznym oscylatorze i ruszyć dopiero przy zewn. kwarcu? to raczej niedorzeczność. Jak można by było przeprogramować taki procek, gdyby wewn. oscylator w nim nie działał. Myślę, że to raczej do niczego cię nie doprowadzi niestety :(

    Dodano po 6 [minuty]:

    Proponuję ci , jesli już chcesz przetestować na najprostszym programie, skompilować to:

    #include <avr/io.h>      // dołączenie systemowych plików nagłówkowych
    #include <util/delay.h>
    
    int main( void )                   // główna funkcja programu
    { 
      
      DDRC |= (1<<PC4);     // pin PC4 jako wyjście
      PORTC &= ~(1<<PC4);  // wystaw 0 na pinie PC4
    
      while(1)                               // pętla nieskończona 
      { 
        
       PORTC ^= (1<<PC4);    // zmień stan diody LED podłączonej do  PortC.4
                                             
       _delay_ms(1000);     // odczekaj sekundę
    
      } 
    }


    Potem weź miernik w rękę i zobacz czy na samym pinie PC4 zmienia się co sekundę stan z 0 na 1 i tak w kółko..... (ponieważ odbywa się to co sekundę to miernik spokojnie to wychwyci). Musi się zmieniać jeśli w tym samym czasie zmierzysz napięcie pomiędzy pinami VCC oraz GND a także AVCC i AGND. Bo być może jednak coś jest nie tak z tymi połączeniami pomiędzy nogą procka a diodą LED. Natomiast na samym pinie stan MUSI się zmieniać i już. Bez żadnych tam bajek o nie działającym wewnętrznym oscylatorze jeżeli daje się normalnie zaprogramować.
  • #30 8479710
    aga69
    Poziom 10  
    Niestety nic się nie zmienia na samym pinie, a na nóżkach VCC GND napięcie wynosi 4,23V
REKLAMA