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

Jak napisać generator przebiegu prostokątnego w assemblerze c51?

wojciech.nurzynski 24 Sty 2007 17:53 4199 10
  • #1 3482702
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    Witam!

    Mam napisać program w assemblerze.
    Generator przebiegu prostokątnego.
    Może ktoś ma przykładowe programy?
    Proszę o pomoc.

    Pozdrawiam!
  • #2 3490226
    Songo
    Poziom 13  
    Posty: 37
    Pomógł: 4
    Ocena: 1
    Czy naprawdę tak trudno zainteresować się tym co się ma do zrobienia i po prostu to zrobić? Program jest naprawdę 'nieskomplikowany' i naprawdę zachęcam do własnej inicjatywy, a jeśli to tak wielki ból sprawia to google są nadal czynne ...

    --
    Maciek
  • #3 3505107
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    Wielkie dzięki "songo" za pomoc!!!
    Ale sądząc po ilości postów od stycznia 2003 roku to dużo nie narobiłeś się na elektrodzie...
    Nie takiej pomocy oczekuje.
    Jak wiadomo assembler nie jest językiem najwyższych lotów ale jeżeli
    się zaczyna to łatwo też nie jest.
    Jutro dodam dokłądne dane o jaki generator mi chodzi i ile zrobiłem i co poprawić.
  • #4 3505670
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    wystarczy że będziesz podawał na wyprowadzenie na przemian 0 i 1 z odpowiednią częstotliwością
  • #5 3507496
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    To ma być coś takiego jak na rysunku.

    Jeżeli na porcie P3.7 jest 0 to generowana jest częstotliwość
    f - 0,25Hz
    Jeżeli na porcie P3.7 jest 1 to generowane jest T1 - 1s i T2 - 2s

    Na porcie P0.7 jest generowany sygnał.
    Załączniki:
    • Jak napisać generator przebiegu prostokątnego w assemblerze c51? generator.jpg (10 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 3507589
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    To jest mój program.
    Ale na pewno jest do poprawki.
    Może ktoś mi pomóc.
    Szczególnie gdy impulsy mają trwać około 2-4 sekund.


    start:
    JNB P3.7 ; f
    JB P3.7 ; T1T2
    SJMP $

    jeden;
    SETB P0.7
    ret

    zero:
    CLR P0.7
    ret

    f:
    acall jeden
    acall t
    acall zero
    acall t
    ret

    T1T2:
    acall jeden
    acall f2
    acall zero
    acall f3
    ret

    t:
    mov R2#250
    mov R1#250
    DJNZ $
    DJNZ R2, loop
    ret

    f2:
    mov R2#250
    mov R1#250
    DJNZ $
    DJNZ R2, loop
    ret

    f3:
    mov R2#250
    mov R1#250
    DJNZ $
    DJNZ R2, loop
    ret
  • #7 3515288
    Songo
    Poziom 13  
    Posty: 37
    Pomógł: 4
    Ocena: 1
    Witam,

    Co programu to albo czegos nie widze albo 'popełniłeś' troche prostych bledow - probowales to kompilowac ?

    I może tak dla jasności ten program ma na bieżąco sprawdzac stan P3.7 czy ma sprawdzac jednorazowo i dalej nie robic nic ? (bo z zamieszczonego kodu wynika mi ta druga opcja) Nie mniej jednak:

    1. czym jest etykieta 'loop' ? (albo dokad miala prowadzic - bo aktualnie to nawet nie jest zdefiniowana).
    2. do odmierzania czasu może jednak warto zainteresowac się Timer'em ? (TH0 TL0 TMOD)
    3. Zupelnie niepotrzebnie zdefiniowane funkcje t, f2, f3 bo robią dokladnie to samo, wystarczy je odpowiednio wywołać po prostu.
    4. Jak tylko znajde wiecej wolnego czasu podeśle jakiś kodzik.
    5. napisz jaki uP konkretnie.

    na koniec - assemblera nie musisz koniecznie uzywać mozesz użyć języka wyższego poziomu - np. C.

    pozdrawiam
    --
    Maciek
  • #8 3516239
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    Witam ponownie!

    Posiedziałem trochę nad tym programem i teraz pokazuję wersję po zmianach.
    Nie kompilowałem tego progamu.

    oto program po zmianach:

    start:
    JNB P3.7 ; f
    JB P3.7 ; czas
    SJMP start

    f:
    acall jeden
    acall tcztery
    acall zero
    acall tcztery
    ret

    tcztery:
    loop: mov R0,#125
    mov R1,#100
    mov R2,#10
    DJNZ R0,$
    DJNZ R1,$
    DJNZ R2,$ loop
    ret

    czas:
    acall jeden
    acall t1
    acall zero
    acall t2
    ret

    t1:
    loop: mov R0,#250
    mov R1,#200
    mov R2,#10
    DJNZ R0,$
    DJNZ R1,$
    DJNZ R2,$ loop
    ret

    t2:
    loop: mov R0,#250
    mov R1,#100
    mov R2,#10
    DJNZ R0,$
    DJNZ R1,$
    DJNZ R2,$ loop
    ret

    jeden:
    SETB P0.7
    ret

    zero:
    CLR P0.7
    ret


    Może ktoś podpowiedzieć czym najłatwiej zasymulaować pracę programu?
    Dodam że program ma działać na 8051.
    Próbowałem na KEILu ale coś mi nie wychodzi.
  • #9 3518744
    Songo
    Poziom 13  
    Posty: 37
    Pomógł: 4
    Ocena: 1
    Niestety czasu nadal nie mam zeby odpowiedziec dokladnie (moze jutro się cos znajdzie :) ),

    Co do 'zasymulowania' to Keil jest bardzo dobry ew. (juz nie pamietam ktory mnie bardziej odpowiadał, bo ostatnio ich nie uzywalem) jest jeszcze Raisonance (http://www.raisonance.com/ ) i oba są dosc fajnymi srodowiskami zarówno do pisania jak i testowania kodu. W szczególności, że mozna tam pisac w C a nie tylko w asemblerze. Obsluga jest dosc intuicyjna - musisz ustawic parametry projektu wybrac modelowany uP (sa rozne 51 dostepne - standardowe, atmela itp.) i okreslic pare innych szczegolow. ( nie mam Keil'a pod reka, dlatego taki krotki opis)

    Dlaczego jednak piszesz ze nie kompilowałeś kodu ? Kompiluj bo zgadując niewiele wymyślisz, a narazie wnioskuje ze nawet nie wiesz czy to może działać tylko 'spodziewasz' sie ze cos moze byc nie tak.

    co do kodu to jednak lepiej byłoby wykorzystac Timer (napisze moze jutro), ale w tej wersji co jest teraz (chodzi o to żeby jednak nie mnożyć funkcji ktore robią to samo tylko są inaczej parametryzowane):

    
    
         PUSH 100 ; tu oczywiście wartosc opoznienia
         CALL opoznienie
    
    [... reszta kodu ...]
    opoznienie:
         MOV R0,#250
         MOV R1, SP
         MOV R2,#10
         DJNZ R0,$
         DJNZ R1,$
         DJNZ R2,opoznienie
         RET
    


    Natomiast początek programu, akurat nie zadziała zgodnie z oczekiwaniami ( chyba że stan na P3.7 może być sprawdzany co 4 sek.)

    
    start:
        JNB P3.7, f
        JB P3.7, czas
        JMP start
    


    stan może się zmienić bowiem w trakcie jak Ty będziesz mozolnie generował przez 4 sek. sygnał na P0.7, dlatego pasuje wykorzystać przerwania i Timer.
    (tu od razu uwaga, w kodzie mozna uzywac instrukcji CALL oraz JMP nie musisz się interesować czy akurat potrzebna tam jest SJMP czy LCALL - assembler sam to roztrzygnie.)

    --
    Maciek
  • #10 3603490
    wojciech.nurzynski
    Poziom 15  
    Posty: 225
    Pomógł: 4
    Ocena: 73
    Witam!

    Zmieniła się koncepcja. Teraz program ma być bardziej skomplikowany.
    (wymysł profesora).
    Teraz generator ma pracować tak.
    Gdy na P3.0 jest zero to:
    na P0.0 generowany ma być przebieg prostokątny powtarzający się.
    Gdy na P3.0 jest jeden to:
    na P0.0 jest generowany sygnał o innej częstotliwości, powtarzany
    a na P0.1 pojedynczy impuls.


    
    start:
    jnb p3.0, program1
    jb p3.0, program2
    sjmp start
    
    program1:
     setb 0.0
     acall opoznienie1
     clr 0.0
     acall opoznienie2
     sjmp program1
     
    opoznienie1:
     mov r3#4
     loop2: mov r2#250
     loop1: mov r1#250
     djnz r1, $
     djnz r2, loop1
     djnz r3, loop2
    ret 
    
    opoznienie2:
     mov r3#12
     loop4: mov r2#250
     loop3: mov r1#250
     djnz r1, $
     djnz r2, loop3
     djnz r3, loop4
    ret
    
    program2:
     clr p0.0
     acall opoznienie3
     setb p0.1
     acall opoznienie4
     setb p0.0
     acall opoznienie5
     clr p0.1
     acall opoznienie6
    sjmp program2
    
    opoznienie3:
     mov r3#4
     loop6: mov r2#250
     loop5: mov r1#250
     djnz r1, $
     djnz r2, loop5
     djnz r3, loop6
    ret
    
    opoznienie4:
     mov r3#4
     loop8: mov r2#250
     loop7: mov r1#250
     djnz r1, $
     djnz r2, loop7
     djnz r3, loop8
    ret
    
    opoznienie5:
     mov r3#4
     loopA: mov r2#250
     loop9: mov r1#250
     djnz r1, $
     djnz r2, loop9
     djnz r3, loopA
    ret
    
    opoznienie6:
     mov r3#4
     loopC: mov r2#250
     loopB: mov r1#250
     djnz r1, $
     djnz r2, loopB
     djnz r3, loopC
    ret 
     end
    
    
    
    
    



    Problem w tym, że nie wiem jak wygenerować pojedynczy impuls na P0.1
    Jak widać po programie impuls się powtarza a nie powinien.
  • #11 3614478
    Songo
    Poziom 13  
    Posty: 37
    Pomógł: 4
    Ocena: 1
    witam,

    np. tak:

    
    program2:
     setb p0.1
     // jakies opoznienie ? 
     clr p0.1
    gen:
     clr p0.0
     acall opoznienie3
     acall opoznienie4
     setb p0.0
     acall opoznienie5
     acall opoznienie6
    sjmp gen
    


    ale to nie zmienia faktu ze program jest *źle napisany* - dlaczego nie zainteresowales sie Timerami i przerwaniami ? Czy program naprawde ma być tak 'sztuczny' i po sprawdzeniu stanu p3.0 zaraz po uruchomieniu nigdy więcej juz tego stanu nie sprawdzi ? ...

    --
    Maciek

Podsumowanie tematu

✨ Dyskusja dotyczy pisania generatora przebiegu prostokątnego w asemblerze dla mikrokontrolera 8051 (C51). Autor prosi o przykładowe programy i pomoc w implementacji. W odpowiedziach podkreślono, że program nie jest skomplikowany, ale wymaga samodzielnej inicjatywy oraz sugerowano wykorzystanie timerów i przerwań zamiast opóźnień realizowanych pętlami. Przedstawiono przykładowe fragmenty kodu asemblerowego, które generują sygnał prostokątny na wyjściu P0.7 w zależności od stanu portu P3.7, z różnymi czasami trwania impulsów (np. 0,25 Hz lub 1s i 2s). Autor modyfikował kod, stosując pętle opóźniające, ale miał problemy z symulacją w środowisku Keil. W dalszej części zmieniono koncepcję generatora, aby na P0.0 i P0.1 generować sygnały o różnych częstotliwościach i impulsach w zależności od stanu P3.0. Wskazano, że program jest źle napisany, gdyż nie wykorzystuje timerów i przerwań, a jedynie sprawdza stan portu raz na początku. Rekomendowano użycie środowisk Keil i Raisonance do symulacji i testowania kodu, z możliwością programowania w C lub asemblerze.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA