|
|
  |
Silabs C8051F120 |
|
|
|
May 28 2015, 08:19
|

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
Цитата(Radik2 @ May 28 2015, 10:09)  У Вас uVision 4. И "проглатывает" файлы для SiliconLabs IDE. У меня uVision 5 выдает кучу ошибок с этими include. uVision 4 - это всего лишь среда разработки (IDE). Файлы кода "проглатывает" транслятор-компилятор, а затем в бинарный файл проект собирает линковщик. У нас с Вами они одинаковых версий. Файл, c8051F120.h - это всего лишь файл заголовков, оформленный в соответствии со стандартами языка Си для микроконтроллеров. Компилятор, который идет вместе с Keil эти расширения поддерживает. Это никак не связано с проблемой. Мой подозрение было, что у Вас мог быть прицеплен файл от другого мк, скажем от F320 и если там интересующие вас регистры находятся по иным адресам (в чем я сомневаюсь), то получилась бы абра-кадабра. Но это не так. Значит, проблема в другом. P.S. Watchdog в Вашей программе отключён?
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
May 28 2015, 08:29
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(alexunder @ May 28 2015, 13:19)  P.S. Watchdog в Вашей программе отключён? Да, отключен как я помню. Вечером проверю, чтобы наверняка.
|
|
|
|
|
May 28 2015, 14:48
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(alexunder @ May 28 2015, 12:50)  прогоните просто в симуляторе 51, если при этом регистр себя нормально ведет (выведите его в отдельное окно Watch: меню View->Watch windows->Watch), то с программой все нормально и она должна работать в МК. Если без отладчика на МК не наблюдается адекватной работы, то тогда уж можно грешить на компаратор, хотя я сильно сомневаюсь что он каза болду. В симуляторе работает как нужно.
Эскизы прикрепленных изображений
|
|
|
|
|
May 29 2015, 13:55
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

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

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
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, которые обсуждались ранее.
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
May 30 2015, 02:46
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(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]
|
|
|
|
|
May 30 2015, 04:34
|

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
Цитата(Radik2 @ May 30 2015, 04:46)  Сейчас разве не так? да, для Вашего МК именно так: конфигуратор все сам делает. Тогда, как советовал Harbinger, помониторьте в отладке на кристалле состояние этого регистра и убедитесь, что его значения соответствуют нужным номерам страниц.
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
May 30 2015, 07:02
|

старший лаборант
     
Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097

|
Цитата(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 не туда далеко не всегда сразу заметно.
--------------------
Китайская комплектация - европейское качество! ;)
|
|
|
|
|
May 31 2015, 14:31
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(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
Сообщение отредактировал Radik2 - May 31 2015, 15:21
|
|
|
|
|
May 31 2015, 15:31
|

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
Цитата(Radik2 @ May 31 2015, 16:31)  я нашел только следующее; Все верно: у Вас F120, у Harbinger F560. Смотрите силабовский пример с уартом, там везде соблюдается это: Цитата Хорошим тоном считается возврат SFRPAGE в нулевое состояние.
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
May 31 2015, 15:59
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(alexunder @ May 31 2015, 20:31)  Все верно: у Вас F120, у Harbinger F560. Смотрите силабовский пример с уартом, там везде соблюдается это: а какой, нулевой у Ф120? Мда. Уже несколько недель не могу запустить компаратор. Видимо, не для новичков. Да еще и ошибки в ПО ловить.
Сообщение отредактировал Radik2 - May 31 2015, 17:41
|
|
|
|
|
May 31 2015, 18:00
|

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
Цитата(Radik2 @ May 31 2015, 17:59)  а какой, нулевой у Ф120? Открываем datasheet по МК, где на каждый регистр есть подробное описание всех его битов и начального состояния (reset value):
Но в данном случае знать его начальное значение (иными словами - значение после сброса) вовсе необязательно, просто перед каждой модификацией нужного регистра, сначала сохраняйте SFRPAGE в локальную переменную, меняйте его значение на нужное, модифицируйте желаемый регистр, а затем возвращаете исходное значение SFRPAGE. Еще раз: смотрите пример от Silabs по UART, там как раз следуют этому правилу в отношении регистра SFRPAGE. Цитата(Radik2 @ May 31 2015, 17:59)  Мда. Уже несколько недель не могу запустить компаратор. Видимо, не для новичков. Да еще и ошибки в ПО ловить. Процитирую одного перспективного политика начала XX века: учиться, учиться и еще раз учиться.
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
May 31 2015, 18:14
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030

|
Цитата(alexunder @ May 31 2015, 23:00)  Но в данном случае знать его начальное значение (иными словами - значение после сброса) вовсе необязательно, просто перед каждой модификацией нужного регистра, сначала сохраняйте SFRPAGE в локальную переменную, меняйте его значение на нужное, модифицируйте желаемый регистр, а затем возвращаете исходное значение SFRPAGE. Еще раз: смотрите пример от Silabs по UART, там как раз следуют этому правилу в отношении регистра SFRPAGE. Все равно не понимаю: зачем возвращать начальное значение, если в каждом блоке инициализации (Comparator_Init(); Port_IO_Init(); Oscillator_Init()) производится выбор нужного SFR_PAGE ?
Сообщение отредактировал Radik2 - May 31 2015, 18:14
|
|
|
|
|
May 31 2015, 19:58
|

unexpected token
   
Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987

|
Цитата(Radik2 @ May 31 2015, 20:14)  Все равно не понимаю: зачем возвращать начальное значение, если в каждом блоке инициализации (Comparator_Init(); Port_IO_Init(); Oscillator_Init()) производится выбор нужного SFR_PAGE ? В принципе, наверное, не нужно, но лучше делать  Вот простой пример. В "начальном значении" набор регистров SFR соответствует оному у оригинального 8051, т.е. вы восстанавливаете статус-кво, так сказать. Это особенно важно, когда вы хотите использовать какую-нибудь стороннюю библиотеку для 8051: возврат в начальное состояние перед вызовом функций этой библиотеки обязателен, ибо библиотека содана для стандартного МК из расчета что, к примеру, по адресу 0x88 будет регистр настройки таймера TCON, а не CPT0CN или какой другой. Если привыкните к возврату на reset value, сможете избежать ошибок и несовместимости со сторонним кодом в будущем.
--------------------
А у тебя SQUID, и значит, мы умрем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|