Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięProgram na 8051 - generator PWM
Moderatorzy:Jacek Bogusz, procesorowiec, robertw, tomasz_jablonski, r-mik, Moderatorzy
Witam serdecznie fachowców i bardzo proszę o pomoc!!!
Potrzebuję programik napisany w asemblerze na procek 8051, który będzie generował przebieg o stałej częstotliwości(około50-60Hz) i zmiennym wypełnieniu
(10-90%).Wypełnienie przebiegu powinno zmieniać się skokowo co 10% po nacisnieciu jednego z dwóch klawiszy podłączonych do dowolnych wyjść procka(oczywiście jeden klawisz UP a drugi DOWN).
Zaczynam zabawę w programowanie i dzięki waszej pomocy będzie mi łatwiej.
Dzięki z góry!!!!
Potrzebuję programik napisany w asemblerze na procek 8051, który będzie generował przebieg o stałej częstotliwości(około50-60Hz) i zmiennym wypełnieniu
(10-90%).Wypełnienie przebiegu powinno zmieniać się skokowo co 10% po nacisnieciu jednego z dwóch klawiszy podłączonych do dowolnych wyjść procka(oczywiście jeden klawisz UP a drugi DOWN).
Zaczynam zabawę w programowanie i dzięki waszej pomocy będzie mi łatwiej.
Dzięki z góry!!!!
Ostatnio zmieniony 27 mar 2007, o 14:09 przez Woycek, łącznie zmieniany 3 razy.
Woycek, jak sam napisałeś, ty dopiero się uczysz, więc twoje pytanie powinno brzmieć inaczej. Możesz zapytać, czy jak zrobnię to a to, czy uzyskam to a to lub dlaczego coś tam. A ty oczekujesz czego, że ktoś ci napisze gotowy program? Chcesz się nauczyć, to spróbuj sam inaczej ci nie wyjdzie (Per aspera ad astra).
w ramach robótek ręcznych...
stąd:
http://www.sec.upm.es/docencia/plan_00/ ... c_ise.html
to:
http://www.sec.upm.es/docencia/plan_00/ ... /an010.pdf
a) usunąć przetwornik
b) dodać guziki
c) przeskalować
d) 3 sekundy
tasza
ps.
a miałam się nie odzywać...
stąd:
http://www.sec.upm.es/docencia/plan_00/ ... c_ise.html
to:
http://www.sec.upm.es/docencia/plan_00/ ... /an010.pdf
a) usunąć przetwornik
b) dodać guziki
c) przeskalować
d) 3 sekundy
tasza
ps.
a miałam się nie odzywać...
DZIĘKI WSZYSTKIM ZA ODZEW!!!!
KIJ W MROWISKO WSADZONY.....A PROSIŁEM "TYLKO MI SIĘ NIE OBRAŻAĆ".
PEWNIE ŻE NIE CHCĘ ABY KTOŚ PISAŁ ZA MNIE PROGRAMY(BO NIE TĘDY DROGA),ALE SORRKI ODPOWIEDŹ TYPU "WEŹ AVR-a BO 51 TO NIE BARDZO".....NO KOMENTS.
OCZYWIŚCIE JAK JUŻ ZWALCZĘ PROBLEM TO NIE OMIESZKAM SIĘ POCHWALIĆ.
JESZCZE RAZ DZIĘKUJĘ ZA ODZEW......SZKODA ŻE TRZEBA BYŁO WAS Z LEKKA "PORUSZYĆ"
KIJ W MROWISKO WSADZONY.....A PROSIŁEM "TYLKO MI SIĘ NIE OBRAŻAĆ".
PEWNIE ŻE NIE CHCĘ ABY KTOŚ PISAŁ ZA MNIE PROGRAMY(BO NIE TĘDY DROGA),ALE SORRKI ODPOWIEDŹ TYPU "WEŹ AVR-a BO 51 TO NIE BARDZO".....NO KOMENTS.
OCZYWIŚCIE JAK JUŻ ZWALCZĘ PROBLEM TO NIE OMIESZKAM SIĘ POCHWALIĆ.
JESZCZE RAZ DZIĘKUJĘ ZA ODZEW......SZKODA ŻE TRZEBA BYŁO WAS Z LEKKA "PORUSZYĆ"
Twoja stała time equ 65500 dec wynosi FFDC hex, więc
mov r1,#HIGH(time) jest to samo co:
mov r1,#FF hex
-time w tym wypadku FF0024 hex więc jak widać jest liczbą 3-bajtową, więc taki zapis trochę nie ma sensu.
Być może chodzi o znaczek ~, który oznacza negacę bitową argumentu, czyli:
~65500 = ~ FFDC hex = 0023 hex
Wykonaj kompilację i sam sprawdz w raporcie z kompilacji co zrobił kompilator.
mov r1,#HIGH(time) jest to samo co:
mov r1,#FF hex
-time w tym wypadku FF0024 hex więc jak widać jest liczbą 3-bajtową, więc taki zapis trochę nie ma sensu.
Być może chodzi o znaczek ~, który oznacza negacę bitową argumentu, czyli:
~65500 = ~ FFDC hex = 0023 hex
Wykonaj kompilację i sam sprawdz w raporcie z kompilacji co zrobił kompilator.
Troszkę to trwało ale poskładałem kawłek płytki z prockiem i .....
time equ 0300h
mov r1,#high(time) - ładuje do rejestru liczbę 3(czyli wykonuje 3 razy inc r1 zaczynając od wartości 00 w r1
mov r1,#high(-time) -.........(wykonuje 3 razy dec r1 zaczynając od wartości 00 w r1)
Nie potrafię fachowo tego nazwać...ale tak się właśnie dzieje i dzięki pomocy TASZY i tych rozkazów generuję sobie "PWM" na C51.Jeszcze tylko klawisze i po bólu.
Pozdrawiam...
Witam...
Pewnie nie jest to poziom programowania jakim szczycą się "tutejsi fachowcy" ale...
org 00h
jmp MAIN
;
;-----------------------------------------------------------------------
;
;ISR Vectors
org 0Bh
jmp TIMER0_ISR
;-----------------------------------------------------------------------
;CONSTANTS
PERIOD1 EQU 64028d ;10%
PERIOD2 EQU 62521d ;20%
PERIOD3 EQU 61014d ;30%
PERIOD4 EQU 59507d ;40%
PERIOD5 EQU 58000d ;50%
PERIOD6 EQU 56493d ;60%
PERIOD7 EQU 54986d ;70%
PERIOD8 EQU 53479d ;80%
PERIOD9 EQU 51972d ;90%
;R1-TL0 stanu HI,R2-TH0 stanu HI,R3-TL0 stanu LO,R4-TH0 stanu LO
;pulse_HI EQU 58000d ; Value to load into TIMER0 which adjusts pulse width
;pulse_LO EQU 58000d ; (duty cycle)in PWM. Set from 19-65522d.
PWMOUT BIT P1.1 ; for 58000d f=61.05Hz and P=50%
LK BIT P1.2
L7 BIT P1.3
L5 BIT P1.4
;MEM0 EQU 08h
;MEM1 EQU 09h
;MEM2 EQU 0Ah
;MEM3 EQU 0Bh
;MEM4 EQU 0Ch
;-Start of MAIN code----------------------------------------------------
org 0B3h
MAIN:
mov TMOD,#01h ; Set TIMER0 in 16-bit counter mode
mov r0,#00h ; ZEROING R0
setb ET0 ; Enable timer0 interrupts
setb EA ; Global interrupt enable
start:
cjne r0,#0,st0 ; PWMOUT SLEEP(WHEN R0=0)
clr tr0 ; stop timer 0
sjmp st1
st0:
setb tr0
st1:
clr lk ;uaktywnienie klawiatury
setb l7
setb l5
jnb l7,pr7
jnb l5,pr5
setb lk
sjmp start
PR7: jnb l7,pr7
CJNE R0,#9,DALEJ
LCALL ZMIANA0
DALEJ:
INC R0
LCALL ZMIANA0
PR5: jnb l5,pr5
CJNE R0,#0,DALEJ1
LCALL ZMIANA0
DALEJ1:
DEC R0
ZMIANA0:
CJNE R0,#9,NIE9
MOV R1,#LOW(PERIOD1)
MOV R2,#HIGH(PERIOD1)
MOV R3,#LOW(PERIOD9)
MOV R4,#HIGH(PERIOD9)
LJMP START
NIE9:
CJNE R0,#8,NIE8
MOV R1,#LOW(PERIOD2)
MOV R2,#HIGH(PERIOD2)
MOV R3,#LOW(PERIOD8)
MOV R4,#HIGH(PERIOD8)
LJMP START
NIE8:
CJNE R0,#7,NIE7
MOV R1,#LOW(PERIOD3)
MOV R2,#HIGH(PERIOD3)
MOV R3,#LOW(PERIOD7)
MOV R4,#HIGH(PERIOD7)
LJMP START
NIE7:
CJNE R0,#6,NIE6
MOV R1,#LOW(PERIOD4)
MOV R2,#HIGH(PERIOD4)
MOV R3,#LOW(PERIOD6)
MOV R4,#HIGH(PERIOD6)
LJMP START
NIE6:
CJNE R0,#5,NIE5
MOV R1,#LOW(PERIOD5)
MOV R2,#HIGH(PERIOD5)
MOV R3,#LOW(PERIOD5)
MOV R4,#HIGH(PERIOD5)
LJMP START
NIE5:
CJNE R0,#4,NIE4
MOV R1,#LOW(PERIOD6)
MOV R2,#HIGH(PERIOD6)
MOV R3,#LOW(PERIOD4)
MOV R4,#HIGH(PERIOD4)
LJMP START
NIE4:
CJNE R0,#3,NIE3
MOV R1,#LOW(PERIOD7)
MOV R2,#HIGH(PERIOD7)
MOV R3,#LOW(PERIOD3)
MOV R4,#HIGH(PERIOD3)
LJMP START
NIE3:
CJNE R0,#2,NIE2
MOV R1,#LOW(PERIOD8)
MOV R2,#HIGH(PERIOD8)
MOV R3,#LOW(PERIOD2)
MOV R4,#HIGH(PERIOD2)
LJMP START
NIE2:
CJNE R0,#1,NIE1
MOV R1,#LOW(PERIOD9)
MOV R2,#HIGH(PERIOD9)
MOV R3,#LOW(PERIOD1)
MOV R4,#HIGH(PERIOD1)
NIE1:
LJMP START
;------TIMER0 ISR----------------------------------------------------------
TIMER0_ISR:
jbc PWMOUT,LO ; Test to see if low/high in waveform
setb PWMOUT ; Transition low to high
clr TR0 ; Stop Timer 0 during reload
mov TL0,R1 ; Set length of pulse l
mov TH0,R2 ;
setb TR0 ; Restart Timer 0
jmp RETURN
LO:
clr TR0 ; Stop Timer 0 for reload
mov TL0,R3 ; Set low time of duty cycle
mov TH0,R4
setb TR0 ; Restart Timer 0
RETURN:
reti
END
Naskorbałem przy pomocy wskazówki jaką dała mi Tasza. Jak ktoś zechciałby coś ulepszyć czy poprawić byłoby miło......
Pozdro Wojtek.S.
time equ 0300h
mov r1,#high(time) - ładuje do rejestru liczbę 3(czyli wykonuje 3 razy inc r1 zaczynając od wartości 00 w r1
mov r1,#high(-time) -.........(wykonuje 3 razy dec r1 zaczynając od wartości 00 w r1)
Nie potrafię fachowo tego nazwać...ale tak się właśnie dzieje i dzięki pomocy TASZY i tych rozkazów generuję sobie "PWM" na C51.Jeszcze tylko klawisze i po bólu.
Pozdrawiam...
Witam...
Pewnie nie jest to poziom programowania jakim szczycą się "tutejsi fachowcy" ale...
org 00h
jmp MAIN
;
;-----------------------------------------------------------------------
;
;ISR Vectors
org 0Bh
jmp TIMER0_ISR
;-----------------------------------------------------------------------
;CONSTANTS
PERIOD1 EQU 64028d ;10%
PERIOD2 EQU 62521d ;20%
PERIOD3 EQU 61014d ;30%
PERIOD4 EQU 59507d ;40%
PERIOD5 EQU 58000d ;50%
PERIOD6 EQU 56493d ;60%
PERIOD7 EQU 54986d ;70%
PERIOD8 EQU 53479d ;80%
PERIOD9 EQU 51972d ;90%
;R1-TL0 stanu HI,R2-TH0 stanu HI,R3-TL0 stanu LO,R4-TH0 stanu LO
;pulse_HI EQU 58000d ; Value to load into TIMER0 which adjusts pulse width
;pulse_LO EQU 58000d ; (duty cycle)in PWM. Set from 19-65522d.
PWMOUT BIT P1.1 ; for 58000d f=61.05Hz and P=50%
LK BIT P1.2
L7 BIT P1.3
L5 BIT P1.4
;MEM0 EQU 08h
;MEM1 EQU 09h
;MEM2 EQU 0Ah
;MEM3 EQU 0Bh
;MEM4 EQU 0Ch
;-Start of MAIN code----------------------------------------------------
org 0B3h
MAIN:
mov TMOD,#01h ; Set TIMER0 in 16-bit counter mode
mov r0,#00h ; ZEROING R0
setb ET0 ; Enable timer0 interrupts
setb EA ; Global interrupt enable
start:
cjne r0,#0,st0 ; PWMOUT SLEEP(WHEN R0=0)
clr tr0 ; stop timer 0
sjmp st1
st0:
setb tr0
st1:
clr lk ;uaktywnienie klawiatury
setb l7
setb l5
jnb l7,pr7
jnb l5,pr5
setb lk
sjmp start
PR7: jnb l7,pr7
CJNE R0,#9,DALEJ
LCALL ZMIANA0
DALEJ:
INC R0
LCALL ZMIANA0
PR5: jnb l5,pr5
CJNE R0,#0,DALEJ1
LCALL ZMIANA0
DALEJ1:
DEC R0
ZMIANA0:
CJNE R0,#9,NIE9
MOV R1,#LOW(PERIOD1)
MOV R2,#HIGH(PERIOD1)
MOV R3,#LOW(PERIOD9)
MOV R4,#HIGH(PERIOD9)
LJMP START
NIE9:
CJNE R0,#8,NIE8
MOV R1,#LOW(PERIOD2)
MOV R2,#HIGH(PERIOD2)
MOV R3,#LOW(PERIOD8)
MOV R4,#HIGH(PERIOD8)
LJMP START
NIE8:
CJNE R0,#7,NIE7
MOV R1,#LOW(PERIOD3)
MOV R2,#HIGH(PERIOD3)
MOV R3,#LOW(PERIOD7)
MOV R4,#HIGH(PERIOD7)
LJMP START
NIE7:
CJNE R0,#6,NIE6
MOV R1,#LOW(PERIOD4)
MOV R2,#HIGH(PERIOD4)
MOV R3,#LOW(PERIOD6)
MOV R4,#HIGH(PERIOD6)
LJMP START
NIE6:
CJNE R0,#5,NIE5
MOV R1,#LOW(PERIOD5)
MOV R2,#HIGH(PERIOD5)
MOV R3,#LOW(PERIOD5)
MOV R4,#HIGH(PERIOD5)
LJMP START
NIE5:
CJNE R0,#4,NIE4
MOV R1,#LOW(PERIOD6)
MOV R2,#HIGH(PERIOD6)
MOV R3,#LOW(PERIOD4)
MOV R4,#HIGH(PERIOD4)
LJMP START
NIE4:
CJNE R0,#3,NIE3
MOV R1,#LOW(PERIOD7)
MOV R2,#HIGH(PERIOD7)
MOV R3,#LOW(PERIOD3)
MOV R4,#HIGH(PERIOD3)
LJMP START
NIE3:
CJNE R0,#2,NIE2
MOV R1,#LOW(PERIOD8)
MOV R2,#HIGH(PERIOD8)
MOV R3,#LOW(PERIOD2)
MOV R4,#HIGH(PERIOD2)
LJMP START
NIE2:
CJNE R0,#1,NIE1
MOV R1,#LOW(PERIOD9)
MOV R2,#HIGH(PERIOD9)
MOV R3,#LOW(PERIOD1)
MOV R4,#HIGH(PERIOD1)
NIE1:
LJMP START
;------TIMER0 ISR----------------------------------------------------------
TIMER0_ISR:
jbc PWMOUT,LO ; Test to see if low/high in waveform
setb PWMOUT ; Transition low to high
clr TR0 ; Stop Timer 0 during reload
mov TL0,R1 ; Set length of pulse l
mov TH0,R2 ;
setb TR0 ; Restart Timer 0
jmp RETURN
LO:
clr TR0 ; Stop Timer 0 for reload
mov TL0,R3 ; Set low time of duty cycle
mov TH0,R4
setb TR0 ; Restart Timer 0
RETURN:
reti
END
Naskorbałem przy pomocy wskazówki jaką dała mi Tasza. Jak ktoś zechciałby coś ulepszyć czy poprawić byłoby miło......
Pozdro Wojtek.S.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości