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

AT89S8252 - brak reakcji na przycisk, dioda LED zawsze włączona

snajper555 03 Maj 2005 19:23 1752 10
REKLAMA
  • #1 1458415
    snajper555
    Poziom 11  
    Posty: 51
    mam problem z uruchomieniem ukladu z wykorzystaniem at89s8252. procek zostal
    zaprogramowany (listingi ponizej), ale nie chce dzialac.
    najpierw chcialem odpalic prosciutki programik z przepisywaniem stanow, tzn
    nacisniecie przycisku podlaczonego do portu p1.0 powinno zapalac diode led
    wiszaca na bicie p0.0 scalaka.

    napisalem krociutenki programik:

    ORG 100h
    MOV P0, #0H ;profilaktycznie wustawilem wszystkie porty na stan niski
    MOV p1, #0H
    MOV p2, #0H
    MOV p3, #0H

    ET: JB P1.0, WLA
    JMP ET

    WLA: SETB P0.0
    RET

    END.

    i nie reaguje na nacisniecie przycisku - dioda jest caly czas wlaczona.
    oczywiscie po wlaczeniu wykjonywalem reset. pozniej, zeby wogule w
    jakikolwiek sposob przekonac sie o slusznosci zaprogramowanego procka,
    odpialem wszystko od portu p0.0 i p1.0 i napisalem kolejny programik:

    ORG 100h
    et: MOV P0, #0H
    MOV p1, #0H
    MOV p2, #0H
    MOV p3, #0H
    jmp et
    end

    zeby sprawdzic, czy wszedzie beda zera. mierze woltomierzem napiecia na
    poszczegolnych pinach i okazuje sie, ze na niektorych jest 0, na niektorych
    jakies 3,5v, na niektorych 5v. ale w wiekszosci po 0v.
    jednak po podpieciu tranzystora z dioda (jak na rysunku) zaczynaja sie dziac
    cuda - niektore piny przechodza w stan wysoki inne pozostaja zerami.
    podobnie sie dzieje jak napisze programik, ktory wymusza na pinach stan
    wysoki - niby jest stan wysoki, ale gdzieniegdzie jest stan niski.
    procek jest dobrze zaprogramowany, bo po wylaczeniu zasilania mozna z niego
    odczytac to, co zostalo zaprogramowane. generator na kwarcu chyba pracuje
    dobrze, bo na nozkach xtal1 oraz xtal2 jest po ok. 2,5v.
    co robie nie tak? czy problem tkwi w schemacie polaczen, w programie, czy
    moze jeszcze w czyms innym?

    z gory dzieki za sugestie
    Załączniki:
    • AT89S8252 - brak reakcji na przycisk, dioda LED zawsze włączona 89s8252-schemat ukladu.GIF (17.42 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 1458480
    lukaszp07
    Poziom 11  
    Posty: 8
    Każdy procesor po resecie rozpoczyna pobierać rozkazy od odresu 0, a Twój program zaczyna się od 100h. Usunięcie dyrektywy ORG 110h powinno załatwić problem. Cuda na pinach spowodowane są tym, że procesor pobiera przypadkowe dane od adresu 0 i interpretuje je jako rozkazy.
  • REKLAMA
  • #3 1458617
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    Inna kwestia. Na porcie P0 nie ma pull'upow. Wiec uklad nie zadziala wedlug tego programu i schematu co podales. Dodaj rezystor 10k od pinu P0 do plusa. Klawisz tez zle podlaczony. W ten sposob mozesz uszkodzic port. Klawisz od pinu do masy. Ustawiasz pin w stan wysoki(wlaczasz pull'up) i nacisniecie klawisza wykrywasz na podstawie stanu niskiego.
    No i jak napisal poprzednik dodaj
    .ORG 0000h
    jmp START

    .ORG 100h
    START:
    Tu Twoj kod

    Pozdro
    Dexter
  • REKLAMA
  • #4 1458980
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    ET: JB P1.0, WLA
    JMP ET

    WLA: SETB P0.0
    RET
    ----------------------------------
    Rozkaz RET jest zle zastosowany, jest to powrót z podprogramu a Ty do WLA skaczesz przez rozkaz skoku a nie acall lub lcall.
  • #5 1459052
    jaglarz
    Poziom 23  
    Posty: 480
    Pomógł: 58
    Ocena: 47
    No i jeszcze bym spytał czy masz coś podłączone do nóżki 9, czy zapomniałeś narysować?




    www.jaglarz.com
    Marek Jaglarz
  • #6 1459172
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    jaglarz napisał:
    No i jeszcze bym spytał czy masz coś podłączone do nóżki 9, czy zapomniałeś narysować?
    www.
    Marek Jaglarz

    a co z nóżką EA??
  • #7 1459260
    snajper555
    Poziom 11  
    Posty: 51
    dziekuje za cenne uwagi. niestety to co potrafilem zrobic nie przynioslo skutku.
    przede wszystkim "ucieklem" z portu p0.0 na p2.1 by ustrzec sie rezystorow podciagajacych (tak na marginesie: jakiej wartosci powinien byc taki rezostor?). poza tym program wyglada teraz nastepujaco:
    $MOD51
    ORG 0000H
    JMP SKO

    ORG 100H
    SKO: MOV P0,#0H
    MOV P1,#0H
    MOV P2,#0H
    MOV P3,#0H
    ET: JB P3.0, WLA
    JMP ET
    WLA: SETB P2.1
    JMP ET
    END

    na razie nie wykonalem tego, co zalecil dexter, tzn sprawdzanie stanu niskiego na przycisku (bo w takim ukladzie powinno chyba zadzialac? tylko o to mi chodzi:))co do nozek EA, RST i innych, to sa podlaczone tak jak na narysowanym przeze mnie schemacie, tzn... nie sa podlaczon(wisza w powietrzu). nie korzystam z pamieci zewnetrznej. jezeli robie jakis blad przez pozostawienie w powietrzu wiekszosci pinow, to prosze o skorygowanie mojego toku myslenia i wyjasnienie, dlaczego jest zle.

    aha, jest jeszcze pewnien problem polegajacy na tym, ze po wlaczeniu zasilania na kwarcu czesto pojawia sie 5v na jednej nozce kwarca, na drugiej zero. zakladam, ze wtedy procek nie ma prawa dzialac. trrzeba kilka (nascie) razy wylaczyc zasilanie, poresetowac itd zanim zrobi sie podzial 2,5v / 2,5v (tak chyba powinno byc?). czasami trwa to chwile, czasami nawet z godzine... jak mozna sobie z tymporadzic i czy powinienem sie przejmowac tym, ze czasami na jednej z nozek pojawia sie 5v?

    pozdrawiam
    michal
  • #8 1459533
    Dexter77
    Poziom 28  
    Posty: 889
    Pomógł: 134
    Ocena: 19
    Poczytaj dokumentacje. RST musi byc podlaczony. Podobnie EA. Z przyciskiem nic nie wskorasz. Wymuszasz stan niski wewnetrznym tranzystorem. Rezystor nie potrafi wtedy wymusic stanu wysokiego. Jak nie wierzysz podlacz miernik do pinu. Jesli program bedzie dzialal pojawi sie tam stan niski. Naciskanie przycisku nic nie zmieni. Zmieni tylko tyle ze przez rezystor i nozke poplynie prad ale napiecie (stan wysoki) sie nie pojawi. Widze ze znasz jakies podstawy dzialania tranzystora wiec mozesz sobie sam wytlumaczyc dlaczego tak bedzie.
    Pozdro
    Dexter
  • REKLAMA
  • #9 1459621
    snajper555
    Poziom 11  
    Posty: 51
    ok, ale jak z tym ea i rst? do masy zewrzec?
    bo tak zrobilem, podlaczylem przycisk z portu przez rezystor do masy i zmodyfikowalem program:
    $MOD51
    ORG 0000H
    JMP SKO

    ORG 100H
    SKO: MOV P0,#111111111B
    MOV P1,#111111111B
    MOV P2,#111111111B
    MOV P3,#111111111B
    ET: JNB P3.0, WLA
    JMP ET
    WLA: CLR P2.1
    JMP ET
    END
    jednak nadal bez skutku...
  • #10 1460383
    PePe996
    Poziom 15  
    Posty: 89
    Pomógł: 12
    Witam

    Ea ma byc podlaczone do ucc (wtedy procek pobiera program z wew. pamieci flash), a rst ma byc podlaczone przez kondesator 10uF do ucc (jesli elektrolityczny, to minusem od strony rst), a opornikiem 10k do masy.

    Pozdrawiam

    P.S. Ladujesz wszedzie po dziewiec jedynek do 8-bitowych rejestrow (co z reszta chyba nie jest konieczne, bo po resecie porty ustawiaja sie w stan wysoki).
  • #11 1462582
    snajper555
    Poziom 11  
    Posty: 51
    DZIEKUJE!!! uklad zadzialal:) musze powiedziec, ze wlasciwie kazdy z was mial racje, tyle tam bylo niedociagniec / niedopracowan. zeby mozna bylo przepisywac stany z przycisku nalezalo oczywiscie w pewien sposob zmodyfikowac ten prosciutki programik do postaci:
    $MOD51
    ORG 0000H
    JMP SKO

    ORG 100H
    SKO: MOV P0,#111111111B
    MOV P1,#111111111B
    MOV P2,#111111111B
    MOV P3,#111111111B
    ET: JNB P3.0, WLA
    SETB P2.1
    JMP ET
    WLA: CLR P2.1
    JMP ET
    END

    bo tamten poprzedni tylko gasil diode i nic poza tym. swieta racja z resetem, ea, org 0000h, przyuciskiem sterowanym przez mase a nie stan wysoki (uzasadnienie doczytalem w literaturze) itd itp. to byl krok milowy w moich "zabawach" z mikrokontrolerami, teraz beda coraz bardziej skomplikowane projekty. jeszcze raz wszystkim serdecznie dziekuje:)

Podsumowanie tematu

✨ Problem dotyczył uruchomienia mikrokontrolera AT89S8252 z prostym programem sterującym diodą LED za pomocą przycisku podłączonego do portu P1.0. Główne błędy to nieprawidłowe ustawienie adresu startowego programu (ORG 100h zamiast ORG 0000h), brak odpowiedniego podłączenia pinów EA i RST oraz niewłaściwe użycie instrukcji RET zamiast skoku. Ponadto port P0 nie posiada wewnętrznych rezystorów podciągających, co wymagało zastosowania zewnętrznego rezystora 10kΩ do plusa oraz poprawnego podłączenia przycisku do masy, aby wykrywać stan niski po naciśnięciu. Po poprawnym podłączeniu pinów EA do VCC, RST przez kondensator 10µF do VCC i rezystor 10kΩ do masy oraz modyfikacji programu na wykrywanie stanu niskiego na przycisku, układ zaczął działać poprawnie. Wskazano również, że po resecie porty są domyślnie ustawione w stan wysoki, więc nie ma potrzeby inicjalizacji ich do 0xFF. Dyskusja podkreśliła znaczenie prawidłowego schematu połączeń i konfiguracji mikrokontrolera AT89S8252 oraz poprawnego programowania w asemblerze.
Wygenerowane przez model językowy.
REKLAMA