DSM-51
DSM-51
Witam. Jestem w ostatniej klasie technikum, i szczerze mówiąc nie za bardzo znam się na DSMce. Aby zaliczyć semestr dostałem zadanie do wykonania, lecz mam problem z jedna z jego części.
Zadanie:
Otóż muszę na wyswietlaczu 7-segmentowym wykonać napis BOL, i sprawić aby każda z literek po kolei pojedynczo się przesuwała w prawo, a następnie zniknęła.
Jestem w stanie tylko stworzyć takowy napis BOL znajdujący się po lewej stronie, ale dalej jestem w kropce i nie mam pojęcia jak sprawić aby literki się przesuwały. Jeżeli ktoś byłby w stanie wytłumaczyć w jaki sposób to wykonać, byłoby świetnie.
EDIT: zapomniałem dodać, że operacja ta ma się zapętlić to 3 razy.
Zadanie:
Otóż muszę na wyswietlaczu 7-segmentowym wykonać napis BOL, i sprawić aby każda z literek po kolei pojedynczo się przesuwała w prawo, a następnie zniknęła.
Jestem w stanie tylko stworzyć takowy napis BOL znajdujący się po lewej stronie, ale dalej jestem w kropce i nie mam pojęcia jak sprawić aby literki się przesuwały. Jeżeli ktoś byłby w stanie wytłumaczyć w jaki sposób to wykonać, byłoby świetnie.
EDIT: zapomniałem dodać, że operacja ta ma się zapętlić to 3 razy.
Ostatnio zmieniony 16 kwie 2012, 21:17 przez lewyboy, łącznie zmieniany 1 raz.
Sam algorytm jest prosty, ale 51' już wiele osób nie zna, a znawców systemów ewolucyjnych dla 51' to chyba szukać z świeczką.
W czym to piszesz w ASM czy C ? Ja coś takiego tworzyłem kiedyś w bascom 51.
Sam sposób jest prost, tworzysz sobie w RAM tablicę równą ilości wyświetlaczy.
Potem ja zerujesz i wstawiasz na pierwszą lewą pozycję znak B (index 0 tablicy). czekasz ok 0.7 sek (700ms). Tablica jest wyświetlana po kolei w przerwaniu od jakiegoś Timera, przynajmniej 200x na sek dla wyświetlacza LED.
Nie czyścisz tablicy, tylko wstawiasz, na drugi wyświetlacz B (inedex 1 tab), a na pierwszy O (index 0 tablicy). Nie musisz niczego czyścić bo procesor wykona tę operacje tak szybko że nie zauważysz żadnych zakłóceń na wyświetlaczu.
Po kolejnych 700ms, robisz to samo tylko na inedx 2 dajesz B, na index 1 O, a na index 0 L.
Potem wchodzisz w pętlę która już tylko przesuwa, zawartość bufora w lewo co 700ms i napis ci płynie po ekranie. Przy czym element z ostatniego indexu tablicy musi ładować do pierwszego, czyli musi to tworzyć taki pierścień, w którym kręcą się dane dla wyświetlacza..
W czym to piszesz w ASM czy C ? Ja coś takiego tworzyłem kiedyś w bascom 51.
Sam sposób jest prost, tworzysz sobie w RAM tablicę równą ilości wyświetlaczy.
Potem ja zerujesz i wstawiasz na pierwszą lewą pozycję znak B (index 0 tablicy). czekasz ok 0.7 sek (700ms). Tablica jest wyświetlana po kolei w przerwaniu od jakiegoś Timera, przynajmniej 200x na sek dla wyświetlacza LED.
Nie czyścisz tablicy, tylko wstawiasz, na drugi wyświetlacz B (inedex 1 tab), a na pierwszy O (index 0 tablicy). Nie musisz niczego czyścić bo procesor wykona tę operacje tak szybko że nie zauważysz żadnych zakłóceń na wyświetlaczu.
Po kolejnych 700ms, robisz to samo tylko na inedx 2 dajesz B, na index 1 O, a na index 0 L.
Potem wchodzisz w pętlę która już tylko przesuwa, zawartość bufora w lewo co 700ms i napis ci płynie po ekranie. Przy czym element z ostatniego indexu tablicy musi ładować do pierwszego, czyli musi to tworzyć taki pierścień, w którym kręcą się dane dla wyświetlacza..
Jeśli przesuwanie znaków ma byc celem ostatecznym to wcale nie trzeba tego dokonywac po przez przesuwanie znakow, tylko po prostu przez wyswietlenie takich gotowych napisow z przesuniętą literą w jakichs odstepach czasowych a efekcie uzyskamy przesuwajace sie znaki. Cel uswieca srodki. No chyba ze jest wymagany taki algorytm ze jednak ten tekst ma sie fizycznie w pamieci przesuwac, to wówczas faktycznie trzeba bedzie pokombinowac. Moge pomoc.
Nie znam za bardzo DSM, ale ja bym stworzył poza wspomnianymi komórkami - buforami na napis dodatkowy licznik. Jego zwiększanie w pętli powodowałoby, że przesuwał się jak gdyby początek napisu względem początku wyświetlaczy, bo przecież te wyświetlacze mają jakiś adres w przestrzeni adresowej, a na 99% jest on ciągły, więc zrobienie tego nie powinno być jakimś wielkim problemem. Po przejściu całego napisu następowałoby zerowanie tego licznika.
wg mnie najprosciej zrobic to tak jak sie robi animacje czyli kolejno wyswietlanie klatek obrazu, jak w kinie:). Napisales ze nie jest problemem dla ciebie napis BOL wyswielic wiec z ta metoda nie bedzie problemu:
1) BOL
2) czekaj
3) BO L
4) czekaj
5) BO__L
6) czekaj
7) BO___L
.
.
X) B________O
.
itd.
calosc powtorz 3x moze nie jest to rozwiazanie idealne ale na zaliczenie moze bedzie dobre , jesli potrzeba czegos "madrzejszego" daj znac. I w jakim jezyku ma to byc napisane znam Bascom i ASM, C niestety nie.
1) BOL
2) czekaj
3) BO L
4) czekaj
5) BO__L
6) czekaj
7) BO___L
.
.
X) B________O
.
itd.
calosc powtorz 3x moze nie jest to rozwiazanie idealne ale na zaliczenie moze bedzie dobre , jesli potrzeba czegos "madrzejszego" daj znac. I w jakim jezyku ma to byc napisane znam Bascom i ASM, C niestety nie.
To znaczy mój napis BOL jest typowy jak z podręcznika. Może napisze jak on wygląda w praktyce...
To ma być pisane w ASM.
Nie wiem czy w ogóle z takiego polecenia można zrobić aby te literki pojedynczo się przesuwały w prawo.
To ma być pisane w ASM.
Kod: Zaznacz cały
SEG_ON EQU P1.6
LITB EQU 01111111B ; LITERA B
LITO EQU 00111111B ; LITERA O
LITL EQU 00111000B ; LITERA L
ZERO EQU 00000000B
DISPLAY EQU 30H
LJMP START
ORG 100H
START:
MOV DISPLAY,#ZERO
MOV DISPLAY+1,#ZERO
MOV DISPLAY+2,#ZERO
MOV DISPLAY+3,#LITL
MOV DISPLAY+4,#LITO
MOV DISPLAY+5,#LITB
MOV DISPLAY+6,#ZERO
LOOP_DISP:
MOV RO,#DISPLAY
MOV R2,#7
MOV R3,#00000001B
LOOP:
SETB SEG_ON
MOV R1,#CSDS
MOV A,R3
MOVX @R1,A
RL A
MOV R3,A
MOV R1,#CSDB
MOV A,@R0
MOVX @R1,A
INC R0
CLR SEG_ON
MOV A,#1
LCALL DELAY_MS
DJNZ R2,LOOP
SJMP LOOP_DISP Podaj może jakieś konkretne wymogi jakie na ciebie narzucono w tym zaliczeniu . Masz pełną dowolność koncepcji i rozwiązania, czy np, program ma umożliwiać przesuwanie dowolnego wprowadzonego do niego tekstu, bo to determinuje całe podejście.
Tylko pamiętaj że gotowiec ci i tak nic nie da. Bo wystarczy że cię spytają jak to działa, albo karzą ci zmienić w tym to a owo i polegniesz. Bez zrozumienia tematu i tak nic nie osiągniesz.
Jeżeli nie jesteś związany Asemblerem to sobie go daruj, tylko napisz to sobie w o wiele bardziej czytelnym C, czy co tam wałkujecie.
Dla mnie akurat żadne uzasadnienie, bo jeżeli masz w szkole zadanie z 8051, to na pewno go przerabialiście. Oczywiście kwestią otwartą jest czemu nie przyswoiłeś materiału, nie twierdzę że twoja wina, możesz po prostu mieć daremnego nauczyciela. Tacy też są.Niestety nie jestem najlepszym uczniem, dlatego tutaj pisze.
Tylko pamiętaj że gotowiec ci i tak nic nie da. Bo wystarczy że cię spytają jak to działa, albo karzą ci zmienić w tym to a owo i polegniesz. Bez zrozumienia tematu i tak nic nie osiągniesz.
Jeżeli nie jesteś związany Asemblerem to sobie go daruj, tylko napisz to sobie w o wiele bardziej czytelnym C, czy co tam wałkujecie.
kayron, to co potrzebuje to tylko wyrywek zadania które mam do wykonania. Specjalnie dla Ciebie napisze całe zadanie.
Koncepcja generalnie należy do mnie, jedynym praktycznie wymogiem jest limit pliku HEX jaki moge osiągnąć, to bodajże 5kb.
Tutaj z przyswojeniem materiału akurat zwaliłbym na mnie, niestety wybrałem złe technikum lecz zorientowałem się w tym już trochę za późno aby dokonać jakiejś zmiany.
Nie sądzę, a nawet wiem, że nauczyciel po zobaczeniu programu na DSMce nie będzie chciał już żadnych dodatkowych zmian do wprowadzenia.
Kod: Zaznacz cały
1.włącz i wyłącz diodę LED(test) 6 razy,
2.włącz i wyłącz buzer 3 razy,
3.operację 1 i 2 powtórz 6 razy w pętli.
4.na wyświetlaczu 7segmentowym wyświetl napis BOL, który zmienia swoje położenie po 1 literce i znika w prawo.
5.operację nr 4 powtórz 3 razy.
6.na wyświetlaczu LCD wyświetl propozycję oceny i wyraz "Dziękuję".Tutaj z przyswojeniem materiału akurat zwaliłbym na mnie, niestety wybrałem złe technikum lecz zorientowałem się w tym już trochę za późno aby dokonać jakiejś zmiany.
Nie sądzę, a nawet wiem, że nauczyciel po zobaczeniu programu na DSMce nie będzie chciał już żadnych dodatkowych zmian do wprowadzenia.
Na takie coś to i poniżej 512B wystarczy (zależy jak i w czym się pisze). A 2kB na program w asm to bardzo dużo i można napisać o wieeeele więcej, niż w zadaniu, że już nie wspomnę o 5kB.
Dla przykładu podam, że ten zegarek: LINK zajął niecałe 1.4kB (w wersji oprogramowania 1.0.2), więc widać tu potęgę asemblera.
Dla przykładu podam, że ten zegarek: LINK zajął niecałe 1.4kB (w wersji oprogramowania 1.0.2), więc widać tu potęgę asemblera.
Ostatnio zmieniony 11 maja 2012, 5:39 przez mr_x, łącznie zmieniany 1 raz.