реклама на сайте
подробности

 
 
15 страниц V  « < 9 10 11 12 13 > »   
Reply to this topicStart new topic
> Silabs C8051F120
alexunder
сообщение May 28 2015, 08:19
Сообщение #151


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, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 28 2015, 08:29
Сообщение #152


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030



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


Да, отключен как я помню. Вечером проверю, чтобы наверняка.
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 28 2015, 14:48
Сообщение #153


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030



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


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


Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Harbinger
сообщение May 29 2015, 10:40
Сообщение #154


старший лаборант
******

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



Подробно смотреть было некогда, но... с регистром SFRPAGE там точно всё нормально? Код, сгенерированный конфигуратором (повторял у себя), странный - после переключения страницы SFR и манипуляций на новой странице обратное переключение не производится.


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 29 2015, 13:55
Сообщение #155


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030



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


Я пока плохо разбираюсь, но криминала не заметил. Можете конкретное место показать?
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 29 2015, 20:19
Сообщение #156


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, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 30 2015, 02:46
Сообщение #157


Частый гость
**

Группа: Участник
Сообщений: 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]
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 30 2015, 04:34
Сообщение #158


unexpected token
****

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



Цитата(Radik2 @ May 30 2015, 04:46) *
Сейчас разве не так?

да, для Вашего МК именно так: конфигуратор все сам делает.
Тогда, как советовал Harbinger, помониторьте в отладке на кристалле состояние этого регистра и убедитесь, что его значения соответствуют нужным номерам страниц.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Harbinger
сообщение May 30 2015, 07:02
Сообщение #159


старший лаборант
******

Группа: Свой
Сообщений: 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 не туда далеко не всегда сразу заметно.


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 31 2015, 14:31
Сообщение #160


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 31 2015, 15:31
Сообщение #161


unexpected token
****

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



Цитата(Radik2 @ May 31 2015, 16:31) *
я нашел только следующее;

Все верно: у Вас F120, у Harbinger F560.
Смотрите силабовский пример с уартом, там везде соблюдается это:
Цитата
Хорошим тоном считается возврат SFRPAGE в нулевое состояние.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 31 2015, 15:59
Сообщение #162


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 10-03-07
Из: Уфа
Пользователь №: 26 030



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

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

Мда. Уже несколько недель не могу запустить компаратор. Видимо, не для новичков. Да еще и ошибки в ПО ловить.

Сообщение отредактировал Radik2 - May 31 2015, 17:41
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 31 2015, 18:00
Сообщение #163


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, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Radik2
сообщение May 31 2015, 18:14
Сообщение #164


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 31 2015, 19:58
Сообщение #165


unexpected token
****

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



Цитата(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, сможете избежать ошибок и несовместимости со сторонним кодом в будущем.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post

15 страниц V  « < 9 10 11 12 13 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 21:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016