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

Awatar użytkownika
Woycek
-
-
Posty: 62
Rejestracja: 30 sty 2005, o 09:51
Lokalizacja: Ostrów Wielkopolski
Kontaktowanie:

Program na 8051 - generator PWM

Postautor: Woycek » 30 sty 2005, o 09:59

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!!!!
Ostatnio zmieniony 27 mar 2007, o 14:09 przez Woycek, łącznie zmieniany 3 razy.

LucASWw
-
-
Posty: 248
Rejestracja: 23 sie 2003, o 18:26
Lokalizacja: UK

Postautor: LucASWw » 30 sty 2005, o 17:36

Najlepiej wykorzystaj AVR. Jego Timery potrafią pracować w trybie PWM. W 8051 nie da się w łatwy sposób emulować PWM. Przykłady jak korzystać z PWM w AVR znajdziesz w notach aplikacyjnych. Są tam przykładowe programy napisane w assemblerze i w C.

Awatar użytkownika
Woycek
-
-
Posty: 62
Rejestracja: 30 sty 2005, o 09:51
Lokalizacja: Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 8 lut 2005, o 11:06

Myślałem że to forum "starych wyjadaczy",którzy z problemem tego typu poradzą sobie w 3 sekundy........? Zaś pomyłka..NA DRUTACH ROBÓTKI RECZNE DZIEWCZYNY RÓBCIE A NIE MARNUJCIE CZASU NA BZDETNE POSTY NA FORUM..
Pozdrawiam.
P.S. :569: Tylko mi się nie obrażać

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 8 lut 2005, o 11:17

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

niuniek
-
-
Posty: 21
Rejestracja: 17 kwie 2003, o 15:14
Lokalizacja: Kraków

Postautor: niuniek » 8 lut 2005, o 11:59

Ależ gawel, przecież Woycek napisał że potrzebuje taki program,
a ta nauka to tylko taki kit, żeby nam było przyjemniej "że ktoś może czegoś się nauczy"?
gawel - POPIERAM!!!

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 8 lut 2005, o 12:06

Zobaczymy, co napisze traz Woycek (może nic -> nie załapie się na cudzą pracę).

Awatar użytkownika
tasza
-
-
Posty: 456
Rejestracja: 17 sty 2005, o 10:52

Postautor: tasza » 8 lut 2005, o 14:04

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

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 8 lut 2005, o 15:53

No widziesz Woycek, kobiety mają miękkie serce. To należy się jej bukiet kwiatów .....

Awatar użytkownika
Woycek
-
-
Posty: 62
Rejestracja: 30 sty 2005, o 09:51
Lokalizacja: Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 9 lut 2005, o 13:56

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Ć"

Awatar użytkownika
Wojtek
-
-
Posty: 867
Rejestracja: 21 lut 2003, o 18:21

Postautor: Wojtek » 9 lut 2005, o 16:45

Wiesz Woycek powiadają, że czasami lepiej wyjść na mruka niż na .... - jeśli rozumiesz co mam na myśli (tylko bez obrazy proszę :) )

Awatar użytkownika
Woycek
-
-
Posty: 62
Rejestracja: 30 sty 2005, o 09:51
Lokalizacja: Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 10 lut 2005, o 10:33

Witam!!!!
Walczę sobie powolutu..i mam pierwsze małe pytanko.
time equ 65500d
mov r1,#HIGH(time)- załaduje górną połówkę time do r1
mov r1,#HIGH(-time)-załaduje do r1 ???????????????????
Gdyby ktoś zechcial pomóc.......

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 10 lut 2005, o 15:14

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.

Awatar użytkownika
Woycek
-
-
Posty: 62
Rejestracja: 30 sty 2005, o 09:51
Lokalizacja: Ostrów Wielkopolski
Kontaktowanie:

Postautor: Woycek » 14 lut 2005, o 22:52

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.

Wróć do „8051”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 84 gości