Я бы ОЧЕНЬ попросил не учить меня тому, что я в силу ряда причин знаю в ТЫСЯЧИ раз лучше тебя - в данном случае ассемблеру. While применено для того, чтобы ассемблер сгенерировал 256 подряд идущих btg LATA,0 - в том ассемблере, которым пользуется большинство ПИКающих, нет директивы .rept, позволившей бы все это записать одной строкой - rept #FLASHLENGTH/2 (btg LATA,0) и обойтись без зацикливания, вносящего подрагивание меандра. Постить же сюда код, состоящий из 12288 одинаковых строк btg LATA,0 я не стал по, надеюсь, очевидным причинам.
Для особо одаренных, у которых троятся периоды и не компилируется код, а также для желающих поучить других тому, что они не знают сами, привожу ЛИСТИНГ:
Код
MPASM 5.13 BTG.ASM 9-18-2007 1:04:00 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00000064 00001 LATA = 100
00002
000000 00003 BTG_LOOP:
00000000 00004 N=0
00005 WHILE N < 256
000000 7164 00006 BTG LATA,0
00000001 00007 N+=1
000002 7164 00006 BTG LATA,0
00000002 00007 N+=1
000004 7164 00006 BTG LATA,0
00000003 00007 N+=1
000006 7164 00006 BTG LATA,0
00000004 00007 N+=1
000008 7164 00006 BTG LATA,0
00000005 00007 N+=1
00000A 7164 00006 BTG LATA,0
00000006 00007 N+=1
00000C 7164 00006 BTG LATA,0
00000007 00007 N+=1
;................................. и так всего 256 раз на 11 страницах листинга
;.................................
;.................................
;.................................
;.................................
;.................................
0001F8 7164 00006 BTG LATA,0
000000FD 00007 N+=1
0001FA 7164 00006 BTG LATA,0
000000FE 00007 N+=1
0001FC 7164 00006 BTG LATA,0
000000FF 00007 N+=1
0001FE 7164 00006 BTG LATA,0
00000100 00007 N+=1
00008 ENDW
000200 D6FF 00009 BRA BTG_LOOP
00010 END
MPASM 5.13 BTG.ASM 9-18-2007 1:04:00 PAGE 11
SYMBOL TABLE
LABEL VALUE
BTG_LOOP 00000000
LATA 00000064
N 00000100
__18F2455 00000001
MEMORY USAGE MAP ('X' = Used, '-' = Unused)
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0200 : XX-------------- ---------------- ---------------- ----------------
All other memory blocks unused.
Program Memory Bytes Used: 514
Program Memory Bytes Free: 32254
Errors : 0
Warnings : 0 reported, 0 suppressed
Messages : 0 reported, 0 suppressed
Ошибок компиляции, как видишь, нет. КАЖДАЯ инструкция btg LATA,0 выполняется за 1 машинный цикл, полный период меандра формируется каждой последовательной парой btg, поэтому частота меандра при максимально допустимой частоте Fcy, равной 12 МГЦ, составит 6 МГЦ, а период, соответственно составит 167 нс, а не втрое больше или семеро козлят.
По коду для PIC24 - дергание будет раз в 16384 периода, но код состоит всего из трех слов. При развертывании кода BTG на всю Flash и при выключенном WDT получится абсолютно чистый меандр 20 МГЦ. Это пишется тремя строками, но занимает всю Flash:
Код
.rept FLASHBYTES/3
btg LATA,#0
.endr
Обе эти реализации - для PIC18 и для PIC24 - абсолютно дурацкие, и приведены просто для примера, т.к. делают из МК дебильный генератор, загружая тем самым МК на 100%. На практике для этого используют встроенные в МК таймеры, которые позволяют получить и такие относительно высокие частоты без какой-либо загрузки МК.
Какие еще наезды будут, двоешник?