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

ATmega88 nie chce wykonać kodu

mtrps 03 Lip 2010 11:24 1931 18
REKLAMA
  • #1 8256639
    mtrps
    Poziom 10  
    Witam!
    Niedawno zainteresowałem się programowaniem mikrokontrolerów i kupiłem sobie układ ATmega88-20PU. Zamontowałem go na płytce i podłączyłem programator USBasp. Korzystając z AVRstudio i AVRdude'a wgrałem do pamięci flash prosty programik, którego celem było zapalenie diody podłączonej do PB0 i PB1:
    .nolist
    .include "m88def.inc"
    .list
    
    .cseg
    .org 0
    
    sbi DDRB, 0
    sbi DDRB, 1
    
    sbi PORTB, 0
    cbi PORTB, 1
    
    petla:
    rjmp petla


    Użyłem polecenia -p m88 -c usbasp -U flash:w:"p2.hex":i

    Niestety, po wgraniu kodu nic się nie stało (dioda nie zaczęła świecić). Zacząłem się zastanawiać co może być tego przyczyną. Na początek sprawdziłem wszystkie połączenia i generalnie sprawdziłem, czy nie występuje jakiś problem opisany w temacie https://www.elektroda.pl/rtvforum/topic998383.html.
    Na koniec poleceniem avrdude -p m88 -P usb -c usbasp -t
    a następnie r flash 0 0xff odczytałem pamięć flash i wygląda na to, że jest tam taki sam zapis jak w podglądzie pliku p2.hex, który był tam wgrywany. Z tego chyba wynika, że kod jest zapisany w pamięci układu poprawnie. Tak czy owak układ nie działa i nie bardzo wiem dlaczego.
    Zasilanie podpinałem najpierw przez programator, później ze źródła zewnętrznego i ciągle nic. Na PB0 i PB1 nie ma żadnego napięcia, co sprawdziłem miernikiem (zresztą poza VCC, GND, AVCC i RESET na wszystkich portach jest 0). Na resecie jest stan wysoki, co też sprawdziłem miernikiem. Nie zmieniałem fuse bitów.
    Podejrzewam, że robię jakiś prosty błąd - jak to początkujący. Jeśli ktoś ma jakiś pomysł co z tym zrobić, to będę bardzo wdzięczny za wszelkie wskazówki.
  • REKLAMA
  • #2 8257151
    krdln
    Poziom 13  
    Kod jest chyba ok, ale nie znam się za bardzo na asmie, po dostosowaniu do mojego układu działa.

    Pokaż lepiej dokładnie schemat jak podłączyłeś diodę, może tu jest błąd?

    A poza tym, jeśli jesteś początkujący to zacznij może od c, chyba, że bardzo lubisz asma :)
  • #3 8257235
    mtrps
    Poziom 10  
    Dioda jest podłączona w porządku, bo jak przyłożę do PB0 VCC i do PB1 GND to świeci. Problem jest taki, że po zaprogramowaniu i podłączeniu zasilania do układu na żadnym wyjściu nie ma stanu wysokiego. Próbowałem też z innym programem, żeby dać stan wysoki na innych wyjściach układu (PB0..5), ale po zbadaniu miernikiem wynika, że ciągle jest tam 0. Tak jakby układ nie zaczynał w ogóle pracy.

    Ten program napisałem w asemblerze, bo chciałem sprawdzić czy układ w ogóle ruszy, więc wolałem mieć wszystkie instrukcje pod kontrolą ;). Potem może faktycznie przejdę na C.

    Dodano po 40 [minuty]:

    Może jeszcze podam ustawienia fuse bitów, odczytane przez AVRdude'a:
    UNUSED_E7 true unused
    UNUSED_E6 true unused
    UNUSED_E5 true unused
    UNUSED_E4 true unused
    UNUSED_E3 true unused
    BOOTSZ1 true Select boot size
    BOOTSZ0 true Select boot size
    BOOTRST false Select reset vector
    RSTDISBL false Select if PC6 is I/O pin or RESET pin
    DWEN false debugWIRE enable
    SPIEN true Enable Serial Program and Data Downloading
    WDTON false Watchdog timer always on
    EESAVE false EEPROM memory is preserved through the Chip Erase
    BODLEVEL2 false Brown out detector trigger level
    BODLEVEL1 false Brown out detector trigger level
    BODLEVEL0 false Brown out detector trigger level
    CKDIV8 true Devide clock by 8
    CKOUT false Clock output
    SUT1 false Select start-up time
    SUT0 true Select start-up time
    CKSEL3 true Select Clock source
    CKSEL2 true Select Clock source
    CKSEL1 false Select Clock source
    CKSEL0 true Select Clock source
  • #4 8257333
    Dexter77
    Poziom 28  
    Moze namieszales cos z fusebitami?
  • #5 8257395
    krdln
    Poziom 13  
    Fusy masz domyślne, więc powinno śmigać ładnie.

    Zobacz, czy zadziała na tym wsadzie (zapisz to do jakiegoś .hexa)
    :1000000019C033C032C031C030C02FC02EC02DC087
    :100010002CC02BC02AC029C028C027C026C025C09C
    :1000200024C023C022C021C020C01FC01EC01DC0CC
    :100030001CC01BC011241FBECFEFD4E0DEBFCDBF5C
    :1000400011E0A0E0B1E0ECE7F0E002C005900D9215
    :10005000A030B107D9F711E0A0E0B1E001C01D92D6
    :10006000A030B107E1F702D007C0CACF83E084B95E
    :0C00700081E085B90000FECFF894FFCFBE
    :00000001FF
    To program robiący to samo, tylko, że napisany w c.
    Mało prawdopodobne, ale może wina jest w atmedze?
  • REKLAMA
  • #6 8257408
    MacGyver 7
    Poziom 21  
    mtrps napisał:
    (zresztą poza VCC, GND, AVCC i RESET na wszystkich portach jest 0).

    Jak to poza GND jest zero? :D
    Może trafiłeś jakiś bubel, wypróbuj inną sztukę. Chodź z tego co pisałeś to po prostu musi ruszyć.

    ps, Ja przesiadłem się z C na assembler i nie żałuje.
  • #7 8257651
    mtrps
    Poziom 10  
    Cytat:
    Jak to poza GND jest zero?

    Faktycznie, trochę przesadziłem ;)

    Cytat:
    Zobacz, czy zadziała na tym wsadzie (zapisz to do jakiegoś .hexa)


    Wciąż nic.


    Jeszcze może dopytam dla pewności, żeby się nie okazało, że robię jakiś niemożliwie prosty błąd:
    Po zaprogramowaniu za pomocą usbasp atmegi układ powinien od razu zacząć wykonywać kod (biorąc pod uwagę, że zasilanie jest podciągnięte od programatora, czyli z portu usb)? W każdym razie, jeśli odłączę programator, to po podłączeniu zewnętrznego zasilania atmega powinna od razu wykonywać to co trzeba, czy tak?
    [/quote]
  • #8 8257781
    danrok
    Poziom 14  
    Tak, po podłączeniu zasilania atmega powinna od razu wykonywać kod.
    Spróbuj ustawić jedynkę na innym porcie (tam gdzie nie ma diody) i sprawdzić, czy
    faktycznie tam jest.
  • #9 8257782
    janbernat
    Poziom 38  
    No to opowiedz własnymi słowami:
    sbi DDRB, 0- ustawiamy port B jako wejście- oB 00000000
    sbi DDRB, 1- ustawiamy port B.0 jako wyjście- oB0000001
    sbi PORTB, 0 - ustawiamy stan niski na PORTB.0
    cbi PORTB, 1 - kasujemy stan wysoki na PORTB.1- czyli wpisujemy stan niski.
    Czyli wszędzie stan niski- 0.
    Ponieważ nie jestem dobry w asm to opowiedz co chcesz zrobić- najpierw Sobie a potem takiemu głupiemu jak ja.
  • #10 8257798
    mtrps
    Poziom 10  
    Cytat:
    Spróbuj ustawić jedynkę na innym porcie (tam gdzie nie ma diody) i sprawdzić, czy
    faktycznie tam jest.


    No właśnie próbowałem ustawiać jedynkę na wszystkich liniach portu B i nigdy się nie pojawiła.

    Cytat:
    sbi DDRB, 0- ustawiamy port B jako wejście- oB 00000000
    sbi DDRB, 1- ustawiamy port B.0 jako wyjście- oB0000001
    sbi PORTB, 0 - ustawiamy stan niski na PORTB.0
    cbi PORTB, 1 - kasujemy stan wysoki na PORTB.1- czyli wpisujemy stan niski.
    Czyli wszędzie stan niski- 0.


    No nie wiem, ale jak dla mnie to wygląda ten kod następująco:
    sbi DDRB, 0 - linia 0 portu B ustawiona jako WYJściowa (bo jeśli sbi pozycję rejestru DDR, to znaczy, że ustawiam jako wyjście)
    sbi DDRB, 1 - to samo, tylko linia 1 portu B
    sbi PORTB, 0 - linia 0 portu B ustawiona ( a więc jedynka)
    cbi PORTB, 1 - linia 1 portu B zgaszona (czyli zero)

    stąd mamy PB0=1 i PB1=0[/quote]
  • REKLAMA
  • #11 8258102
    krdln
    Poziom 13  
    Możesz jeszcze sprawdzić czy masz masę do obu GND podłączonych i zasilanie do obu VCC. Nic innego mi nie przychodzi do głowy.

    A sprawdzałeś, czy inne porty działają?
  • #12 8259050
    mtrps
    Poziom 10  
    Cytat:
    Możesz jeszcze sprawdzić czy masz masę do obu GND podłączonych i zasilanie do obu VCC.


    To już sprawdzałem i jest w porządku - do obu VCC, czyli masz na myśli AVCC?
    Zastanawiam się jakie musi być napięcie na resecie. U mnie jest jakoś 0.8V przy podłączeniu do USB. Na AVCC jest 4.9V.

    Inne porty też sprawdzałem i nie chcą działać. Być może faktycznie wina leży po stronie atmegi :(
  • #13 8259129
    landy13
    Poziom 31  
    Cytat:
    ... jakie musi być napięcie na resecie. U mnie jest jakoś 0.8V
    I tu jest pies pogrzebany. Procesor w stanie resetu działać nie będzie. Podciągnij reset rezystorem do VCC i jeśli nadal będzie tak niskie napięcie to znaczy, że coś Ci go ściąga do zera. Programator lub zwarcie na płytce.
  • #14 8259158
    mtrps
    Poziom 10  
    Cytat:
    Podciągnij reset rezystorem do VCC i jeśli nadal będzie tak niskie napięcie to znaczy, że coś Ci go ściąga do zera.


    Tak właściwie to ja go mam podciągniętego do VCC przez rezystor 10k. Zastanawiałem się trochę nad tym napięciem, więc podłączyłem rezystor 32k, napięcie było 2V i wciąż nic. Nie wiem za bardzo jakie jest maksymalne dopuszczalne napięcie tutaj, ale nie chcę z drugiej strony podciągać go bez żadnego zabezpieczenia do 5V, żeby nie było zwarcia podczas podłączanie programatora.

    Dodano po 10 [minuty]:

    Oho, chyba schemat, wg którego łączyłem miał błąd - opornik z resetu jest podłączony do GND zamiast VCC.
  • REKLAMA
  • #15 8259211
    landy13
    Poziom 31  
    Przy rezystorze 10k było 0.8V a przy 32k 2V? To jakoś wbrew naturze.

    Rezystor daje się przeważnie 4.7k lub 10k ale w szczególnych przypadkach można dać znacznie mniej. Jednak lepiej poszukać przyczyny, a nie tylko likwidować skutki.


    EDIT: Spóźniłem się.
  • #16 8259231
    mtrps
    Poziom 10  
    DZIAŁA!!!!!!!! :D:D:D:D:D:D

    Dodano po 1 [minuty]:

    Wielkie dzięki wszystkim za pomoc! Teraz już powinno pójść z górki ;)

    Cytat:
    Przy rezystorze 10k było 0.8V a przy 32k 2V? To jakoś wbrew naturze.


    Też się bardzo zdziwiłem, ale skoro tak, no to trudno. Dopiero dzisiaj przyglądam się płytce, no i jak byk ten rezystor idzie do masy .... Całe szczęście, że już wszystko jest ok :D
  • #17 8259465
    MacGyver 7
    Poziom 21  
    Tego rezystora w ogóle być nie musi, gdyż nóżka RESET jest wewnętrznie połączona z VCC rezystorem o wartości od 20 do 100 kΩ, choć ze względu na możliwe zakłócenia można zastosować również zewnętrzny rezystor oraz kondensator 4,7nF pomiędzy RESET a GND.

    Powodzenia w kolejnych walkach :D
  • #18 8262574
    Dexter77
    Poziom 28  
    Teoretycznie byc nie musi, jednak praktyka pokazuje ze pozostawiony RESET w powietrzu potrafi sporo namieszac. Warto podciagnac go do VCC rezystorem rzedu 10k i kondensatorem do masy rzedu 1nF.
  • #19 9478678
    mtrps
    Poziom 10  
    Rozwiązanie problemu:
    podciągnąć RESET do VCC :)
REKLAMA