Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Gost
|
Objavljeno: Pon Feb 16, 2004 1:31 pm Naslov sporočila: RC5 in AT89C2051 |
|
|
Zanima me kako generirati rc5 kodo z mokrokontrolerjem AT98c2051
Največji problem mi predstavlja generiranje 36kHz inpulze z 25% duty cycle |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Pon Feb 16, 2004 7:21 pm Naslov sporočila: RC5 tx |
|
|
LP!
V prilogi pošiljam en primer ki je sicer narejen za Bascom AVR.Upam da bo tole pomagalo pri implementaciji za 2051.
Pozdrav
Vlado |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Tor Feb 17, 2004 4:22 pm Naslov sporočila: |
|
|
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Timer1 = 0
Compare1a = T_oc1
To naj bi bila konfiguracija tajmerja1 za AVR kaj pa za 2051 to me muči
In sicer kaj dela z Compare1a = T_oc1 nalozi se vrednost ki je določena z t_oc1 samo s čim primerja a z vrednostjo nekega internega švevca tajmerja1 |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Tor Feb 17, 2004 9:54 pm Naslov sporočila: RC5 |
|
|
Pozdravljen!
Kako deluje timer pri AVR-ih ,predolga tema za forum.Kar pa zadeva timerja za družino 8051 imaš lepo napisano v Helpu.
Gospod Vilko je v enem svojem programu lepo komentiral Timer:
' Če je frekvenca krislata f je timerenota 12/f
' vrednost load je vrednost med 1 in 255 s katero polnimo števec
' z load ukazom
' Do prekinitve pride po
' 1 timerenota krat vrednost load pri mode 2
' 32 timerenot krat vrednost load pri mode 0
' 256 timerenot krat vrednost load pri mode 1
Menim da bo tole v pomoč.
Ti Rabiš frekvenco 36KHz to se pravi ena perioda je 1/f in dobiš 27,7777usec.Najbližja vrednost ti je 28usec,vsakih 14uSec spremeniš stanje na pinu in imaš frekvencu 35714Hz.
Vlado
P.S.
AVR ima že ukaz "SENDRC5",in ce ni pomembno lahko ta oddajnik narediš z 90S2313 ki je pin kompatibilen z 2051 razen reseta. |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Sre Feb 18, 2004 4:31 pm Naslov sporočila: |
|
|
Ja je pomembno s katerin uC delam ker mam 2051 na zalogi z AVR-ji pa še nisem delov tko da o njih ne vem veliko oz skoraj nič vsaka pomoč je dobrodošla če se ti kje kakšna stvar zatakne |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Feb 18, 2004 7:18 pm Naslov sporočila: RC5 |
|
|
Upam da bo tisto o TIMER-ju za serio 8051 pomagalo pri realizaciji projekta.
Vlado |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Čet Feb 19, 2004 11:17 am Naslov sporočila: problem z timer0 |
|
|
sem napisal program ki sledi
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Prekinitev
Load Timer0 , 2
Enable Interrupts
Enable Timer0
Priority Set Timer0
Start Timer0
Prekinitev:
P1.0 = Not P1.0
Return
ki naj bi na izhodu spremenil stanje ko pide prekinitev in s tem generirira frekvenco 250kHz pa jo ne generira mi frekvenco 7.8kHz kaj je narobe pa sem spreminil Load Timer0 , od 1 pa do 255 frekvenc na izhodu se je samo manšala od 7.8kHz proti nekaj Hz |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Feb 19, 2004 11:25 am Naslov sporočila: |
|
|
Za ukazom start timer moraš kočati glavni program ali ga poslati v neko zanko. tako pa glavni program 'zaide' v prekinitveno rutino se z return zazanka
poleg tega moraš v prekinitveni rutino ponovno napolniti timer.
poizkusi tako:
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Prekinitev
Load Timer0 , 2
Enable Interrupts
Enable Timer0
Priority Set Timer0
Start Timer0
end
Prekinitev:
load timer0, 2
P1.0 = Not P1.0
Return
vilko |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Feb 19, 2004 11:28 am Naslov sporočila: Hm, še nekaj |
|
|
Pri Mode = 2, je load timer0 2 zeeloo malo, in bodo same instrukcije, ki jih ima timer rutina prekoračile željeno vrednost, porabile ves čas,
saj res, menda pri mode=2 ni potrebno relodati timer, bi moral preveriti, pri nekaterih načinih (modih) to naredi sam mikroprocesor.
Vilko |
|
Nazaj na vrh |
|
|
mtome Profesionalec
Pridružen/-a: Pon Jan 2004 14:29 Prispevkov: 168 Kraj: ljubljana
|
Objavljeno: Čet Feb 19, 2004 11:30 am Naslov sporočila: |
|
|
Kaj je to rc5 koda? _________________ l.p. Matjaz |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Feb 19, 2004 11:31 am Naslov sporočila: In še to |
|
|
Vsaka prekinitvena rutina ima cca 20 push instrukcij, ki vsaka vzame nekaj časa, in na koncu spet 20 pop instrukcij, da spet vrne registre v staro stanje.
Če tega nočeš in ne rabiš, kot v tem testu, uporabi pri derinicij rutine parameter NOSAVE |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Čet Feb 19, 2004 7:22 pm Naslov sporočila: |
|
|
Očitno bo treba iti kar na AVR procesor bom pa poskušal še naprej napisati pogram za 89C2051. Korajža velja bom pa poskusiu še to z NOSAVE. Program je mi že bere tipkovnico Adresso določim decimalno kodo tipke pa določim kar z prebrano tipko npr Keypres=13 deounce...
nato pa je treba vse to nekako spraviti na izhodni port in sicer če je logična 1 potem moram na portu izpisati 01 če pa je logična 0 potem pa je potrebno na port poslati 10 |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Pet Feb 20, 2004 8:43 pm Naslov sporočila: |
|
|
V baskom-u sem napisal nasledno kodo ki jo naj bi boila pravilna sodeč po helpu za assembler v baskomu zakaj mi to ne dela tam piše da je treba pred asm label dati klicaj pa to ne dela zakaj!!!????
MOV R0 , #2
!Sk3: Mov R1 , #50
!sk2: Mov R2 , #50
!sk1: Djnz R2 , Sk1
DJNZ R1 , SK2
DJNZ R0 , SK3
RET |
|
Nazaj na vrh |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Sob Feb 21, 2004 6:01 am Naslov sporočila: |
|
|
Nisem strokovnjak za assembler 8051, tako da ne vem kaj delaš, a bom vseeno ugibal, kaj bi lahko bilo narobe. Kadar gre kaj narobe, je vedno možnih veliko razlogov, in če gra kaj prav, potem si nekaj spregledal, pravi gospod Murphy v svojih zakonih logike.
Torej najprej ugibam, da gre za podprogram prekinitve, pa četudi ne,
v podprogramu uporabljaš registre, ki jih je verjetno uporabljal tudi glavni program, predno je klical tvoj podprogram. Ko rečeš Return se vrneš v glavni program z ničlami v registrih, v katerih je glavni program morda imel drugo vsebino.
Poizkusi z
push r0
push r1
push r2
MOV R0 , #2
!Sk3: Mov R1 , #50
!sk2: Mov R2 , #50
!sk1: Djnz R2 , Sk1
DJNZ R1 , SK2
DJNZ R0 , SK3
pop r2
pop r1
pop r0
RET
Kot rečeno, ugibam, in morda sem napisal neumnost, naj še kak assembleraš reče svoje mnenje.
Vilko |
|
Nazaj na vrh |
|
|
Peter Začetnik
Pridružen/-a: Pon Feb 2004 13:34 Prispevkov: 16
|
Objavljeno: Ned Feb 22, 2004 10:07 am Naslov sporočila: |
|
|
Hvala vilko za pomoč, sem pa že sam ugotovil kako rešiti vso stvar. Ugotovil sem da so te asemblerske labele lahko velik problem. Pa vsem ki se bodo kdaj v baskomu poslužili asemblerja vam povem da naj uporabljajo raje namesto label nasledne
Zakas:
MOV R0 , #1
MOV R1 , #1
DJNZ R1,*-0
djnz r0,*-4
*-4,*-0 pomeni da skočimo 4(0) lokacije v PC-ju nazaj (program counter)
lahko pa skačemo tudi naprej in sicer *+2(*+10) kar pomeni 2 lokaciji v pc ju naprej |
|
Nazaj na vrh |
|
|
|