Problem z AT89C51 - nie pracuje P0.

Jeśli informacja nie pasuje do żadnego działu, a musisz się nią podzielić - zrób to tutaj.

Moderatorzy: gsmok, tszczesn, Romekd

maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

Niestety port P0 nie pracuje. Oczywiście wiem, że P0 ma wyjście typu otwarty dren i mam rezystory podciągające 1K do +5V. Linia EA ma poziom wysoki. Korzystam z wewnętrznej pamięci programu. Port P0 ma pracować jak zwykły port wysyłający kolejne cyferki w kodzie BCD - koniecznie w standardzie TTL. Do P0 mam podpięty 74141. Zawsze to retro.

Zauważyłem, że nie działa mi żaden port. Mogę ustawiać i zerować linie pojedyńczo np. SETB P2.0 lub CLR P2.0. Niestety np. operacja MOV P0,64h kończy się pojawieniem samych zer na linii portu P0. Z innymi portami mam tak samo. Chyba chodzi o coś z adresowaniem portów. Posrednio przez rejestry np. MOV @Rn,cos_tam też nie idzie.

Przepraszam, że akurat tu ale na elektrodzie i tak mi pewnie nie odpowiedzą.
traxman

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: traxman »

Sadysta :mrgreen: 8x1k=125R co daje tylko w tym porcie 40mA, upalisz doprowadzenie GND do struktury lub ją przegrzejesz bo już jest na granicy wytrzymałości - pullUp >10k w zupełności wystarczy, a stosuje się praktycznie znacznie więcej.
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

No inne porty są słabo obciążone. Problem w tym, że jak na wszystkich pinach P0 będą zera logiczne to TTL odda jeszcze jakieś 1,6mA na linię. Mogę zmienić te oporki, ale to nie pomoże.
traxman

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: traxman »

Jeżeli to jednokierunkowe to daj HCT245 jako bufor.
Awatar użytkownika
Tomasz Gumny
1875...2499 postów
1875...2499 postów
Posty: 2301
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań
Kontakt:

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: Tomasz Gumny »

maciej_333 pisze:Do P0 mam podpięty 74141.
TTL są "samopodciągające" - wystarczą symboliczne rezystory rzędu 10k do +5V. Bez nich też będzie wysoki stan.
Co do reszty, to zapodaj kawałek schematu i kodu.
Tomek
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

Postaram się zapodać kod i schemat. Problem leżał po stronie programowej. Powinno być np. MOV P0,#64h zamiast MOV P0,64h. To drugie wstawi do P0 zawartość komórki RAMu o adresie 64h. Tyle, że teraz chodzi mi to jakoś tak losowo. Nie wiem czy to wina spzętu czy softu...
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

No to w załączniku schemat. Docelowo układ ma to być zegarem na lampach Nixie. Lampy sterowane są multipleksowo. W anodzie każdej lampy jest ten sam układ na tranzystorach. Poniżej kod:

Kod: Zaznacz cały

ORG 0h
CLR P0
CLR P2

wracam:
SETB P2.0
MOV P0,#0d
NOP
CLR P2

SETB P2.1
MOV P0,#1d
NOP
CLR P2

SETB P2.2
MOV P0,#2d
NOP
CLR P2

SETB P2.3
MOV P0,#3d
NOP
CLR P2

SETB P2.4
MOV P0,#4d
NOP
CLR P2

SETB P2.5
MOV P0,#5d
NOP
CLR P2

JMP wracam
END
Przy takim sterowaniu powinno to wyświetlić na poszczególnych wskaźnikach cyferki 1, 2, 3, 4, 5. Jednak są wyświetlane tylko jakieś plamy. Dodam, że sprzęt jest OK. Jak zapalałem (też multipleksowo) tą samą cyfrę na wszystkich wskaźnikach to było dobrze. Dało radę zapalić wszystkie cyferki od 0 do 9. Wnioskuję, więc, że sprzęt mam OK.
Co dalej ? Jest to mój projekt na studia i muszę to zrobić. Z mikrokontrolerami mam małe doświadczenie.
Załączniki
skanuj0002.jpg
Awatar użytkownika
Tomasz Gumny
1875...2499 postów
1875...2499 postów
Posty: 2301
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań
Kontakt:

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: Tomasz Gumny »

maciej_333 pisze:Przy takim sterowaniu powinno to wyświetlić na poszczególnych wskaźnikach cyferki 1, 2, 3, 4, 5. Jednak są wyświetlane tylko jakieś plamy. Dodam, że sprzęt jest OK. Jak zapalałem (też multipleksowo) tą samą cyfrę na wszystkich wskaźnikach to było dobrze.
1. Szeregowe rezystory 10k w bazach tranzystorów sterujących są zbędne. Porty '51 mają statycznie niemal symboliczne podciągnięcie. Bazy podepnij bezpośrednio do wyjść portu P2 a rezystory wykorzystaj do podciągnięcia baz do +5V.
2. Przy tranzystorach wykonawczych brakuje rezystorów od bazy do +170V albo do emitera. Tranzystory wysokonapięciowe (zakładam, że takie są BF421/487) miewają duży prąd zerowy kolektora, więc tranzystory wykonawcze będą zawsze wysterowane.
3. Dlaczego rezystor ograniczający prąd dałeś w emiterze tranzystora wykonawczego? Jakoś bardziej pasowałby mi w kolektorze.
4. Załączasz/wyłączasz cyfry na 1..2us. Zresztą wstawiłeś tam NOP, ale to i tak za mało. Wstaw jakieś większe opóźnienia:

Kod: Zaznacz cały

SETB P2.0
MOV P0,#0d
DEL: MOV R0,#255
DJNZ R0,DEL
CLR P
Składnia może być trochę inna - piszę z pamięci.
Może też być konieczna niewielka pauza między cyframi.
BTW. Oznaczaj elementy na schematach, bo trudno się do nich odnieść.
Tomek
traxman

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: traxman »

Jakbyś był moim studentem to wywaliłbym Cię za drzwi i nie pozwolił nimi trzasnąć :mrgreen:
Po co 40-pinowy kontroler i multiplex - albo jedno albo drugie. Masz 40 pinów to podłącz segmenty pojedynczo do każdego pinu (tranzystorów będzie moc, ale nie komplikujesz programu), jeżeli masz multiplex to daj 89c1051 bo więcej pinów nie jest potrzebne tym bardziej, że używasz transkodera BCD->1z10 HV.
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

BF421 i BF487 są wysokonapięciowe, w końcu pracowały we wzmacniaczach wizjii w TV. Taki mikrokontroler dałem z kilku powodów:
-cena taka sama ja AT89C1051
-ponadto początkowo nie mało być 74141. Potem sobie przypomniałem, że go mam, ale mikrokontrolery (kilka jakby coś) już miałem kupione i tak zostało. No, a tranzystorów musiałbym mieć 10, do tego rezystory. Za dużo lutowania. Całość jest zmontowana na płytce uniwersalnej. To też musiałem uwzględnić.
-sterowanie lampami od razu w kodzie 1 z 10 komplikuje program. Przy sterowaniu w BCD mogę zwyczajnie inkrementować port, albo wstawiać cyklicznie do niego odpowiednie wartości np. przechowywane w ramie.

Tranzystory wykonawcze nie są zawsze wysterowane. Sprawdzałem to.
traxman

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: traxman »

No faktycznie przesuwanie o jeden w lewo/prawo jest skomplikowane shr/shl
Awatar użytkownika
Tomasz Gumny
1875...2499 postów
1875...2499 postów
Posty: 2301
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań
Kontakt:

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: Tomasz Gumny »

maciej_333 pisze:Tranzystory wykonawcze nie są zawsze wysterowane.
Nie twierdzę, że są wysterowane a jedynie, że mogą być. Sprawdź prąd zerowy kolektora sterującego - przypuszczam, że bedzie rzędu kilku..kilkudziesięciu uA, zwłaszcza przy wyższym napięciu i w wyższej temperaturze. Przy wzmocnieniu tranzystora wykonawczego rzędu 100 możemy mieć już 1mA. Sam napisałeś, że to projekt na studia...
Natomiast nie napisałeś czy pomogło wstawienie opóźnień.
Tomek
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

Rezystory 10K w bazach tranzystorów sterujących podpiąłem już jako rezystory podciągające. Dzięki temu układ pracował trochę stabilniej i lepiej. Dodanie opóźnień i to większych nie wiele pomogło. Jednak na pierwszym wskaźniku zapala się o dziwo zero. Obecnie na innych jest kilka cyfr naraz. Wygląda jakby traznystory nie zdążały z zatkaniem się. W sumie wyjście z głębokiego nasycenia zajmuje sporo czasu. Mógłbym zwiększyć rezystory w bazach, albo dodać np. diody germanowe lub Schotty'ego do złącz BC. Wtedy nigdy się nie nasycą i będą chodziły bardzo szybko.
Dla świętego spokoju dokonam pomiarów prądów zerowych w obwodach tranzystorów.

Co do przesówania, to nie twierdzę o skomplikowaniu tego rozwiązania. Jak to przemyślałem to nie byłoby tak źle, ale zająłbym ponad dwa porty, wtedy przesuwać już jest gorzej, a ponadto dla każdej cyfry jaką chciałbym wyświetlić musiałbym dokonać osdobnego przesuwania. To naprawdę trochę kompikuje porgram.
Awatar użytkownika
Tomasz Gumny
1875...2499 postów
1875...2499 postów
Posty: 2301
Rejestracja: pn, 1 stycznia 2007, 23:18
Lokalizacja: Trzcianka/Poznań
Kontakt:

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: Tomasz Gumny »

maciej_333 pisze:Wygląda jakby traznystory nie zdążały z zatkaniem się. W sumie wyjście z głębokiego nasycenia zajmuje sporo czasu.
...zwłaszcza jeśli nie ma rezystora między bazą i emiterem (w tranzystorach wykonawczych). :)
Tomek
maciej_333
625...1249 postów
625...1249 postów
Posty: 952
Rejestracja: śr, 19 listopada 2003, 14:33
Lokalizacja: Grudziądz

Re: Problem z AT89C51 - nie pracuje P0.

Post autor: maciej_333 »

Jak się okazało w moim asemblerze instrukcja np. CLR P2 nie zeruje całego portu !!! Zerowana była tylko linia P2.0 inne były nie ruszone. Nie wiem czemu tak jest. Jak zamiast CLR P2 dałem MOV P2,#0d to program pracował. Obecnie mam taki kod:

Kod: Zaznacz cały

ORG 0h
MOV P0,#0d
MOV P2,#0d

wracam:
SETB P2.0
MOV P0,#0d
MOV R0,#255d
delay:
NOP
DJNZ R0,delay
MOV P2,#0d

SETB P2.1
MOV P0,#1d
MOV R0,#255d
delay2:
NOP
DJNZ R0,delay2
MOV P2,#0d

SETB P2.2
MOV P0,#2d
MOV R0,#255d
delay3:
NOP
DJNZ R0,delay3
MOV P2,#0d

SETB P2.3
MOV P0,#3d
MOV R0,#255d
delay4:
NOP
DJNZ R0,delay4
MOV P2,#0d

SETB P2.4
MOV P0,#4d
MOV R0,#255d
delay5:
NOP
DJNZ R0,delay5
MOV P2,#0d

SETB P2.5
MOV P0,#5d
MOV R0,#255d
delay6:
NOP
DJNZ R0,delay6
MOV P2,#0d

JMP wracam
END
Coś też mój asembler nie chce brać pod uwagę makroinstrukcji, nie chce to chodzić, a teoretycznie powinno. Opóźnienie jest duże. Jedna iteracja skoku DJNZ to trzy cykle maszynowe. Jeden cykl to coś tak 1us, więc mamy 3*255=765us.
ODPOWIEDZ