Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Silabs C8051F120
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Страницы: 1, 2, 3, 4, 5
alexunder
Цитата(Radik2 @ May 28 2015, 10:09) *
У Вас uVision 4. И "проглатывает" файлы для SiliconLabs IDE. У меня uVision 5 выдает кучу ошибок с этими include.


uVision 4 - это всего лишь среда разработки (IDE). Файлы кода "проглатывает" транслятор-компилятор, а затем в бинарный файл проект собирает линковщик. У нас с Вами они одинаковых версий.
Файл, c8051F120.h - это всего лишь файл заголовков, оформленный в соответствии со стандартами языка Си для микроконтроллеров. Компилятор, который идет вместе с Keil эти расширения поддерживает. Это никак не связано с проблемой.

Мой подозрение было, что у Вас мог быть прицеплен файл от другого мк, скажем от F320 и если там интересующие вас регистры находятся по иным адресам (в чем я сомневаюсь), то получилась бы абра-кадабра. Но это не так. Значит, проблема в другом.

P.S. Watchdog в Вашей программе отключён?
Radik2
Цитата(alexunder @ May 28 2015, 13:19) *
P.S. Watchdog в Вашей программе отключён?


Да, отключен как я помню. Вечером проверю, чтобы наверняка.
Radik2
Цитата(alexunder @ May 28 2015, 12:50) *
прогоните просто в симуляторе 51, если при этом регистр себя нормально ведет (выведите его в отдельное окно Watch: меню View->Watch windows->Watch), то с программой все нормально и она должна работать в МК. Если без отладчика на МК не наблюдается адекватной работы, то тогда уж можно грешить на компаратор, хотя я сильно сомневаюсь что он каза болду.


В симуляторе работает как нужно.

Harbinger
Подробно смотреть было некогда, но... с регистром SFRPAGE там точно всё нормально? Код, сгенерированный конфигуратором (повторял у себя), странный - после переключения страницы SFR и манипуляций на новой странице обратное переключение не производится.
Radik2
Цитата(Harbinger @ May 29 2015, 15:40) *
Подробно смотреть было некогда, но... с регистром SFRPAGE там точно всё нормально? Код, сгенерированный конфигуратором (повторял у себя), странный - после переключения страницы SFR и манипуляций на новой странице обратное переключение не производится.


Я пока плохо разбираюсь, но криминала не заметил. Можете конкретное место показать?
alexunder
Harbinger прав, наверняка проблема с SFRPAGE!

В F120 блок регистров специального назначения (SFR) являет собой массив страниц, которые выбираются регистром SFRPAGE. Этого нет в F320/321 с которыми я работал, а посмотреть внимательно ДЩ на F120 не удосужился, деревня, блин.

Цитата
11.2.6.1.SFR Paging

The CIP-51 features SFR paging, allowing the device to map many SFR’s into the 0x80 to 0xFF memory
address space. The SFR memory space has 256 pages. In this way, each memory location from 0x80 to
0xFF can access up to 256 SFR’s. The C8051F12x family of devices utilizes five SFR pages: 0, 1, 2,
3, and F. SFR pages are selected using the Special Function Register Page Selection register,
SFRPAGE (see SFR Definition 11.3). The procedure for reading and writing an SFR is as follows:

1. Select the appropriate SFR page number using the SFRPAGE register.
2. Use direct accessing mode to read or write the special function register (MOV instruction).


В симуляторе Keil процесс работает как положено, поскольку Keil имитирует стандартный 8051, а не продвинутый F120. Пшик.
Вам следует использовать специфическую SFR-страницу каждый раз когда что-то конфигурируете и в случае с прерываниями (см ДЩ).

Вот в конце заголовочного файла c8051f120.h есть обьявления страниц:
Код
/* SFR PAGE DEFINITIONS */

#define CONFIG_PAGE       0x0F    /* SYSTEM AND PORT CONFIGURATION PAGE */
#define LEGACY_PAGE       0x00    /* LEGACY SFR PAGE */
#define TIMER01_PAGE      0x00    /* TIMER 0 AND TIMER 1 */
#define CPT0_PAGE         0x01    /* COMPARATOR 0 */
#define CPT1_PAGE         0x02    /* COMPARATOR 1 */
#define UART0_PAGE        0x00    /* UART 0 */
#define UART1_PAGE        0x01    /* UART 1 */
#define SPI0_PAGE         0x00    /* SPI 0 */
#define EMI0_PAGE         0x00    /* EXTERNAL MEMORY INTERFACE */
#define ADC0_PAGE         0x00    /* ADC 0 */
#define ADC2_PAGE         0x02    /* ADC 2 */
#define SMB0_PAGE         0x00    /* SMBUS 0 */
#define TMR2_PAGE         0x00    /* TIMER 2 */
#define TMR3_PAGE         0x01    /* TIMER 3 */
#define TMR4_PAGE         0x02    /* TIMER 4 */
#define DAC0_PAGE         0x00    /* DAC 0 */
#define DAC1_PAGE         0x01    /* DAC 1 */
#define PCA0_PAGE         0x00    /* PCA 0 */
#define PLL0_PAGE         0x0F    /* PLL 0 */
#define MAC0_PAGE         0x03    /* MAC 0 */


т.е. Вам в начале программы нужно вместо
Код
   SFRPAGE = CONFIG_PAGE;


поставить страницу, где будут доступны регистры конфигурации компаратора:
Код
   SFRPAGE = CPT0_PAGE;


тоже самое придется сделать и в процедурах инициализации портов, только подсунуть правильную таблицу (если этого не делает сам силабовский конфигуратор для вашего МК). Только сейчас обратил внимание как это делается в Port_init() в тестовых программах F12x_UART0_Interrupt.c, которые обсуждались ранее.
Radik2
Цитата(alexunder @ May 30 2015, 01:19) *
Harbinger прав, наверняка проблема с SFRPAGE!

т.е. Вам в начале программы нужно вместо
Код
   SFRPAGE = CONFIG_PAGE;


поставить страницу, где будут доступны регистры конфигурации компаратора:
Код
   SFRPAGE = CPT0_PAGE;


Сейчас разве не так?
Код
void Comparator_Init()
{
    int i = 0;
    SFRPAGE   = CPT0_PAGE;
    CPT0CN    = 0x85;
    for (i = 0; i < 60; i++);  // Wait 20us for initialization
    CPT0CN    &= ~0x30;
}
[u]
alexunder
Цитата(Radik2 @ May 30 2015, 04:46) *
Сейчас разве не так?

да, для Вашего МК именно так: конфигуратор все сам делает.
Тогда, как советовал Harbinger, помониторьте в отладке на кристалле состояние этого регистра и убедитесь, что его значения соответствуют нужным номерам страниц.
Harbinger
Цитата(Radik2 @ May 30 2015, 05:46) *
Сейчас разве не так?
Код
void Comparator_Init()
{
    int i = 0;
    SFRPAGE   = CPT0_PAGE;
    CPT0CN    = 0x85;
    for (i = 0; i < 60; i++);  // Wait 20us for initialization
    CPT0CN    &= ~0x30;
}

Мы изменили состояние SFRPAGE и никак об этом не просигнализировали!
Хорошим тоном считается возврат SFRPAGE в нулевое состояние, например, настройка RC-генератора в F553:
Код
void Oscillator_Init()
{
    SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0xC7;
    SFRPAGE   = ACTIVE_PAGE;
}

Определения страниц - в C8051F560_defs.h:
Код
#define  CONFIG_PAGE       0x0F        // System and Port Configuration Page
#define  ACTIVE_PAGE       0x00        // Active Use Page
#define  CAN0_PAGE         0x0C        // CAN0 Registers

Код сгенерирован тем же самым конфигуратором. Посему будем считать, что в случае с F120 в конфигураторе имеется косяк. Я уже не раз упоминал, что он небезгрешен.
(upd) Хорошая шутка ещё в том, что изрядная часть регистров доступна на всех страницах и потому переключение SFRPAGE не туда далеко не всегда сразу заметно.
Radik2
Цитата(Harbinger @ May 30 2015, 12:02) *
Мы изменили состояние SFRPAGE и никак об этом не просигнализировали!
Хорошим тоном считается возврат SFRPAGE в нулевое состояние.

Код сгенерирован тем же самым конфигуратором. Посему будем считать, что в случае с F120 в конфигураторе имеется косяк. Я уже не раз упоминал, что он небезгрешен.
(upd) Хорошая шутка ещё в том, что изрядная часть регистров доступна на всех страницах и потому переключение SFRPAGE не туда далеко не всегда сразу заметно.


я нашел только следующее;

Код
sfr SFRPAGE  = 0x84;    /* SFR PAGE SELECT                              */
sfr SFRNEXT  = 0x85;    /* SFR STACK NEXT PAGE                          */
sfr SFRLAST  = 0x86;    /* SFR STACK LAST PAGE                          */

sfr SFRPGCN  = 0x96;    /* SFR PAGE CONTROL

/* SFR PAGE DEFINITIONS */
#define  CONFIG_PAGE       0x0F     /* SYSTEM AND PORT CONFIGURATION PAGE */
#define  LEGACY_PAGE       0x00     /* LEGACY SFR PAGE                    */
#define  TIMER01_PAGE      0x00     /* TIMER 0 AND TIMER 1                */
#define  CPT0_PAGE         0x01     /* COMPARATOR 0                       */
#define  CPT1_PAGE         0x02     /* COMPARATOR 1                       */
#define  UART0_PAGE        0x00     /* UART 0                             */
#define  UART1_PAGE        0x01     /* UART 1                             */
#define  SPI0_PAGE         0x00     /* SPI 0                              */
#define  EMI0_PAGE         0x00     /* EXTERNAL MEMORY INTERFACE          */
#define  ADC0_PAGE         0x00     /* ADC 0                              */
#define  ADC2_PAGE         0x02     /* ADC 2                              */
#define  SMB0_PAGE         0x00     /* SMBUS 0                            */
#define  TMR2_PAGE         0x00     /* TIMER 2                            */
#define  TMR3_PAGE         0x01     /* TIMER 3                            */
#define  TMR4_PAGE         0x02     /* TIMER 4                            */
#define  DAC0_PAGE         0x00     /* DAC 0                              */
#define  DAC1_PAGE         0x01     /* DAC 1                              */
#define  PCA0_PAGE         0x00     /* PCA 0                              */
#define  REF0_PAGE         0x00     /**/
#define  PLL0_PAGE         0x0F     /* PLL 0
alexunder
Цитата(Radik2 @ May 31 2015, 16:31) *
я нашел только следующее;

Все верно: у Вас F120, у Harbinger F560.
Смотрите силабовский пример с уартом, там везде соблюдается это:
Цитата
Хорошим тоном считается возврат SFRPAGE в нулевое состояние.
Radik2
Цитата(alexunder @ May 31 2015, 20:31) *
Все верно: у Вас F120, у Harbinger F560.
Смотрите силабовский пример с уартом, там везде соблюдается это:

а какой, нулевой у Ф120?

Мда. Уже несколько недель не могу запустить компаратор. Видимо, не для новичков. Да еще и ошибки в ПО ловить.
alexunder
Цитата(Radik2 @ May 31 2015, 17:59) *
а какой, нулевой у Ф120?

Открываем datasheet по МК, где на каждый регистр есть подробное описание всех его битов и начального состояния (reset value):
Нажмите для просмотра прикрепленного файла

Но в данном случае знать его начальное значение (иными словами - значение после сброса) вовсе необязательно, просто перед каждой модификацией нужного регистра, сначала сохраняйте SFRPAGE в локальную переменную, меняйте его значение на нужное, модифицируйте желаемый регистр, а затем возвращаете исходное значение SFRPAGE. Еще раз: смотрите пример от Silabs по UART, там как раз следуют этому правилу в отношении регистра SFRPAGE.

Цитата(Radik2 @ May 31 2015, 17:59) *
Мда. Уже несколько недель не могу запустить компаратор. Видимо, не для новичков. Да еще и ошибки в ПО ловить.

Процитирую одного перспективного политика начала XX века: учиться, учиться и еще раз учиться.
Radik2
Цитата(alexunder @ May 31 2015, 23:00) *
Но в данном случае знать его начальное значение (иными словами - значение после сброса) вовсе необязательно, просто перед каждой модификацией нужного регистра, сначала сохраняйте SFRPAGE в локальную переменную, меняйте его значение на нужное, модифицируйте желаемый регистр, а затем возвращаете исходное значение SFRPAGE. Еще раз: смотрите пример от Silabs по UART, там как раз следуют этому правилу в отношении регистра SFRPAGE.


Все равно не понимаю: зачем возвращать начальное значение, если в каждом блоке инициализации (Comparator_Init(); Port_IO_Init(); Oscillator_Init()) производится выбор нужного SFR_PAGE ?
alexunder
Цитата(Radik2 @ May 31 2015, 20:14) *
Все равно не понимаю: зачем возвращать начальное значение, если в каждом блоке инициализации (Comparator_Init(); Port_IO_Init(); Oscillator_Init()) производится выбор нужного SFR_PAGE ?

В принципе, наверное, не нужно, но лучше делать sm.gif Вот простой пример. В "начальном значении" набор регистров SFR соответствует оному у оригинального 8051, т.е. вы восстанавливаете статус-кво, так сказать. Это особенно важно, когда вы хотите использовать какую-нибудь стороннюю библиотеку для 8051: возврат в начальное состояние перед вызовом функций этой библиотеки обязателен, ибо библиотека содана для стандартного МК из расчета что, к примеру, по адресу 0x88 будет регистр настройки таймера TCON, а не CPT0CN или какой другой. Если привыкните к возврату на reset value, сможете избежать ошибок и несовместимости со сторонним кодом в будущем.
Radik2
Цитата(alexunder @ Jun 1 2015, 00:58) *
В принципе, наверное, не нужно, но лучше делать sm.gif Вот простой пример. В "начальном значении" набор регистров SFR соответствует оному у оригинального 8051, т.е. вы восстанавливаете статус-кво, так сказать. Это особенно важно, когда вы хотите использовать какую-нибудь стороннюю библиотеку для 8051: возврат в начальное состояние перед вызовом функций этой библиотеки обязателен, ибо библиотека содана для стандартного МК из расчета что, к примеру, по адресу 0x88 будет регистр настройки таймера TCON, а не CPT0CN или какой другой. Если привыкните к возврату на reset value, сможете избежать ошибок и несовместимости со сторонним кодом в будущем.

Благодарю за совет. Но как быть сейчас с компаратором в Ф120-м ? Бросить этот узел МК и перейти к другому. Тоже не правильно.
У меня есть Ф320 и Ф350, еще Ф126 в пути. Попробую в них компаратор запустить. Возможно, что дело в железе.
Случайно увидел это и чуть не подавился слюнями ))
alexunder
Цитата(Radik2 @ Jun 1 2015, 04:38) *
Благодарю за совет. Но как быть сейчас с компаратором в Ф120-м ? Бросить этот узел МК и перейти к другому. Тоже не правильно.

как быть? Нужно довести дело до конца и сделать соответствующие выводы. Добавьте в программу управление регистром SFRPAGE как Вам советовали выше и проверьте работоспособность с отладчиком и без. Если с программой все в порядке, воздействие на компаратор правильное, но блок не срабатывает, то стоит попробовать второй компаратор (под индексом 1) аналогичным образом. Мне не верится что компараторы или сопутствующая логика в МК вышли из строя, хотя всякое бывает. Такое случается, если на них могли долговременно держать уровни выше absolute maximum ratings (как я понял, плата б/у). Однако, не будем заранее так думать.

Цитата(Radik2 @ Jun 1 2015, 04:38) *
У меня есть Ф320 и Ф350, еще Ф126 в пути. Попробую в них компаратор запустить. Возможно, что дело в железе.

Хороший набор. Однако, надо разобраться со свойствами F120, потом легче будет с остальными МК. F32x нацелены на работу с USB (FS), там придется вникать в работу шины и соотв. механизмы для обработки части USB-стека. Последнее заметно сложнее тестов с компаратором даже при наличии библиотеки от Silabs. F350 - на применение в аналоговых приложениях. Интересно было бы потестировать 24-битный АЦП и сравнить его реальные х-ки с аналогичными от TI и AD.

Цитата(Radik2 @ Jun 1 2015, 04:38) *
Случайно увидел это и чуть не подавился слюнями ))

Да, большой зверь - много портов и DMA наличиствует. Мне пока еще не требовалось столько восьмиразрядных портов на одном МК (даже если учесть что часть портов будут задействованы под нужды АЦП или SPI). Однажды в проекте было необходимо четыре 8-разрядных порта в одном контроллере, тогда использовал вот такого зверя с 51-м ядром в 100- и 128-выводных корпусах, но с ним главная цель была устройство с high-speed USB 2.0
редактор
С отладчиком поаккуратнее, В режиме эмуляции Кейл может не догадываться, что вы страницу переключили (мой 4.23 упорно игнорирует переключение страниц).Да и с поддержкой перефирии не все гладко в моей версии, поэтому работу с перефирией проверяю только на железе. Эмуляция для логики.
Еще вариант сохранения текущей страницы регистров
void func (void)
{ _push(SFRPAGE); // сохранили в стек
SFRPAGE = ...; // выбираем номер нужной страницы
...
_pop(SFRPAGE); // восстановили из стека
}
В прерываниях происходит автоматическое перключение на страницу перефирии, вызвавшей прерывание. Восстановление страницы тоже происходит автоматически (есть свой стек для регистра SFRPAGE). НО ограничение по глубине вложенных прерываний (глубина стека для SFRPAGE 3 или 4 байта).Надо уточнить в описании. Работал со 120-й серией давно (3-4 года назад) только УАРТ и АЦП.
Radik2
Цитата(редактор @ Jun 1 2015, 12:15) *
С отладчиком поаккуратнее, В режиме эмуляции Кейл может не догадываться, что вы страницу переключили (мой 4.23 упорно игнорирует переключение страниц).Да и с поддержкой перефирии не все гладко в моей версии, поэтому работу с перефирией проверяю только на железе. Эмуляция для логики.


Да, эмуляция периферии похоже не ахти. Вообщем, заработало в железе. При отладке не активируется компаратор.
Интересный момент. Кручу медленно потенциометр с которого идет на вход СР0+ и при определенном значении напряжения (меньше чем на входе СР0-) загорается светодиод, кручу дальше - яркость уеличивается.

Код
#include <c8051f120.h>                 // SFR declarations
#include <stdio.h>
//#include <intrins.h>
//#include <REG52.H>


void Comparator_Init()
{
    char SFRPAGE_SAVE = SFRPAGE;
    int i = 0;
    SFRPAGE   = CPT0_PAGE;
    CPT0CN    = 0x85;
    for (i = 0; i < 60; i++);  // Wait 20us for initialization
    //CPT0CN    &= ~0x30;
    SFRPAGE = SFRPAGE_SAVE;
}

void Port_IO_Init()
{
    // P0.0  -  CP0 (Cmpr0), Open-Drain, Digital
    
    char SFRPAGE_SAVE = SFRPAGE;
    SFRPAGE   = CONFIG_PAGE;
    XBR0      = 0x80;
    XBR2      = 0x40;
    SFRPAGE = SFRPAGE_SAVE;
}

void Oscillator_Init()
{
    char SFRPAGE_SAVE = SFRPAGE;
    SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0x83;
    SFRPAGE = SFRPAGE_SAVE;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    Comparator_Init();
    Port_IO_Init();
    Oscillator_Init();
}

void main(void)
{
   SFRPAGE = CONFIG_PAGE;

   WDTCN = 0xDE;                  // Disable watchdog timer
   WDTCN = 0xAD;
    
   Init_Device();                
   while (1);
}


Если раскоментировать строку
CPT0CN &= ~0x30;
то и отладка работает, но в окошке с регистрами компараторов ничего не происходит, все "по умолчанию".

Забыл вставить сохранение и восстановление SFRPAGE перед Init_Device, где сторож-й таймер отключается. Не помешает.
редактор
Цитата
Кручу медленно потенциометр с которого идет на вход СР0+ и при определенном значении напряжения (меньше чем на входе СР0-) загорается светодиод, кручу дальше - яркость уеличивается.

Скорее всего на пороге срабатывания есть определенный дребезг от компаратора (маленький гистерезис), поэтому формируется некое подобие ШИМ, из-за чего светодиод светит тускло. Далее при уверенном преодолении порога загорается на полную яркость.
Radik2
Цитата(редактор @ Jun 2 2015, 10:24) *
Скорее всего на пороге срабатывания есть определенный дребезг от компаратора (маленький гистерезис), поэтому формируется некое подобие ШИМ, из-за чего светодиод светит тускло. Далее при уверенном преодолении порога загорается на полную яркость.


Скорее всего так и есть.

Слышал, что у 8051 очень удобный/приятный ассемблер. А Си я плохо перевариваю. Вопрос: для себя лучше программировать на асме, бейсике или все-таки напрячься и выучить Си.
Понимаю, что все устали от таких вопросов. Но я самостоятельно не смог за 7 лет изучения МК определиться с языком программирования.
alexunder
Цитата(Radik2 @ Jun 2 2015, 07:50) *
Слышал, что у 8051 очень удобный/приятный ассемблер. А Си я плохо перевариваю. Вопрос: для себя лучше программировать на асме, бейсике или все-таки напрячься и выучить Си.
Понимаю, что все устали от таких вопросов. Но я самостоятельно не смог за 7 лет изучения МК определиться с языком программирования.

Ассемблер не сложный, но писать большие программы на нем тяжело: требуется больше концентрации чем с языком выского уровня (Си). Я однажды писал работу usb-стека на ассемблере - лучше бы я этого не делал, т.к. много времени ушло на написание и отладку. Если не нравится Си, где-то есть компилятор на Паскале, но ему больше 10 лет и вряд-ли он такой же эффективный как кейловский Си. Если хотите изучить Си, возьмите книгу Кернигана и Ричи "Язык программирования Си", язык-то не сложный совсем в плане синтаксиса.

P.S. Рад что разобрались с компаратором. Похожий эффект со светодиодами наблюдал c F320.
Radik2
Цитата(alexunder @ Jun 2 2015, 10:59) *
Если хотите изучить Си, возьмите книгу Кернигана и Ричи "Язык программирования Си", язык-то не сложный совсем в плане синтаксиса.

Когда я вижу подобный код, то просто вхожу в ступор.

Код
BUS_PORT->BSRR=(data<<BUS_PIN_0)|(((uint32_t)((~data)<<BUS_PIN_0)&BUS_MASK)<<0x10);
редактор
Если писать для себя, то можно делать более простые комбинации. И остальным понятнее будет.
Это как с иностранным языком. На первом этапе простые фразы. По мере освоения фразы более сложные. Ну а разбираться в идиоматических выражениях и специфическом юморе (игра слов - например) - высший пилотаж.
Не надо пугаться - надо начать.
PS: Будут вопросы - можно в личку.
alexunder
Цитата(редактор @ Jun 2 2015, 09:05) *
Если писать для себя, то можно делать более простые комбинации. И остальным понятнее будет.
Это как с иностранным языком. На первом этапе простые фразы. По мере освоения фразы более сложные. Ну а разбираться в идиоматических выражениях и специфическом юморе (игра слов - например) - высший пилотаж.
Не надо пугаться - надо начать.

Полностью солидарен.

Radik, приведенная конструкция даже опытного специалиста заставит задуматься. К (моему) сожалению, есть любители офрмлять свои программы именно таким образом, ибо синтаксис не возбраняет. Однако, Вас никто не заставляет так делать, пишите так, чтобы код читался легко.
Radik2
А где бы почерпнуть информацию о том, как пишутся программы на Си в Keil для 8051 ?
Что-то можно из примеров использовать. Но этого, думаю, будет недостаточно.
На сайте Keil искать? На русс. яз., я так подозреваю, нет.
alexunder
Цитата(Radik2 @ Jun 2 2015, 12:13) *
А где бы почерпнуть информацию о том, как пишутся программы на Си в Keil для 8051 ?
Что-то можно из примеров использовать. Но этого, думаю, будет недостаточно.
На сайте Keil искать? На русс. яз., я так подозреваю, нет.

лучше изучить язык Си, а там уже смотреть примеры для 8051.

Цитата
Если хотите изучить Си, возьмите книгу Кернигана и Ричи "Язык программирования Си", язык-то не сложный совсем в плане синтаксиса.
Radik2
Цитата(alexunder @ Jun 2 2015, 10:59) *
P.S. Рад что разобрались с компаратором. Похожий эффект со светодиодами наблюдал c F320.


Надеюсь и на дальнейшую помощь. Как мне показалось, знатоков МК Silabs не так уж и много. По крайней мере, на данном форуме. Статей на русском языке в сети по пальцам можно сосчитать: АВРки и STM32 в основном.
vladec
Цитата(Radik2 @ Jun 3 2015, 14:31) *
Как мне показалось, знатоков МК Silabs не так уж и много. По крайней мере, на данном форуме. Статей на русском языке в сети по пальцам можно сосчитать: АВРки и STM32 в основном.


Наверное потому, что архитектура MCS51 потихоньку уходит в историю и становится все менее актуальной.
alexunder
Цитата(vladec @ Jun 4 2015, 08:44) *
Наверное потому, что архитектура MCS51 потихоньку уходит в историю и становится все менее актуальной.

Да, да, а мы вымираем как динозавры sm.gif
Radik2
Цитата(alexunder @ Jun 4 2015, 11:47) *
Да, да, а мы вымираем как динозавры sm.gif


Надеюсь, что на мой век хватит. Очень не хотелось бы изучать всякие Кортексы. Только, если возьмут на такую работу ))
В наших краях - маловероятно.
Harbinger
Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой".
Radik2
Цитата(Harbinger @ Jun 4 2015, 15:36) *
Касательно именно Silabs есть и историческая причина. Изначально их продукция была достаточно дорогой и потому "нишевой".


И сейчас не очень дешевые. Думаю, 90% объема продаж - на производство.
Obam
Цитата(Radik2 @ Jun 2 2015, 14:13) *
А где бы почерпнуть информацию о том, как пишутся программы на Си в Keil для 8051 ?


Не совсем про 8051, но просветлению помогает:
Нажмите для просмотра прикрепленного файла

Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051".
Radik2
Цитата(Obam @ Jun 8 2015, 11:45) *
Не совсем про 8051, но просветлению помогает:
Нажмите для просмотра прикрепленного файла

Ну и на всякий случай журнал "Радио" за 1994: в нескольких номерах была статья Фрунзе "Однокристальные микро-ЭВМ семейства 8051".

Благодарю за информацию. Почитаем ...
Radik2
Приветствую всех!
Играюсь с таймером/задержками/прерываниями. Потратил два часа времени и не смог разобраться в чем причина.
Замысел - ввести константу zz равную 50. Т.е., вместо "counter = 50" в двух местах кода написать "counter = zz".
Как только раскомментирую первую строку с "counter = zz" в Timer0_IS, светодиод перестает мигать.
Прошу помощи.
Планирую организовать задержки различной длительности с применением таймера.

Код
#include <c8051f120.h>                
#include <stdio.h>
#define zz 50;
sbit LED_BLINK = P1^6;
unsigned int counter = 50;



void Port_Init (void);                
void Timer0_Init (void);

void Oscillator_Init()
{
    char SFRPAGE_SAVE = SFRPAGE;
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0x81;
    CCH0CN    &= ~0x20;
    SFRPAGE   = LEGACY_PAGE;
    FLSCL     = 0xB0;
    SFRPAGE   = CONFIG_PAGE;
    CCH0CN    |= 0x20;
    PLL0CN    |= 0x01;
    PLL0DIV   = 0x01;
    PLL0FLT   = 0x0F;
    PLL0MUL   = 0x10;
    for (i = 0; i < 15; i++);  // Wait 5us for initialization
    PLL0CN    |= 0x02;
    while ((PLL0CN & 0x10) == 0);
    CLKSEL    = 0x02;
    SFRPAGE = SFRPAGE_SAVE;
}


void Port_Init (void)
{
   char SFRPAGE_SAVE = SFRPAGE;        

   SFRPAGE = CONFIG_PAGE;              

   XBR2 = 0x40;                        
   P1MDOUT = 0x40;                    

   SFRPAGE = SFRPAGE_SAVE;            
}

void Timer0_Init(void)
{
   char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

   SFRPAGE = TIMER01_PAGE;             // Set SFR page

   TH0 = 0xDB;
   TL0 = 0xF2;                         // Init Timer0 Low register
   TMOD = 0x01;                        // Timer0 in 16-bit mode
   CKCON = 0x02;                       // Timer0 uses a 1:48 prescaler
   ET0 = 1;                            // Timer0 interrupt enabled
   TCON = 0x10;                        // Timer0 ON

   SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}

void Timer0_ISR (void) interrupt 1
{
//counter = zz;                        // Здесь было counter = 50;
TF0 = 0;
counter--;
if (counter == 0)
{
   counter = zz;                      // Здесь было counter = 50;
   LED_BLINK = ~LED_BLINK;
}
TH0 = 0xDB;
TL0 = 0xF2;
}

void main(void)
{
   WDTCN = 0xDE;                       // Disable watchdog timer
   WDTCN = 0xAD;

   Oscillator_Init();
   Timer0_Init ();                     // Initialize the Timer0
   Port_Init ();                       // Init Ports
   EA = 1;                             // Enable global interrupts
   //LED_BLINK = 0;
   while (1);
}
alexunder
Цитата(Radik2 @ Jun 11 2015, 20:18) *
Как только раскомментирую первую строку с "counter = zz" в Timer0_IS, светодиод перестает мигать.

Все правильно. А зачем там в начале обр. прерывания эта строчка? Если ее открыть, то условие if (counter==0) никогда не выполнится и светодиод не включится.
Чтобы понять, прокомментируйте действие каждой строки в Timer0_IS и Вам все станет ясно.

Цитата(Radik2 @ Jun 11 2015, 20:18) *
Планирую организовать задержки различной длительности с применением таймера.

Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо.
Radik2
Цитата(alexunder @ Jun 12 2015, 11:50) *
Зачем для этого вводить дополнительную глобальную переменную counter если у таймера есть регистры, с помощью которых можно задавать кол-во отсчетов? Вижу смысл в counter только для каких-то специальных нужд, а для задержек с пом-ю таймера этого не требуется имхо.


Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю.
Пока не придумал функцию, которая бы запускала таймер на необходимое кол-во раз повторений. При этом ядро должно быть готово отреагировать на другие прерывания и задачи.
alexunder
Цитата(Radik2 @ Jun 12 2015, 14:35) *
Я так понял, что число в counter определяет количество переполнений таймера (большие задержки, к тому же частота 98 МГц): таймер переполнился - инкрементируем counter и проверяем равенство counter нулю.

тогда ясно - большие задержки. Ну вот Вы сами и дали объяснение своего кода. Не нужно в начале обр. прерывания инициализировать counter.
Radik2
Цитата(alexunder @ Jun 12 2015, 17:55) *

Не пойму почему программа не работает должным образом, если в строке
unsigned int counter = 50;
убрать "= 50".
Ведь есть zz.
alexunder
Цитата(Radik2 @ Jun 12 2015, 16:37) *
Не пойму почему программа не работает должным образом, если в строке
unsigned int counter = 50;
убрать "= 50".
Ведь есть zz.

не понял вопроса.

Можно сделать так:
Код
#define zz 50;
unsigned int counter = zz;

или Вы о том, что когда counter не проинициализирован числом zz, то программа ведет себя странно? В таком случае проследите последовательность изменения переменной counter и представьте, что происходит когда она не проинициализирована числом zz.
Заодно вот Вам задачка: какой будет zz на старте программы после аппаратного сброса МК, если Вы ее не инициализируете? Подсказка: смотреть в какой памяти компилятор разместит эту переменную, можно попросить его ассемблерный листинг сгенерировать.
Obam
Можно я свои 5 копеек добавлю? Спасибо.
1) "…таймер переполнился - инкрементируем counter…" всё-таки декрементируем (не придирки ради, а программу пишем)
2) почему не используете точки остановки? на входе в обработчик прерывания? Последующим пошаговый проход сразу показал бы не нужную безусловную инициализацию counter в 50 и что он не менялся меньше 49.

Подсказка wink.gif zz от сброса не зависит - это символическое имя (константа).
Radik2
Цитата(Harbinger @ Jun 4 2015, 15:36) *


Увидел вот эти камни случайно: http://ru.aliexpress.com/item/10pcs-lot-P8...2386655890.html
Errata практически пустая. Хорошая замена всяким ATtiny.
Есть у них на сайте генератор кода: http://www.codearchitect.org/nxp/v2/
Не приходилось применять?
Harbinger
Приходилось, на пути от атмела к силабсу. sm.gif Здесь в недрах даже кое-что выкладывал насчёт программатора для них. И генератор кода использовал, и ошибку в нём нашёл. sm.gif
Увы, их сняли с производства, из всей линейки остались только 925 и 936. На смену им пришла серия LPC800 (ядро Cortex-M0, 30 МГц), почти pin-to-pin и с сопоставимой ценой (правда, замена есть только для "мелких" - 915...917, 920...925).
Недостатки серии LPC900 были в отсутствии внутрисхемной отладки и малом объёме памяти в мелких корпусах (SSOP-16 - 2 кБ FLASH, SSOP-20 - 8 кБ, RAM всего 256 байт).
Radik2
Цитата(Harbinger @ Aug 3 2015, 13:20) *

Получается, что из МК 51-й серии Silabs предлагает лучшее соотношение качество/цена.
Radik2
Что можете сказать касательно следующих продуктов:

http://www.wickenhaeuser.de/uc51data/uc51_fly.pdf

http://www.crossware.com/i8051/Compiler

Keil C51 слишком дорогой. Пользоваться ломаным ПО не хотелось бы.
Obam
"Keil C51 слишком дорогой. Пользоваться ломаным ПО не хотелось бы."

Разве в SiLabs-овских лабкитах не идёт SiLabsIDE с Keil C51 вполне себе лицензионным?
Помнится в году в 2003 покупался лабкит для F310 и там были C-компилятор и ассемблер.

Для образовательных целей можно смело плевать на "ломаность" ПО, я так думаю sm.gif
Radik2
Цитата(Obam @ Aug 31 2015, 12:38) *
Разве в SiLabs-овских лабкитах не идёт SiLabsIDE с Keil C51 вполне себе лицензионным?
Помнится в году в 2003 покупался лабкит для F310 и там были C-компилятор и ассемблер.


Сейчас стоит Silabs IDE и вроде бы он без компилятора. Я к нему подключил компилятор Keil.

Цитата(Obam @ Aug 31 2015, 12:38) *
Для образовательных целей можно смело плевать на "ломаность" ПО, я так думаю sm.gif


А дальше? Переучиваться на другое ПО или просить работодателя купить Keil?
Я не делал проектов на заказ. Заказчики просят коды программ, проверяют на лицензионную чистоту?
Еще побаиваюсь насчет возможного вреда системе от кряка.
Obam
Если Silabs IDE качалась с сайта, то - да, там нет. А на CD в комплекте лабкита был.

Работодатель (настоящий) должен обеспечить sm.gif
Radik2
Компилятор у Keil считается лучшим для C51, в частности для МК C8051F Silicon Labs ?
Также установил Ride 7 + Rkit51. Надо бы сравнить его с Keil. У Ride ограничение для бесплатной версии вроде 8 кБ.
На форумах тишина насчет SDCC для 8051.

Вот что еще нашел
http://www.silabs.com/products/mcu/Pages/8....aspx#keil-pk51

Keil® PK51 Developer’s Kit

The Keil PK51 Developer’s Kit includes an industry-leading 8051 C compiler, linker and assembler for use wih Silicon Labs’ 8-bit microcontrollers and Studio. This toolchain package provides the build support for 8051 projects, while the IDE provides editing and debugging support. This free toolchain comes without a time or code size limit!

Получается бесплатная версия для МК 8051 от Silabs ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.