Prvo proveri u uputstvu za C koji koristiš kolika je minimalna pauza za komandu DELAY_US; 99% sam ubedjen da je 13 µs premalo za nju. A to što radi u PROTEUS-u nije sporno, samo treba izmeriti koja je frekvenca.
Što se tiče frekvence na kojoj treba da radi predajni kontroler, 4 MHz je sasvim u redu - taman imaš rezoluciju od 1 µs za podešavanje pauze. Može i sa manje, ali nećemo da komplikujemo.
Mogu da ti napišem test rutinu (ASM ili PBP), ali to nije ono što tebi treba kao konačna verzija, a ja ne "govorim" C tako da ne mogu da ti napišem konkretnu rutinu koja ti je potrebna, ali mogu da ti pomognem da to sam uradiš.
Možda rešenje sa PWM-om i nije loše, ali tada ti treba kontroler koji to ima. Rešenje sa tajmer interaptom takodje možda nije loše (samo bi moralo da se proveri da li sa 4 MHz može da se odradi sve što treba u interapt rutini za 13 µs), ali ja lično smatram interapt veoma moćnim oružjem i koristim ga samo kad moram; naravno, svako rešenje koje radi ono što treba je dobro, samo je u pitanju pristup.
Ja bih to uradio na sledeći način: u programu bih ispitivao bit po bit promenljive koja treba da se pošalje preko IR-a i kada je taj bit log. 0 napravio bih potrebnu pauzu, a kad je log. 1 pozvao bih rutinu koja šalje 38 kHz u potrebnom trajanju. E sad, trajanje te povorke zavisi od tvojih potreba; možda je 600 µs minimum (da ne tražim ponovo PDF), a svakako može duže ako imaš potrebe za tim, tj. zavisi od programa za prijem. Takodje i pauzu prilagodiš svojim potrebama. Mislim, varijanti ima dosta i ti sam moraš da vidiš kako tebi odgovara.
Pauzu od 13 µs bih rešio sa NOP-ovima jer je tako najlakše za tebe, a i ne zauzima mnogo više prog. memorije nego da i to staviš u petlju (i opet je pitanje broja instrukcija koje su potrebne). Da skratim, rutina bi bila otprilike ovakva:
Code:
for i = 1 to xx ; xx zavisi od potrebnog trajanja povorke
izlaz=1
nop
nop
... ; broj nopova zavisi od prog. jezika koji koristiš, tj. kako je kod njega rešena FOR petlja
nop ; i možda je najbolje proveriti to u nekom simulatoru
izlaz=0
nop
... ; pa opet NOP-ovi. Vrlo verovano da treba različit broj u odnodu na malo pre zbog
nop ; obrade same FOR petlje i to treba proveriti npr. u simulatoru
end for
pauza yy ; i sad pauza koja odredjuje minimalnu pauzu izmedju povorki koja će biti uvećana za
; ostatak programa koja i nije potrebna jer već postoji pauza kada je bit koji se
; ispituje na log. 0
return ; ovo znaš šta je :)
Nadam se da si shvatio šta hoću da kažem, ako ne, a ti reci.
Pozdrav.
Sinisha