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

Przykładowy program w Asemblerze dla ATMEL 89C52 z ADC i LCD

owieczka1984 03 Kwi 2004 16:21 5177 15
  • #1 578120
    owieczka1984
    Poziom 10  
    Posty: 54
    to jest fragment mojej pracy dyplomowej i do programowania tego mikrokontrolera sotsuje ASEMBLERA i prosilbym o napisanie przykladowego programiku w ktorum znajdowal by sie wynik przetworzonego napiecie z przetwornika ADC oraz jakikolwiek napis np Napiecie - "wynik" na wyswietlaczu LCDsposob polaczenia tak jak na schemacie.

    serdecznie dziekuje za pomoc
    Załączniki:
    • Przykładowy program w Asemblerze dla ATMEL 89C52 z ADC i LCD schemat.JPG (51.93 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #2 578647
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    zaprojektuj urządzenie od strony elektronicznej potem napisz sobie program np. w bascomie a pokaż kod w asemblerze
  • #3 578662
    candle
    Spec od monitorów
    Posty: 2238
    Pomógł: 38
    Ocena: 18
    jesli dobrze rozumiem...
    to jest fragment twojej pracy dyplomowej i w ramach tej pracy szukasz podwykonawcy, ktory napisze za ciebie obsluge adc i lcd w assemblerze, bo tobie sie nie chce przejrzec dokumentacji.. tyle fajnych rzeczy na dworze, panienki, piwo..
  • #4 579837
    owieczka1984
    Poziom 10  
    Posty: 54
    nie do konca wyjasnielem dlaczego prosze o pomoc dlatego teraz postaram sie to wyjasnic. Otoz juz probowalem wyswietlic cos na tym wyswietlaczu ale bez skutku,robilem to w ten sposob:

    ZAPIS ROZK EQU 9000H
    BUSY EQU 0B000H
    ZAPIS RAM EQU 0D000H
    START:
    MOV DPTR,#ZAPIS ROZK
    MOV A,#01H
    MOVX @DPTR,A
    BUSY:
    MOV DPTR,#BUSY
    MOVX A,@DPTR
    JB ACC.7,BUSY
    MOV A,#11H
    MOV DPTR,#ZAPIS RAM
    MOVX @DPTR,A
    SJMP $

    wstawialem rowniez zwloki czasowe aby wyswietlacz mogl zareagowac ale nie bylo efektu probowalem takze w zwykly sposob najpierw ustawic dana na porcie P0 a nastepnie ustawic adres na porcie P2 tak aby wyswietlacz mogl odczytac lub przeslac dana to jednak tez nie odnioslo skutku tak wiec juz nie wiem co moze byc przyczyna, czy moze byc kontrast zle ustawiony na wyswieltlaczu czy co????

    dlatego poprosilem o pomoc wiem ze zle zformuowalem moja prosbe ale nie mialm zamiaru pojsc na latwizne

    z gory przepraszam
  • #5 580606
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Co to jest za adres to 0x9000 ? To leci w wolny obszar. Musisz te rozkazy linia R/W wprowadzać do LCD. W dokumentacji do LCD powinno być podane jak się do niego odwołuje.
  • #6 580626
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    1. LCD trzeba zainicjować zanim cokolwiek do niego wyslesz.
    2. Czym to kompilujesz? ZAPIS ROZK - etykieta ze spacja - moim zdaniem powinno wywalic blad i sie w ogole nie kompilowac (powtarza sie)
    3. Port P0 nie ma wewntętrznych pulluapów, więc musisz dodoac zewnętrzne.
    4. Skad w ogóle wziąłeś te wartosci:ZAPIS ROZK EQU 9000H
    BUSY EQU 0B000H
    ZAPIS RAM EQU 0D000H i co to ma być?
    5. MOVX to odwołanie do pamięci zewnętrznej, której na schemacie nie widzę
  • #7 580958
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Przejrzyj dokladnie dokumentacje do HD44780.Wyswietlacz potrzebuje inicjalizacji i ja jej tutaj nie widze.Poza tym wszystkie twoje adresy celuja nie w to co potrzeba :lol: Przeciez u ciebie zmieniaja sie tylko bity A15-A12 ktore nie sa do niczego podlaczone.Jak chcesz cokolwiek zmienic :?: Poza tym tak to sie raczej nie podlacza pinow.Zrob prosty dekoder adresow na ukladzie 3 na 8 ktore beda generowaly chip select-y.Jak chcesz moge ci w tym pomoc.W tym wypadku powinno to wygladac mniej wiecej tak:

    zapisz_rozkaz_lcd equ 00900H
    czytaj_rozkaz_lcd equ 00B00H
    zapisz_dana_lcd equ 00C00H
    czytaj_dana_lcd equ 00F00H
    adc equ 00000H

    Chyba sie nigdzie nie pomylilem :lol:

    BTW:P0 podciagniety wewnetrznie,dales pin EA/VPP do zasilania ? No i jest pewien ZONK zwiazany z przebiegami czasowymi.LCD jako dane zatrzasnie ci mlodsza czesc adresu do wpisania (jesli chodzi o odczyt to beda smieci) wiec trzeba dac sygnal !WR i !RD z uC na bramke NAND i wyjscie na E z lcd.Wowczas bedzie sie prawidlowo zatrzaskiwac magistrala danych.

    :arrow: Tdv
    To sie nazywa "mapowanie urzadzen na przestrzen adresowa" :lol:
  • #8 581101
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Cyberdar, ja zawsze proszę o objasnienie
    kilku sekwencji z kodu programu, jakiś podprogram itp.
    Ciekawe czy Ty potrafiłbyś wyjaśnić jak to się odbywa w asemblerze
    powstałym z bascomu?. Nie mówię że tego się nie da tylko po co
    analizować potem taki program i przerabiać go na asm.
  • #9 582251
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    fantom: "mapowanie urzadzen na przestrzen adresowa" to powinno troche inaczej wyglądać, a już napewno w przypadku uC '51, gdzie byłby potrzebny rejestr do zatrzaskiwania adresu, zresztą sam o tym piszesz.
    "P0 podciagniety wewnetrznie" - uC '51 nie posiada wewnętrznych rezystorów podciągających na porcie P0.
    Tu są procedury do ossługi LCD w asm '51:
    LCD_INIT: PUSH ACC ;PROCEDURA INICJALIZACJI WYSWIETLACZA
    PUSH PSW
    CLR RW
    CLR RS
    CLR ENABLE
    MOV B,#00Dh
    LOOP1: MOV A,#0FFh
    DJNZ ACC,$
    DJNZ B,LOOP1
    MOV P1,#00111000B
    SETB ENABLE
    CLR ENABLE
    MOV B,#010h
    LOOP2: MOV A,#0FFh
    DJNZ ACC,$
    DJNZ B,LOOP2
    SETB ENABLE
    CLR ENABLE
    MOV A,#099h
    DJNZ ACC,$
    SETB ENABLE
    CLR ENABLE
    MOV A,#049h
    DJNZ ACC,$
    MOV P1,#00111000B
    SETB ENABLE
    CLR ENABLE
    MOV A,#039h
    DJNZ ACC,$
    MOV P1,#00000110B
    SETB ENABLE
    CLR ENABLE
    MOV A,#029h
    DJNZ ACC,$
    MOV P1,#00001100B
    SETB ENABLE
    CLR ENABLE
    MOV A,#029h
    DJNZ ACC,$
    LCALL CLEAR_L
    POP PSW
    POP ACC
    RET
    ;;;;;;;;;;;;;
    WRITE: CLR RS ;PROCEDURA WYSYLA DO WYSW. ZNAK ASCI Z R2
    SETB RW
    BUSY: CLR ENABLE
    MOV P1,#0FFH
    SETB ENABLE
    JB P1.7,BUSY
    CLR ENABLE
    CLR RW
    MOV P1,B
    SETB RS
    SETB ENABLE
    CLR ENABLE
    RET
    ;;;;;;;;;;;
    IWRITE: CLR RS ;PROCEDURA WYSYLA DO WYSW. ROZKAZ Z R2
    SETB RW
    BUSY1: CLR ENABLE
    MOV P1,#0FFH
    SETB ENABLE
    JB P1.7,BUSY1
    CLR ENABLE
    CLR RW
    MOV P1,B
    SETB ENABLE
    CLR ENABLE
    RET
    ;;;;;;;;;;;
    CLEAR_L: PUSH ACC ;PROCEDURA CZYSCI EKRAN I USTAWIA KURSOR NA POZYCJI 0
    PUSH B
    CLR RS
    MOV P1,#00000001B
    SETB ENABLE
    CLR ENABLE
    MOV B,#06h
    CL_L: MOV A,#0FFh
    DJNZ ACC,$
    DJNZ B,CL_L
    POP B
    POP ACC
    RET
    ;;;;;;;;;;;;;
    POZYCJA: MOV A,B ;PROCEDURA USTAWIA KURSOR NA POZYCJI ZAWARTEJ W B
    ORL A,#10000000B
    MOV B,A
    LCALL IWRITE
    RET

    Deklaracje w programie wyglądały tak:
    STACK SEGMENT IDATA
    PROGRAM SEGMENT CODE
    VAR SEGMENT DATA
    BITVAR SEGMENT BIT

    T0_H EQU 03Ch ;6MMz PRZERWANIE CO 0.1 sek
    T0_L EQU 0B0h
    T1_H EQU 0ECh ;PRZERWANIE CO 10 msek
    T1_L EQU 078h

    ENABLE EQU 0B0H.0
    RW EQU 0B0H.1
    RS EQU 0B0H.7

    R7AD EQU 007H
    R6AD EQU 006H
    R5AD EQU 005H
    R4AD EQU 004H
    R3AD EQU 003H
    R2AD EQU 002H
    R1AD EQU 001H
    R0AD EQU 000H

    RSEG VAR
    CZ_WYM: DS 8 ;CZASY OPOZNIEN WYMAGANE
    CZ_BIEZ: DS 8 ;CZASY OPOZNIEN BIERZACE
    KEYS: DS 1 ;STAN KLAWIATURY
    T_KEYS: DS 1 ;TYMCZASOWY STAN KLAWIATURY
    CZ_STAT: DS 1 ;STAN CZUJNIKOW
    CZ_TMP: DS 1
    STATUS: DS 1 ;CZUJNKIKI NO/NC
    REFRESH: DS 1 ;ODLICZANIE WYSWIETLANIA
    D_SEK: DS 1
    TIME: DS 1
    TMP: DS 1
    AL_NR: DS 1

    RSEG BITVAR
    TMP_F: DBIT 1
    ALARM: DBIT 1
    ACTIV: DBIT 1
    S_BY: DBIT 1

    RSEG STACK
    DS 020H

    CSEG AT 00H
    AJMP INIT

    CSEG AT 0BH
    AJMP T0_SERV

    CSEG AT 1BH
    AJMP T1_SERV

    RSEG PROGRAM
    ORG 02CH
    INIT: MOV SP,#STACK-1

    Pochodzi to z programu urządzenia działającego już trochę czasu...
    Aha - sposób podłaczenia LCD do uC można wywnioskować na podstawie deklaracji pinów (8bit).
  • #10 582412
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Tdv właśnie że '51 ma wewnętrzne rezystory podciągające do plusa. Ale jest jeden szkopuł działają one "tylko" w trybie używania zewnętrznej pamięci - to jest wszystko w manualu.
  • #11 582597
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    :arrow: Tdv
    Zgadzam sie ze to powinno inaczej wygladac ale nie zgadzam sie ze jest potrzebny rejestr do zatrzasniecia mlodszej czesci adresu.Jesli wszystko jest dekodowane ze starszej czesci to nie jest to potrzebne natomiast jest potrzebne przemyslenie kiedy i w jakich warunkach urzadzenia zewnetrzne zatrzasna prawidlowo magistrale danych (analiza przebiegow poszczegolnych ukladow).Faktycznie, klasycznie '51 nie ma rezystorow podciagajacych na P0 ale ten model akurat ma (specjalnie sprawdzalem w manualu :lol: ).
    :arrow: owieczka1984
    Masz gotowy program od Tdv wiec go wyprobuj.Osobiscie przy tak malo skomplikowanym ukladzie odradzalbym mapowanie urzadzen na przestrzen adresowa gdyz mija sie to z celem a jak sam widzisz jest trudniejsze do realizacji.Jesli musisz tak zrobic (masz taki nakaz) to napisalem ci jak i co a jesli nie musisz to zrob to na standardowych portach I/O.

    Pozdrowienia.
  • #12 582640
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    W sumie jeżeli będzie dekodował ze starszych to nie potrzebuej tego zatrzasku ale trzeba pamiętać wtdy o aliasingu bo każde z urządzeń będzie dekodowane pod kilkudziesięcioma różnymi adresami (np. teoretyczine ma adres 0xA000, a odpowiadać będzie na rozkazy wysłane pod każdy adres z zkaresu 0xA000 do 0xAFFF (zakładam, że dekoder adresowy bedzie tylko na 4 najstarszych bitach)).
    Z rezystorami faktycznie macie rację - też sprawdzałem.
  • #13 585986
    owieczka1984
    Poziom 10  
    Posty: 54
    serdeczne dzieki za pomoc. teraz mam wolne od szkoly ale jak tylko sie w niej znajde i pogadam z promotorem to natychmist dam wam znac jak i co . puki co to dziekuje serdecznie za zainteresowanie sie tym :)
  • #14 586169
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    No a ja stwierdzam ze jednak sie pomylilem.Powinno byc

    zapisz_dana_lcd equ 00D00H

    natomiast co do tych sygnalow RD i WR to do tego powinno byc jeszcze dodane na AND-a A8.
  • #15 623384
    owieczka1984
    Poziom 10  
    Posty: 54
    dzieki wam bardzo, wyswietlacz juz dziala poprawnie jak bede mial czas to wstawie tu program ktory napisalem samodzielnie w asm to moze sie komus przyda
    jeszcze raz dzieki za zainteresowanie moim postem :)
  • #16 647607
    owieczka1984
    Poziom 10  
    Posty: 54
    tak jak obiecalem to jest fragment tego programu do obslugi wyswietlacza:

    ON_LCD EQU P2.0
    RW EQU P2.1
    RS EQU P2.2
    LJMP START
    ORG 50H
    START:
    CLR ON_LCD
    MOV A,#00111000B
    LCALL ZAPIS_ROZK
    MOV A,#00001110B
    LCALL ZAPIS_ROZK
    MOV A,#00000110B
    LCALL ZAPIS_ROZK
    MOV A,#01H
    LCALL ZAPIS_ROZK
    MOV DPTR,#TEKST
    LCALL WPIS_TEKSTU
    SJMP $
    WPIS_TEKSTU:
    MOV R1,#00H
    NAST_ZNAK:
    MOV A,R1
    MOVC A,@A+DPTR
    CJNE A,#'$',ZAPISZ_ZNAK
    RET
    ZAPISZ_ZNAK:
    SETB RW
    CLR RS
    LCALL CZAS
    LCALL LCD_ON_OF
    JB P0.7,ZAPISZ_ZNAK
    MOV P0,A
    CLR RW
    SETB RS
    LCALL CZAS
    LCALL LCD_ON_OF
    INC R1
    SJMP NAST_ZNAK
    ZAPIS_ROZK:
    MOV P0,A
    CLR RW
    CLR RS
    LCALL CZAS
    LCALL LCD_ON_OF
    RET
    LCD_ON_OF:
    SETB ON_LCD
    LCALL CZAS
    CLR ON_LCD
    LCALL CZAS
    RET
    CZAS:
    MOV R0,#40
    PETLA:
    DJNZ R0,PETLA
    RET

    TEKST:
    DB 'TEST WYSWIETLACZA','$'
    END

Podsumowanie tematu

✨ Dyskusja dotyczyła problemów z napisaniem programu w asemblerze dla mikrokontrolera ATMEL 89C52, który miałby obsługiwać przetwornik ADC oraz wyświetlacz LCD. Autor prosił o przykładowy kod wyświetlający wynik pomiaru napięcia z ADC wraz z napisem na LCD. W odpowiedziach zwrócono uwagę na konieczność prawidłowej inicjalizacji wyświetlacza LCD (np. HD44780), poprawne mapowanie portów i sygnałów sterujących (RS, RW, E), a także na błędy w adresowaniu pamięci zewnętrznej i użyciu instrukcji MOVX, które nie są adekwatne do podłączonych urządzeń. Podkreślono, że port P0 nie posiada wewnętrznych rezystorów podciągających, co wymaga zastosowania zewnętrznych. Zaproponowano użycie prostego dekodera adresów do generowania sygnałów chip select oraz zwrócono uwagę na konieczność synchronizacji sygnałów RD i WR z magistralą danych. Wskazano także na gotowe procedury inicjalizacji i obsługi LCD w asemblerze dla 8051, które można wykorzystać. Autor potwierdził, że po wprowadzeniu poprawek wyświetlacz działa poprawnie i planuje udostępnić swój kod. Dyskusja zawierała fragmenty kodu asemblerowego inicjalizującego LCD oraz obsługującego wyświetlanie tekstu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA