DSM-51

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

DSM-51

Post autor: lewyboy » 16 kwie 2012, 20:05

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.
Ostatnio zmieniony 16 kwie 2012, 21:17 przez lewyboy, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 16 kwie 2012, 20:30

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..

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 16 kwie 2012, 20:44

To nie caly napis ma się przesuwać, tylko pojedyncze literki. BOL BO L BO L BO B O ... coś w ten deseń.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 17 kwie 2012, 7:22

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.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 17 kwie 2012, 7:58

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.

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 9:28

Panowie, ja szczerze mówiąc nie mam pojęcia co robić, i nie za bardzo rozumiem to co chcecie mi przetłumaczyć. Niestety nie jestem najlepszym uczniem, dlatego tutaj pisze.

@Simrowit - jeżeli byś mi pomógł, byłbym naprawdę wdzięczny...

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 17 kwie 2012, 10:41

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.

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 10:56

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.

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   
Nie wiem czy w ogóle z takiego polecenia można zrobić aby te literki pojedynczo się przesuwały w prawo.

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 13:08

simrowit, w jaki sposób stworzyć tę animację? Jeżeli można poproszę o listing, albo nawet i kontakt na nr GG: 5574832.

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 17 kwie 2012, 13:31

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.
Niestety nie jestem najlepszym uczniem, dlatego tutaj pisze.
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ą.
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.

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 13:42

kayron, to co potrzebuje to tylko wyrywek zadania które mam do wykonania. Specjalnie dla Ciebie napisze całe zadanie.

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ę".
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.

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 17 kwie 2012, 13:52

5kB to raczej wystarczy na taki program, wystarczyłoby i 2 KB. Ogólnie rozbroił mnie punkt 5.
Jeżeli nauczyciel, nie narzuca metody wykonania, to spoko. tylko nie napisałeś czy jesteś ograniczony językiem programowania, i czy musisz przedstawić kod źródłowy ?

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 13:55

Język już wspomniałem wyżej ASM, kodu przedstawiać nie muszę. Po prostu tworzę program i pokazuje nauczycielce jak leci na urządzeniu, ona w treść programu nie wnika.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 17 kwie 2012, 13:58

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.
Ostatnio zmieniony 11 maja 2012, 5:39 przez mr_x, łącznie zmieniany 1 raz.

lewyboy
-
Posty: 13
Rejestracja: 16 kwie 2012, 19:56
Lokalizacja: Gdańsk

Post autor: lewyboy » 17 kwie 2012, 14:04

w szkole mam zrobione punkty 1,2,3 i 6. Mam problem z tym napisem. Plik z zadaniami 1 2 3 6 waży u mnie 1kb.

A co do tego zegara ciekaw jestem jak dlugi jest program.

ODPOWIEDZ