Страница 5 из 15
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб окт 23, 2010 21:52:39
Gudd-Head
Chip115 писал(а):всем привет! пытаюсь перебраться на силобовские мк C8051Fxxx. Начал их осваивать и для наглядности хотелось бы стрельнуть у кого нить исходники на сях желательно (но не обязательно) с комментариями.И еще вопрос. В принципе если тут основа всему интеловское 8051 , то код от атмела на этом же ядре не сильно отличается названием регистров и принципами настройки периферии?
1. Что вы подразумваете под исходниками? При установке их (SiLabs) IDE есть несколько демонстрационных примеров.
2. Ядро у них какбы и 8051, но в то же время модернизированное, там есть свои фишки.
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс окт 24, 2010 04:35:08
Chip115
Установил IDE. Действительно примеров достаточно. буду разбираться ))
спасибо!
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Чт ноя 04, 2010 18:48:15
Chip115
Аще плохо въезжаю...
Помогите советом, как перейти на Silabs? с 8051 не разу не работал. возникли проблемы на самом начале... фактически прошел этап инициализации портов и застрял. С чего начать осваивать это ядро?
Пишу на сях.
В среде Keil
подскажите какую нить литературу по этим (или похожим на них) МК. У мя есть для 51 книга, но там все на асме.
Есть опыт программирования атмелов ... тини 2313, атмега 8, 16.
Курил доку по силабам.. толку мало:(
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Чт ноя 04, 2010 20:31:17
Gudd-Head
Та же фигня. Разбираюсь методом научного тыка.
Где застряли, в чём проблема?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Ср ноя 24, 2010 09:44:20
Gudd-Head
Chip115 писал(а):Как расчитать значения регистра для таймера0 ? допустим что мне нужно генерить прерывания по таймеру с периодом 78 us. этот таймер 8 бит. Его хватит в принципе? МК C8051F410.
В принципе, должно хватить! Это всего 78 тактов при 1 МГц.
Итак, поехали... Тактовая частота? Кварц/внутренняя? Делители тактовой частоты? Чем тактируется таймер? Предделители клоков таймера?
Глянул даташит... Встроенный генератор на 24.5 МГц, по умолчанию включён предделитель на 128

Странно, но у меня Configuration Wizard глючит, если выбрать 8051F4XX. А у вас?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Ср ноя 24, 2010 19:53:52
Chip115
Gudd-Head писал(а):
Странно, но у меня Configuration Wizard глючит, если выбрать 8051F4XX. А у вас?
у меня все работает. Спасибо за ответ. разобрался ))
Еще наглый вопросик... Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
MSC-51 C8051F410
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Ср ноя 24, 2010 20:17:32
Gudd-Head
Chip115 писал(а):Еще наглый вопросик... Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
Я думаю, с этим вопросом надо сюда:
http://radiokot.ru/forum/viewtopic.php?f=20&t=37190
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб ноя 27, 2010 16:18:31
Gudd-Head
Chip115 писал(а):Пытаюсь прописать функцию задержки. Не работает. Не могу найти причину....Помогите, пожалуйста.
просто хочу мигать светодиодом. компилируется и прошивается без ошибок.
Код: Выделить всё
#include <compiler_defs.h>
#include <C8051F410_defs.h>
void delay_ms (unsigned int delay);
void main ()
{
P1MDOUT = 0xFF;
XBR1 = 0x40;
while (1)
{
P1=0x40;
delay_ms(500);
P1=0x00;
delay_ms(500);
}
}
void delay_ms (unsigned int delay)
{
TMOD |= 0x02; // 8-bit counter/timer with reload mode
CKCON |= 0x02; // // SYSCLK/48 = 4 kHz SYSCLK=195 кГц
TR0=1; // запускаем таймер
while (delay!=0)
{
TH0=0xFE; // загружаем задержку, длительность 1 мс
TL0=0x01;
TF0=0; // сброс флага
while (!TF0); // палим флаг и декрементируем значение переменной delay
delay--;
}
TR0=0; // стоп таймер
}
на сколько я понял, генератор по деффолту работает на 24,5 МГц... ?
Итак, давайте разбираться!..
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб ноя 27, 2010 16:22:26
Gudd-Head
По-хорошему, первой командой должна быть
Код: Выделить всё
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
, т.е. выключить сторожевой таймер. Вы его сбрасываете в ходе выполнения программы?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс ноя 28, 2010 09:21:31
Chip115
Gudd-Head писал(а):Вы его сбрасываете в ходе выполнения программы?
Нет. не сбрасываю.

Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс ноя 28, 2010 11:46:40
Gudd-Head
Chip115 писал(а):Нет. не сбрасываю.

Тогда попробуйте сбрасывать. У вас какой программатор, С2?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс дек 12, 2010 11:05:42
Chip115
Gudd-Head писал(а):Chip115 писал(а):Нет. не сбрасываю.

Тогда попробуйте сбрасывать. У вас какой программатор, С2?
все заработало)
спасибо)
еще вопросик...
как прописать подпрограмму обработки прерывания от таймера 3?
например вот от таймера 0
что значит interrupt 1?
1 -это вектор?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс дек 12, 2010 15:32:34
Gudd-Head
Chip115 писал(а):что значит interrupt 1? 1 -это вектор?
Почти. Вы даташит С51.pdf читали?

1 - это номер прерывания, равный приоритету (Priority Order), который указывает на вектор прерывания.
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс дек 12, 2010 15:34:50
Chip115
Gudd-Head писал(а):Chip115 писал(а):что значит interrupt 1? 1 -это вектор?
Почти. Вы даташит С51.pdf читали?

1 - это номер прерывания, равный приоритету (Priority Order), который указывает на вектор прерывания.
читал.. плохо понимаю что к чему.
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Пт фев 25, 2011 17:51:20
Chip115
Доброго времени суток,Gudd-Head!
(предыстория в личке) Вы не посмотрели что и как на 310-м?:)
Не могу сообразить как через UART передать другому контроллеру например вот это $7A0F
UART же передает только один байт. затем поднимает флаг. Мы его сбрасываем и снова посылаем очередной байт. Я так понял?
Так мне придется просто отправить $0F , а следом $7A ?
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб фев 26, 2011 09:16:38
Gudd-Head
Chip115, доброго. На работе полный завал, было не до 310-го.
Продублирую здесь ваше сообщение:
Chip115 писал(а):И снова сдрасте )
Продолжаю развлекаться с UART в контроллере C8051F410
Хочу реализовать тупую передачу массива данных 1234 .
Но почему то в терминал приходят 01 01 02 03 04
Не могу разобраться в чем причина. Почему дважды приходит единица? Вот кусок кода.
Код: Выделить всё
#define EndOfTxFlag TI0
#define EndOfRxFlag RI0
#define RxTxReg SBUF0
#define OnRx REN0=1;
#define OffRx REN0=0;
unsigned char UART_Buffer[4]={1,2,3,4};
char i=0,stop=0;
...
while(stop!=1)
{
RxTxReg=UART_Buffer[i];
if(EndOfTxFlag==1 & i<4)
{
i++;
EndOfTxFlag=0;
}
if (i==4)
stop=1;
}
Задумано так.
Пока весь массив не передадим , продолжаем высылать поочередно данные из массива.
Как только счетчик i выходит за пределы массива - выставляем лог.1 в переменной stop и выходим из главного цикла.
Весь код в приложении.
И еще вопрос. как мне пересылать строки?
создать массив,скажем
и аналогично пихать в регистр SBUF0 по одному символу?
Тогда получится что будет бесконечно передаваться '1' .
В АВР видел что через UART передают строки по средсвам
тут такое реально провернуть? Если да,то как грамотно реализовать это?
Вы по-прежнему по этому коду работаете?
Не могу сообразить как через UART передать другому контроллеру например вот это $7A0F
UART же передает только один байт. затем поднимает флаг. Мы его сбрасываем и снова посылаем очередной байт. Я так понял?
Так мне придется просто отправить $0F , а следом $7A ?
Да, UART в общем случае передаёт всё по одному байту (а можно от 7-ми до 9-ти бит, вроде). Так что проще всего (имея в виду 8-ми битный UART) и единственно возможно передавать сначала $7A, потом $0F или наоборот.
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб фев 26, 2011 16:52:29
Chip115
Да,с этим.
Буду пихать тогда последовательно числа.
А как быть с повтором одного числа дважды? Я так и не разобрался...
P.S спасибо за ответ на столь глупый вопрос ))
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Сб фев 26, 2011 17:10:37
Gudd-Head
Chip115 писал(а):А как быть с повтором одного числа дважды?
Если дважды передаётся первый байт, значит в цикле на отправку какой-то косяк.
Кстати, строки в СИ — массив символов, так что обращаться к нему можно как к элементу массива. Единственное, длина строки на единицу больше кол-ва символов из-за символа "конец строки".
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс мар 27, 2011 09:44:56
Chip115
Доброго времени суток!
Продолжаю биться с UART.
В общем задачу себе поставил передать данные в МК скажем такого вида 0A 0B 0C , и их же получить обратно.
Возвращается почему то следующее : 00 0А 0В 00
где косяк - так и не нашел. Уже второй час бьюсь. может что пропустил? можете глянуть свежим взглядом?
вот кусок кода
Код: Выделить всё
#include "D:\progects\test\macros\Includes.h"
/********** привел только объявление переменных. настройка УАПП взята из примера в IDE***********/
int UART_Buffer[3];
unsigned char TX_Ready =1;
static char Byte;
char i=0,temp;
bit stop=0,TxEn=0,RxEn=0;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
PORT_Init(); // Initialize Port I/O
SYSCLK_Init (); // Initialize Oscillator
UART0_Init();
P2=0x00;
EA = 0; // iauaa ?ac?aoaiea i?a?uaaiee
MCE0 = 0;
RI0=0;
TI0=0;
while (1)
{
RxEn=1;
while(stop!=1) // пока не передана посылка - остаемся в цикле
{
while(RxEn==1) // разрешаем обработку приема
{
REN0=1; // разрешаем прием по UART
if(RI0==1) // как только пришел стоп-бит то...
{
UART_Buffer[i]=SBUF0; // помещаем первый принятый байт в ячейку 0 массива
i++; // переходим к следующей ячейке
RI0=0; // сбрасываем флаг для прием сделующего байта
if (i==3) // если приняли 3 байта (заполненны 0...3 ячейки) то...
{
REN0=0; // запрещаем чтение по УАПП
RxEn=0; // запрещаем обработку предыдущего оператора while
TxEn=1; // разрешаем обработку оператора while, отвечающего за передачу MCU->CPU
i=0; // сбрасываем номер ячейки массива данных УАППа
}
RI0=0; // обнуляем флаг
}
while (TxEn==1) // обрабатываем передачу данных MCU->CPU
{
SBUF0=UART_Buffer[i]; // помещаем первый байт из ячекий 0 массива принятых данных
if(TI0==1) // при окончании передачи...
{
i++; // перемещаемся значение переменной на следующию ячейку массива
TI0=0; // сбрасываем флаг для следующей передачи
if (i==3) // если переданны все байты (из ячеек 0...3 массива) то....
{
i=0; // обнуляемся
stop=1; // выходим из цикла
TxEn=0; // запрещаем обработку передачи (можно и без него)
}
}
}
}
}
}
}
В общем я хотел реализовать простой алгоритм. Отправляем четыре байта через терминал в контроллер, и принимаем от него те же 4 байта.
но почему то идет повтор первых двух байтов при передачи MCU->PC.
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс мар 27, 2011 10:09:33
Gudd-Head
Зачем под флаг отводить целый байт, когда можно обойтись одним битом?