Как всегда... одни ищут возможности, другие - причины... )))))qwerky писал(а):угу, причем таких граблей разработчики STM8 набросали кучу. Напр. мин.нарпяжение 2.9В (от таблетки уже не запитать, могли бы и понизить на 0.2..0.3В), отсутствие компаратора, отсутствие входа счета таймера, неудачная разводка портов (разбросаны кусками, а не полные 8 бит) у STM8S103, у 8L101 - отсутствие АЦП, второго входа и выхода компаратора, кварцевого генератора также нет входа счета таймера (был бы отличный чип с такими параметрами).Печаль что у STM8S103 выхода TIM1_ETR
Программирование STM8
Re: Программирование STM8
"Я не даю готовых решений, я заставляю думать!"(С)
- Реклама
Re: Программирование STM8
Кто работал с ацп, помогите запустить? НАстроил что какие то данные идут но все время в прерывании сидит и почемуто все каналы включены.
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
Я только с лькой возилсяmDI-WFG писал(а):Кто работал с ацп, помогите запустить? НАстроил что какие то данные идут но все время в прерывании сидит и почемуто все каналы включены.
http://ziblog.ru/2011/01/30/stm8l-analo ... atel-atsp/
пиши подробнее что делал, можно шматочек кода...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
-
qwerky
- Мучитель микросхем
- Сообщения: 487
- Зарегистрирован: Пт июн 12, 2009 19:17:35
- Контактная информация:
Re: Программирование STM8
Пример с двумя каналами для 8S103:Кто работал с ацп, помогите запустить?
Код: Выделить всё
void setup_adc( void ) {
ADC_CR1 = 0b01100001; // enable ADC
ADC_CR2 = 0b00001000; // right alignment
ADC_CR3 = 0;
ADC_TDRL = 0b01100000; // disable Schmitt triggers
}
void update_adc( void ) {
ADC_CSR = 5; // channel 5
delay_us(10);
ADC_CR1 |= B0; // start conversion
while (!(ADC_CSR & B7)); // wait
adc_lo = ADC_DRL; // LSB first
adc_lo += (U16)ADC_DRH << 8;
adc_lo_sum = (adc_lo_sum + adc_lo) - adc_lo_buf[adc_buf_cnt];
adc_lo_buf[adc_buf_cnt] = adc_lo;
adc_lo_filt = adc_lo_sum >> 5;
voltage_lo = ((U32)adc_lo * (U32)99) >> 10;
ADC_CSR = 6; // channel 6
delay_us(10);
ADC_CR1 |= B0; // start conversion
while (!(ADC_CSR & B7)); // wait
adc_hi = ADC_DRL;
adc_hi += (U16)ADC_DRH << 8;
adc_hi_sum = (adc_hi_sum + adc_hi) - adc_hi_buf[adc_buf_cnt];
adc_hi_buf[adc_buf_cnt] = adc_hi;
adc_hi_filt = adc_hi_sum >> 5;
voltage_hi = ((U32)adc_hi * (U32)99) >> 10;
if (++adc_buf_cnt >= 32) adc_buf_cnt = 0;
}
Re: Программирование STM8
Всем спасибо за помощь, понял где был не прав=), вроде все стабильно работает.
- Реклама
Re: Программирование STM8
Несколько железный вопрос. Хочу делать первое устройство. Один 8-ми разрядный порт будет шиной данных к ЖКИ графическому дисплею. Но, тот порт который мне подходит для этой цели из соображений удобства разводки содержит пин совмещенный со SWIM интерфейсом. Смогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки (а так это первая конструкция - отлаживаться придется долго и хорошо).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
-
EugenyAM
- Родился
- Сообщения: 13
- Зарегистрирован: Вт окт 14, 2008 06:48:04
- Откуда: Omsk
- Контактная информация:
Re: Программирование STM8
Если для отладки - только отдельноСмогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки
Для программирования без отладки - есть положительный опыт совмещения
Re: Программирование STM8
Недавно взялся за изучение микроконтроллеров STM8.
На данный момент читаю документацию
(programming manual)
там на странице 14 написано:
Global configuration register (CFG_GCR):
The global configuration register is a memory mapped register. It controls the configuration
of the processor. It contains the AL control bit:
● AL: Activation level
If the AL bit is 0 (main), the IRET will cause the context to be retrieved from stack and the
main program will continue after the WFI instruction.
If the AL bit is 1 (interrupt only active), the IRET will cause the CPU to go back to WFI/HALT
mode without restoring the context.
This bit is used to control the low power modes of the MCU. In a very low power application,
the MCU spends most of the time in WFI/HALT mode and is woken up (through interrupts)
at specific moments in order to execute a specific task. Some of these recurring tasks are
short enough to be treated directly in an ISR, rather than going back to the main program. In
this case, by programming the AL bit to 1 before going to low power (by executing WFI/HALT
instruction), the run time/ISR execution is reduced due to the fact that the register context is
not saved/restored each time.
Что я (с помощью переводчика) перевел как:
Глобальный регистр конфигурации.
Расположен в памяти программ. Управляет конфигурацией процессора. Состоит из бита AL.
Когда AL = 0 (основные), возврат из прерывания контекст восстанавливает из стека и продолжает выполнение программы после инструкции WFI.
Когда AL = 1, (только активные прерывания) после команды IRET ЦПУ идет обратно WFI/HALT режим через сохранение контекста.
Этот бит используется для режима энергосбережения ЦПУ. Для очень малопотребляющих приложений, в этом случае MCU проводит большую часть времени в способе WFI/HALT и пробуждается (через перерывы) в определенные моменты, чтобы выполнить определенную задачу. Некоторые из этих возвращающихся задач достаточно короткий, чтобы рассматриваться непосредственно в ISR, вместо того, чтобы возвратиться к главной программе. В этом случае, программируя AL = 1, контекст не будет восстанавливаться, и как следствие, длительность обработчика уменьшится.
В связи с этим вопросы:
1) Для чего используется этот бит (из перевода это не очень ясно)?
2) Что такое ISR?
3) Чем отличается сохранение контекста при AL = 0/1?
4) Связано ли это (и как) с приоритетом прерываний?
На данный момент читаю документацию
(programming manual)
там на странице 14 написано:
Global configuration register (CFG_GCR):
The global configuration register is a memory mapped register. It controls the configuration
of the processor. It contains the AL control bit:
● AL: Activation level
If the AL bit is 0 (main), the IRET will cause the context to be retrieved from stack and the
main program will continue after the WFI instruction.
If the AL bit is 1 (interrupt only active), the IRET will cause the CPU to go back to WFI/HALT
mode without restoring the context.
This bit is used to control the low power modes of the MCU. In a very low power application,
the MCU spends most of the time in WFI/HALT mode and is woken up (through interrupts)
at specific moments in order to execute a specific task. Some of these recurring tasks are
short enough to be treated directly in an ISR, rather than going back to the main program. In
this case, by programming the AL bit to 1 before going to low power (by executing WFI/HALT
instruction), the run time/ISR execution is reduced due to the fact that the register context is
not saved/restored each time.
Что я (с помощью переводчика) перевел как:
Глобальный регистр конфигурации.
Расположен в памяти программ. Управляет конфигурацией процессора. Состоит из бита AL.
Когда AL = 0 (основные), возврат из прерывания контекст восстанавливает из стека и продолжает выполнение программы после инструкции WFI.
Когда AL = 1, (только активные прерывания) после команды IRET ЦПУ идет обратно WFI/HALT режим через сохранение контекста.
Этот бит используется для режима энергосбережения ЦПУ. Для очень малопотребляющих приложений, в этом случае MCU проводит большую часть времени в способе WFI/HALT и пробуждается (через перерывы) в определенные моменты, чтобы выполнить определенную задачу. Некоторые из этих возвращающихся задач достаточно короткий, чтобы рассматриваться непосредственно в ISR, вместо того, чтобы возвратиться к главной программе. В этом случае, программируя AL = 1, контекст не будет восстанавливаться, и как следствие, длительность обработчика уменьшится.
В связи с этим вопросы:
1) Для чего используется этот бит (из перевода это не очень ясно)?
2) Что такое ISR?
3) Чем отличается сохранение контекста при AL = 0/1?
4) Связано ли это (и как) с приоритетом прерываний?
на любой элемент найдется мощность, которая его сожжет.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Программирование STM8
ISR - Interrupt Service Routine, обработчик прерываний.
AL = 0:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По ней восстанавливается контекст и управление передётся в точку после команды WFI. Процессор по флагу из прерывания смотрит:
- если надо что-то делать, то делает
- если надо продолжать спать, то сразу делает переход назад на команду WFI, которая опять сохраняет контекст и загоняет процесоср в сон
AL = 1:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По IRET процессор сразу засыпает без восстановления контекста и возврата в точку после команды WFI.
Т.е. вместо установки флагов для анализа «наверху» при необходиости что-то обработать выше обработчк сбрасывает AL и IRET возвращает в основную программу. Если же делать больше нечего (прерывание не обнаружило ничего достойного внимания), то AL остаётся поднятым и процессор сразу засыпает.
Экономия активного времени -- восстановление контекста + то время, которое «верхний» уровень потратил бы на анализ флага + сохранение контекста
AL = 0:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По ней восстанавливается контекст и управление передётся в точку после команды WFI. Процессор по флагу из прерывания смотрит:
- если надо что-то делать, то делает
- если надо продолжать спать, то сразу делает переход назад на команду WFI, которая опять сохраняет контекст и загоняет процесоср в сон
AL = 1:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По IRET процессор сразу засыпает без восстановления контекста и возврата в точку после команды WFI.
Т.е. вместо установки флагов для анализа «наверху» при необходиости что-то обработать выше обработчк сбрасывает AL и IRET возвращает в основную программу. Если же делать больше нечего (прерывание не обнаружило ничего достойного внимания), то AL остаётся поднятым и процессор сразу засыпает.
Экономия активного времени -- восстановление контекста + то время, которое «верхний» уровень потратил бы на анализ флага + сохранение контекста
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: Программирование STM8
Спасибо.
Тогда еще один вопрос:
В то же документе на стр. 50
Зачем нужны Pre-code и pre-bytes?
pre-byte это байт который стоит перед кодом операции и изменяет команду, которая следуют за ним.
Вот например один из них:
90h = PDY
Replaces an X based instruction using immediate, direct, indexed or inherent addressing mode by a Y one. It also provides read/modify/write instructions using Y indexed addressing mode with long offset and two bit handling instructions (BCPL and BCCM)
и мой перевод, из которого яснее не становится:
Заменяет команду, основанную на Х использованием непосредственный, прямой, индексной или inherent адресации основанной на Y . Это также обеспечивает работу команд типа чтение/модификация/запись, с использованием индексной адресации с регистром Y адресации с длинным смещением и двумя "ручными» битовыми командами (BCPL и BCCM).
Тогда еще один вопрос:
В то же документе на стр. 50
Зачем нужны Pre-code и pre-bytes?
pre-byte это байт который стоит перед кодом операции и изменяет команду, которая следуют за ним.
Вот например один из них:
90h = PDY
Replaces an X based instruction using immediate, direct, indexed or inherent addressing mode by a Y one. It also provides read/modify/write instructions using Y indexed addressing mode with long offset and two bit handling instructions (BCPL and BCCM)
и мой перевод, из которого яснее не становится:
Заменяет команду, основанную на Х использованием непосредственный, прямой, индексной или inherent адресации основанной на Y . Это также обеспечивает работу команд типа чтение/модификация/запись, с использованием индексной адресации с регистром Y адресации с длинным смещением и двумя "ручными» битовыми командами (BCPL и BCCM).
на любой элемент найдется мощность, которая его сожжет.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Программирование STM8
Надеюсь, прямо в кодах программировать не собираетесь? 
Тогда просто запомните, что любая команда с регистром Y длиннее на один байт, чем команда с регистром X и по мере возможность следует использовать регистр X (это не всегда так, в самом конце я про это добавил, но в первом приближении можно таким правилом пользоваться).
Префиксы меняют поведение следующей команды.
Грубо говоря, где-то есть триггер, который обычно сброшен (и сбрасывается после каждой команды).
Когда в нём 0, то используется регистр X. Пишем командудля загрузки константы в X. Будет сгенерирован код
Теперь пишем команду
для загрузки константы в Y. Код
Префикс 0x90 взводит тот триггер и он переключает дешифратор, который теперь обеспечивает работу следующей команды (видом 1:1 как для загрузки X) с регистром Y. Сразу после выполнения триггер сбрасывается и последовательнсть
занесёт первой строкой 0x1234 в Y и второй строкой 0x5678 в X.
0xAE - код операции занесения 16-битной константы в индексный регистр (по умолчанию X)
0x90 - префикс смены индексного регистра с X на Y
История тянется издавна и корни STM8 в ST7 и в мотороловских 8-битниках MC68xx и MOS Technology (Commodore) 6502.
Среди них были и такие, у которых был только один индексный регистр.
И такие, у которых короткая адресация была не к младшим 256 байтам ОЗУ, а к странице, старшие 8 бит адреса которой хранились в региcтре DP (DirectPage). Кстати, удобно было бы для RTOS -- при переключении задач сохранять/восстанавливать не кусок области короткой адресации, а только этот регистр. Правда, для этого нужно много ОЗУ, чтобы каждой задаче выделить по странице.
И такие, у которых два аккумулятора A и B, которые вкупе могут работать как 16-битный аккумулятор.
Короче, перед нами процесор с длинной и неплохой родословной
Также там есть префиксы для косвенности адресации, т.е. обычно команда берёт данные оттуда-то (например, из ячейки памяти), а если перед ней стоит соответствующий префикс, то тогда она из ячейки памяти содержимое вынимет, но использует его не как данные, а как адрес данных.
Первая команда LDW X, $1234 -- загружаем в X содержимое ячейки памяти с адресом 0x1234
Вторая команда LDW X,[$1234.w] -- загружаем в X содержимое ячейки памяти, адрес которой лежит в ячейке с адресом 0x1234
Сделано это для того, чтобы для довольно редко используемых команд не тратить место в основном коде команды. Например, пришлось бы всегда в коде команды иметь бит для выбора X/Y и для выбора дополнительной косвенности -- вот уже два бита и пропало. Итого в один байт влезет меньше команд.
Если порыться, то там есть и команды, которые имеют одинаковую длину и для X, и для Y. Но там и так префикс есть для дополнительного уровня косвенности и для выбоора длины адреса той ячейки, в которой лежит адрес, а под выбор X/Y таки бит задействован.
Но эти знания уже на втором этапе работы с STM8 на ассемблере может понадобитсья, когда уже на высокий уровнеь оптимизации выходить. Поскольку я этого делать не собираюсь, я детально и не смотрел.
Тогда просто запомните, что любая команда с регистром Y длиннее на один байт, чем команда с регистром X и по мере возможность следует использовать регистр X (это не всегда так, в самом конце я про это добавил, но в первом приближении можно таким правилом пользоваться).
Префиксы меняют поведение следующей команды.
Грубо говоря, где-то есть триггер, который обычно сброшен (и сбрасывается после каждой команды).
Когда в нём 0, то используется регистр X. Пишем команду
Код: Выделить всё
ldw X,#$1234Код: Выделить всё
0xAE 0x12 0x34Код: Выделить всё
ldw Y,#$1234Код: Выделить всё
0x90 0xAE 0x12 0x34Код: Выделить всё
0x90 0xAE 0x12 0x34
0xAE 0x56 0x780xAE - код операции занесения 16-битной константы в индексный регистр (по умолчанию X)
0x90 - префикс смены индексного регистра с X на Y
История тянется издавна и корни STM8 в ST7 и в мотороловских 8-битниках MC68xx и MOS Technology (Commodore) 6502.
Среди них были и такие, у которых был только один индексный регистр.
И такие, у которых короткая адресация была не к младшим 256 байтам ОЗУ, а к странице, старшие 8 бит адреса которой хранились в региcтре DP (DirectPage). Кстати, удобно было бы для RTOS -- при переключении задач сохранять/восстанавливать не кусок области короткой адресации, а только этот регистр. Правда, для этого нужно много ОЗУ, чтобы каждой задаче выделить по странице.
И такие, у которых два аккумулятора A и B, которые вкупе могут работать как 16-битный аккумулятор.
Короче, перед нами процесор с длинной и неплохой родословной
Также там есть префиксы для косвенности адресации, т.е. обычно команда берёт данные оттуда-то (например, из ячейки памяти), а если перед ней стоит соответствующий префикс, то тогда она из ячейки памяти содержимое вынимет, но использует его не как данные, а как адрес данных.
Код: Выделить всё
0xСE 0x12 0x34
0x72 0xСE 0x12 0x34 Вторая команда LDW X,[$1234.w] -- загружаем в X содержимое ячейки памяти, адрес которой лежит в ячейке с адресом 0x1234
Сделано это для того, чтобы для довольно редко используемых команд не тратить место в основном коде команды. Например, пришлось бы всегда в коде команды иметь бит для выбора X/Y и для выбора дополнительной косвенности -- вот уже два бита и пропало. Итого в один байт влезет меньше команд.
Если порыться, то там есть и команды, которые имеют одинаковую длину и для X, и для Y. Но там и так префикс есть для дополнительного уровня косвенности и для выбоора длины адреса той ячейки, в которой лежит адрес, а под выбор X/Y таки бит задействован.
Но эти знания уже на втором этапе работы с STM8 на ассемблере может понадобитсья, когда уже на высокий уровнеь оптимизации выходить. Поскольку я этого делать не собираюсь, я детально и не смотрел.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Программирование STM8
Кто пользуется НЕ-IAR-ом, покажите, как оно компилирует чтение 16-разрядного регистра, что-то в таком духе:
IAR раскатывает простыню
тогда как нормальному ковбою хватило бы
Код: Выделить всё
uint8_t hi = TIM3_CNTRH;
uint16_t ticks = (hi << 8) + TIM3_CNTRL;Код: Выделить всё
95 uint8_t hi = TIM3_CNTRH;
\ uint32_t TProfiler<(uint_fast8_t)'\000'>::time_interval()
\ _ZN9TProfilerILh0EE13time_intervalEv:
\ 000000 C65328 LD A, L:0x5328
96 uint16_t ticks = (hi << 8) + TIM3_CNTRL;
\ 000003 5F CLRW X
\ 000004 97 LD XL, A
\ 000005 58 SLLW X
\ 000006 58 SLLW X
\ 000007 58 SLLW X
\ 000008 58 SLLW X
\ 000009 58 SLLW X
\ 00000A 58 SLLW X
\ 00000B 58 SLLW X
\ 00000C 58 SLLW X
\ 00000D C65329 LD A, L:0x5329
\ 000010 905F CLRW Y
\ 000012 9097 LD YL, A
\ 000014 90BF00 LDW S:?w0, Y
\ 000017 72BB0000 ADDW X, S:?w0 Код: Выделить всё
ld A, L:TIM3_CNTRH
ld XL, A
ld A, L:TIM3_CNTRL
rlwa XЛень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Программирование STM8
Ну вот, тема на кучу страниц, а ответить некому.
Ещё перл от IAR
IAR/STM8 1.20
IAR/STM8 1.30
При том, что можно
Тут в теме упоминались другие компиляторы, пожалуйста, покажите их код для такой простой операци и для того, что в предыдущем сообщении. Мне тесно во времени качать/править пробовать все. И так для всех делаю, а не для себя (хотя, возможно, после этого и я с STM8 начну работать, понравились
).
Я ж не сам себе IAR выбрал, меня попросили под него кое-что для STM8 сделать.
Может, ещё не поздно переагитировать
Ещё перл от IAR
Код: Выделить всё
uint8_t uu;
...
++uu;Код: Выделить всё
ld A, #1 ; 2 байта
add A, L:uu ; 3 байта
ld L:uu, A ; 3 байтаКод: Выделить всё
ld A, L:uu ; 3 байта
inc A ; 1 байт
ld L:uu, A ; 3 байта Код: Выделить всё
inc L:uu ; 4 байтаЯ ж не сам себе IAR выбрал, меня попросили под него кое-что для STM8 сделать.
Может, ещё не поздно переагитировать
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
cosmic 4.3.6
оптимизация по скорости:
оптимизация по размеру:
оптимизация по скорости:
Код: Выделить всё
main.c:30 ++uu;
0x80f9 <main+2> 0x0C03 INC (0x03,SP) INC (0x03,SP)
main.c:33 hi = TIM3->CNTRH;
0x80fb <main+4> 0xC6528C LD A,0x528c LD A,0x528c
0x80fe <main+7> 0x6B03 LD (0x03,SP),A LD (0x03,SP),A
main.c:34 ticks = (hi << 8) + TIM3->CNTRL;
0x8100 <main+9> 0x5F CLRW X CLRW X
0x8101 <main+10> 0x97 LD XL,A LD XL,A
0x8102 <main+11> 0x4F CLR A CLR A
0x8103 <main+12> 0xCB528D ADD A,0x528d ADD A,0x528d
0x8106 <main+15> 0x2401 JRNC 0x8109 JRNC 0x8109
0x8108 <main+17> 0x5C INCW X INCW X
0x8109 <main+18> 0x02 RLWA X,A RLWA X,A
0x810a <main+19> 0x1F01 LDW (0x01,SP),X
Код: Выделить всё
main.c:30 ++uu;
0x80f9 <main+2> 0x0C03 INC (0x03,SP) INC (0x03,SP)
main.c:33 hi = TIM3->CNTRH;
0x80fb <main+4> 0xC6528C LD A,0x528c LD A,0x528c
0x80fe <main+7> 0x6B03 LD (0x03,SP),A LD (0x03,SP),A
main.c:34 ticks = (hi << 8) + TIM3->CNTRL;
0x8100 <main+9> 0x5F CLRW X CLRW X
0x8101 <main+10> 0x97 LD XL,A LD XL,A
0x8102 <main+11> 0x4F CLR A CLR A
0x8103 <main+12> 0xCB528D ADD A,0x528d ADD A,0x528d
0x8106 <main+15> 0x2401 JRNC 0x8109 JRNC 0x8109
0x8108 <main+17> 0x5C INCW X INCW X
0x8109 <main+18> 0x02 RLWA X,A RLWA X,A
0x810a <main+19> 0x1F01 LDW (0x01,SP),X
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
- DrWatson
- Опытный кот
- Сообщения: 890
- Зарегистрирован: Вт янв 20, 2009 14:49:08
- Откуда: Гондурас, Мурманск
Re: Программирование STM8
Может имеет смысл сделать объявление вида:
Тогда COSMIC выдает так:
Правда надо проверить действительно ли старший байт идет первым, но судя по адресам H и L TIM3_CNTR должно быть правильно.
Zheleznjakov, у тебя переменная локальная - на стеке, у задавшего вопрос - глобальная.
А с локальной мой вариант с дефайнами выдает:
С инкрементом глобальной переменной COSMIC особо не заморачивается:
Хм, у меня инкремент локальной компилируется так:
Версия COSMICa 4.2.8
Код: Выделить всё
unsigned int ticks;
#define ticks_hi (*((unsigned char *) &ticks))
#define ticks_lo (*((unsigned char *) (&ticks)+1))
Код: Выделить всё
2864 ; 25 ticks_hi=TIM3_CNTRH;
2866 004d 5553280002 mov _ticks,_TIM3_CNTRH
2867 ; 26 ticks_lo=TIM3_CNTRL;
2869 0052 5553290003 mov _ticks+1,_TIM3_CNTRL
Zheleznjakov, у тебя переменная локальная - на стеке, у задавшего вопрос - глобальная.
А с локальной мой вариант с дефайнами выдает:
Код: Выделить всё
2876 ; 25 ticks_hi=TIM3_CNTRH;
2878 004c c65328 ld a,_TIM3_CNTRH
2879 004f 6b01 ld (OFST-1,sp),a
2880 ; 26 ticks_lo=TIM3_CNTRL;
2882 0051 c65329 ld a,_TIM3_CNTRL
2883 0054 6b02 ld (OFST+0,sp),a
Код: Выделить всё
2884 ; 27 hi++;
2886 0056 3c02 inc _hi
Код: Выделить всё
2893 ; 27 hi++;
2895 0057 0c01 inc (OFST-2,sp)
Последний раз редактировалось DrWatson Сб май 14, 2011 18:28:37, всего редактировалось 2 раза.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
глобальные:
Код: Выделить всё
main.c:31 ++uu;
0x80f7 <main> 0x3C03 INC 0x03 INC uu
main.c:33 hi = TIM3->CNTRH;
0x80f9 <main+2> 0x55528C0002 MOV 0x0002,0x528c MOV hi,0x528c
main.c:34 ticks = (hi << 8) + TIM3->CNTRL;
0x80fe <main+7> 0x5F CLRW X CLRW X
0x80ff <main+8> 0xB602 LD A,0x02 LD A,hi
0x8101 <main+10> 0x97 LD XL,A LD XL,A
0x8102 <main+11> 0x4F CLR A CLR A
0x8103 <main+12> 0xCB528D ADD A,0x528d ADD A,0x528d
0x8106 <main+15> 0x2401 JRNC 0x8109 JRNC 0x8109
0x8108 <main+17> 0x5C INCW X INCW X
0x8109 <main+18> 0xB701 LD 0x01,A LD ticks+1,A
0x810b <main+20> 0x9F LD A,XL LD A,XL
0x810c <main+21> 0xB700 LD 0x00,A LD ticks,A
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
- DrWatson
- Опытный кот
- Сообщения: 890
- Зарегистрирован: Вт янв 20, 2009 14:49:08
- Откуда: Гондурас, Мурманск
Re: Программирование STM8
Использование ИЛИ вместо сложения как минимум уберет условный переход и формирование переноса. Вообще в данном случае использование сложения незачем.
А вот это вообще непонятно:
А вот это вообще непонятно:
Код: Выделить всё
2842 ; 21 ticks=(TIM3_CNTRH<<8)|TIM3_CNTRL;
2844 002e c65328 ld a,_TIM3_CNTRH
2845 0031 5f clrw x
2846 0032 97 ld xl,a
2847 0033 4f clr a
2848 0034 02 rlwa x,a ; ???????????
2849 0035 01 rrwa x,a ; ???????????
2850 0036 ca5329 or a,_TIM3_CNTRL
2851 0039 b702 ld _ticks+1,a
2852 003b 9f ld a,xl
2853 003c b701 ld _ticks,a
2854 ; 22 ticks=TIM3_CNTR;
2856 003e ce5328 ldw x,_TIM3_CNTR
2857 0041 bf01 ldw _ticks,x
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
мне проще вот так оборачивать (ещё с авр-ки ползет)DrWatson писал(а):Может имеет смысл сделать объявление вида:
Код: Выделить всё
#define BYTES(Value) ((uint8_t *) & (Value))Код: Выделить всё
BYTES(ticks)[1] = TIM3->CNTRH;
BYTES(ticks)[0] = TIM3->CNTRL;Код: Выделить всё
main.c:34 ++uu;
0x80f7 <main> 0x3C03 INC 0x03 INC uu
main.c:36 BYTES(ticks)[1] = TIM3->CNTRH;
0x80f9 <main+2> 0x55528C0001 MOV 0x0001,0x528c MOV ticks+1,0x528c
main.c:37 BYTES(ticks)[0] = TIM3->CNTRL;
0x80fe <main+7> 0x55528D0000 MOV 0x0000,0x528d MOV ticks,0x528d
Код: Выделить всё
main.c:34 ++uu;
0x80f9 <main+2> 0x0C01 INC (0x01,SP) INC (0x01,SP)
main.c:36 BYTES(ticks)[1] = TIM3->CNTRH;
0x80fb <main+4> 0xC6528C LD A,0x528c LD A,0x528c
0x80fe <main+7> 0x6B04 LD (0x04,SP),A LD (0x04,SP),A
main.c:37 BYTES(ticks)[0] = TIM3->CNTRL;
0x8100 <main+9> 0xC6528D LD A,0x528d LD A,0x528d
0x8103 <main+12> 0x6B03 LD (0x03,SP),A С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
- DrWatson
- Опытный кот
- Сообщения: 890
- Зарегистрирован: Вт янв 20, 2009 14:49:08
- Откуда: Гондурас, Мурманск
Re: Программирование STM8
Блин, обманул с версией ) 4.2.8 у меня, а 5.2.5 - это Idea или как ее там, просто на сплэше выскочила, я и повелся.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: Программирование STM8
хух, а то я уже ещё раз скачал с офф сайта и там то же 4.3.6
подумал фришная устарела...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru


