Strona 1 z 2
Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 18:21
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ą.
Re: Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 18:58
autor: traxman
Sadysta

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.
Re: Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 20:06
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.
Re: Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 20:14
autor: traxman
Jeżeli to jednokierunkowe to daj HCT245 jako bufor.
Re: Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 21:36
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.
Re: Problem z AT89C51 - nie pracuje P0.
: pt, 12 grudnia 2008, 23:42
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...
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 16:46
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.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 17:38
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ść.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 18:44
autor: traxman
Jakbyś był moim studentem to wywaliłbym Cię za drzwi i nie pozwolił nimi trzasnąć
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.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 20:01
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.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 20:12
autor: traxman
No faktycznie przesuwanie o jeden w lewo/prawo jest skomplikowane shr/shl
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 21:41
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ń.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 22:47
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.
Re: Problem z AT89C51 - nie pracuje P0.
: sob, 13 grudnia 2008, 23:05
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).

Re: Problem z AT89C51 - nie pracuje P0.
: ndz, 14 grudnia 2008, 12:42
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.