MCS51, вопросы перехода с "классики" на SiLabs...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):всем привет! пытаюсь перебраться на силобовские мк C8051Fxxx. Начал их осваивать и для наглядности хотелось бы стрельнуть у кого нить исходники на сях желательно (но не обязательно) с комментариями.И еще вопрос. В принципе если тут основа всему интеловское 8051 , то код от атмела на этом же ядре не сильно отличается названием регистров и принципами настройки периферии?

1. Что вы подразумваете под исходниками? При установке их (SiLabs) IDE есть несколько демонстрационных примеров.
2. Ядро у них какбы и 8051, но в то же время модернизированное, там есть свои фишки.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Установил IDE. Действительно примеров достаточно. буду разбираться ))
спасибо!
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Аще плохо въезжаю...
Помогите советом, как перейти на Silabs? с 8051 не разу не работал. возникли проблемы на самом начале... фактически прошел этап инициализации портов и застрял. С чего начать осваивать это ядро?
Пишу на сях.
В среде Keil
подскажите какую нить литературу по этим (или похожим на них) МК. У мя есть для 51 книга, но там все на асме.
Есть опыт программирования атмелов ... тини 2313, атмега 8, 16.
Курил доку по силабам.. толку мало:(
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Та же фигня. Разбираюсь методом научного тыка.
Где застряли, в чём проблема?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):Как расчитать значения регистра для таймера0 ? допустим что мне нужно генерить прерывания по таймеру с периодом 78 us. этот таймер 8 бит. Его хватит в принципе? МК C8051F410.

В принципе, должно хватить! Это всего 78 тактов при 1 МГц.
Итак, поехали... Тактовая частота? Кварц/внутренняя? Делители тактовой частоты? Чем тактируется таймер? Предделители клоков таймера?

Глянул даташит... Встроенный генератор на 24.5 МГц, по умолчанию включён предделитель на 128 :)
Странно, но у меня Configuration Wizard глючит, если выбрать 8051F4XX. А у вас?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):Странно, но у меня Configuration Wizard глючит, если выбрать 8051F4XX. А у вас?

у меня все работает. Спасибо за ответ. разобрался ))
Еще наглый вопросик... Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))
MSC-51 C8051F410
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):Еще наглый вопросик... Нет ли ни у кого функции для динамического опроса клавиатуры? а то писать заново не охота )))

Я думаю, с этим вопросом надо сюда: viewtopic.php?f=20&t=37190
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение 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 МГц... ?

Итак, давайте разбираться!..
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

По-хорошему, первой командой должна быть

Код: Выделить всё

   PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer enable)
, т.е. выключить сторожевой таймер. Вы его сбрасываете в ходе выполнения программы?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):Вы его сбрасываете в ходе выполнения программы?

Нет. не сбрасываю. :oops:
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):Нет. не сбрасываю. :oops:

Тогда попробуйте сбрасывать. У вас какой программатор, С2?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):
Chip115 писал(а):Нет. не сбрасываю. :oops:

Тогда попробуйте сбрасывать. У вас какой программатор, С2?

все заработало)
спасибо)
еще вопросик...
как прописать подпрограмму обработки прерывания от таймера 3?
например вот от таймера 0

Код: Выделить всё

void Timer0_ISR (void) interrupt 1
{
                  
}

что значит interrupt 1?
1 -это вектор?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):что значит interrupt 1? 1 -это вектор?

Почти. Вы даташит С51.pdf читали? :) 1 - это номер прерывания, равный приоритету (Priority Order), который указывает на вектор прерывания.
Вложения
Безымянный.GIF
(45.48 КБ) 708 скачиваний
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):
Chip115 писал(а):что значит interrupt 1? 1 -это вектор?

Почти. Вы даташит С51.pdf читали? :) 1 - это номер прерывания, равный приоритету (Priority Order), который указывает на вектор прерывания.

читал.. плохо понимаю что к чему.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Доброго времени суток,Gudd-Head!
(предыстория в личке) Вы не посмотрели что и как на 310-м?:)
Не могу сообразить как через UART передать другому контроллеру например вот это $7A0F
UART же передает только один байт. затем поднимает флаг. Мы его сбрасываем и снова посылаем очередной байт. Я так понял?
Так мне придется просто отправить $0F , а следом $7A ?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение 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 и выходим из главного цикла.
Весь код в приложении.

И еще вопрос. как мне пересылать строки?
создать массив,скажем

Код: Выделить всё

char str[]="1234";

и аналогично пихать в регистр SBUF0 по одному символу?
Тогда получится что будет бесконечно передаваться '1' .
В АВР видел что через UART передают строки по средсвам

Код: Выделить всё

getchar(); 

тут такое реально провернуть? Если да,то как грамотно реализовать это?


Вы по-прежнему по этому коду работаете?
Не могу сообразить как через UART передать другому контроллеру например вот это $7A0F
UART же передает только один байт. затем поднимает флаг. Мы его сбрасываем и снова посылаем очередной байт. Я так понял?
Так мне придется просто отправить $0F , а следом $7A ?

Да, UART в общем случае передаёт всё по одному байту (а можно от 7-ми до 9-ти бит, вроде). Так что проще всего (имея в виду 8-ми битный UART) и единственно возможно передавать сначала $7A, потом $0F или наоборот.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Да,с этим.
Буду пихать тогда последовательно числа.
А как быть с повтором одного числа дважды? Я так и не разобрался...
P.S спасибо за ответ на столь глупый вопрос ))
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):А как быть с повтором одного числа дважды?

Если дважды передаётся первый байт, значит в цикле на отправку какой-то косяк.
Кстати, строки в СИ — массив символов, так что обращаться к нему можно как к элементу массива. Единственное, длина строки на единицу больше кол-ва символов из-за символа "конец строки".
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение 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.
Последний раз редактировалось Chip115 Вт мар 29, 2011 17:29:34, всего редактировалось 3 раза.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Зачем под флаг отводить целый байт, когда можно обойтись одним битом?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»