Цитата(FAUSTddd @ Dec 1 2010, 17:16)

текст всей проги
Не совсем. А где putchar() и getchar()?
Цитата
Каким образом достигается скорость 230 кбод?
Идея такая. Один отсчет таймера (TFx=1, в Вашем случае это TF2) - соответсвуйт 1 биту в порт UART.
Формула CLK/baudRate/bits=TimerReloadValue, где:
- CLK - частота на выходе PLL (у Вас 12582912 Гц, код "PLLCON=0");
- baudRate - Ваша скорость передачи;
- bits - число бит на байт данных (у Вас 8 , код "SCON=0x52");
- TimerReloadValue - значение для перезагрузки таймера (у Вас 7, код "TL2=-7").
Пример расчета:
32768*3*128/115200/9 = 12,1362962963, где:
- CLK=32768*3*128=12582912 Гц;
- baudRate=115200 бод;
- bits=9 бит;
- TimerReloadValue=12 единиц.
Цитата
...11%...
Экперимент все поставит на свои места

Дополнения/рекомендации по Вашему коду:
- код "SCON=0x52", заменить на "SCON=0x50", тк Вы устанавливаете биты RI и TI, а затем RI очищаете "RI=0";
- попробуйте отладить UART без SPI. Сейчас Вы отправляете в UART то, что принял SPI ("putchar(G(0x00));putchar(G(0x00))"), а принял он видимо "0x0D" и "0x0A". Из Вашего кода не видно, что Вы отправляете один байт "0x0A";
- инициалязация PLL. У Вас "PLLCON=0", попробуйте заменить на "PLLCON&=~0x43;while(!PLLCON|=0x40)". Надо проверять LOCK бит, иначе PLL дает частоту с большой погрешностью, видимо будут дополнительные проблемы.
Цитата(из datasheet)
In this mode, the PLL output can be 12.58MHz ± 20%
- проверьте расчет перезагрузки таймера синхронизации UART (у Вас 7). А если подсчитать 32768*3*128/57600/8 = 27,307. Получаем 27. Замените
Код
RCAP2H=-1;
RCAP2L=-7; //(достаточно близко к 57600 бод)
TH2=0xFF;
TL2=-7;
на
Код
RCAP2H=-1;
RCAP2L=-27; //(теперь очень близко к 57600 бод)
TH2=-1;
TL2=-27;
Или -7 оставить, а снизить частоту PLL до
32768*3*32/57600/8 = 6,827 ("PLLCON=5")
Сообщение отредактировал ih_ - Dec 2 2010, 06:57