Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Программирование STM8

Сообщение HHIMERA »

qwerky писал(а):
Печаль что у STM8S103 выхода TIM1_ETR
угу, причем таких граблей разработчики STM8 набросали кучу. Напр. мин.нарпяжение 2.9В (от таблетки уже не запитать, могли бы и понизить на 0.2..0.3В), отсутствие компаратора, отсутствие входа счета таймера, неудачная разводка портов (разбросаны кусками, а не полные 8 бит) у STM8S103, у 8L101 - отсутствие АЦП, второго входа и выхода компаратора, кварцевого генератора также нет входа счета таймера (был бы отличный чип с такими параметрами).

Как всегда... одни ищут возможности, другие - причины... )))))
"Я не даю готовых решений, я заставляю думать!"(С)
mDI-WFG
Родился
Сообщения: 10
Зарегистрирован: Чт мар 17, 2011 07:38:54

Re: Программирование STM8

Сообщение mDI-WFG »

Кто работал с ацп, помогите запустить? НАстроил что какие то данные идут но все время в прерывании сидит и почемуто все каналы включены.
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: Программирование STM8

Сообщение Zheleznjakov »

mDI-WFG писал(а):Кто работал с ацп, помогите запустить? НАстроил что какие то данные идут но все время в прерывании сидит и почемуто все каналы включены.

Я только с лькой возился
http://ziblog.ru/2011/01/30/stm8l-analo ... atel-atsp/
пиши подробнее что делал, можно шматочек кода...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
qwerky
Мучитель микросхем
Сообщения: 487
Зарегистрирован: Пт июн 12, 2009 19:17:35
Контактная информация:

Re: Программирование STM8

Сообщение qwerky »

Кто работал с ацп, помогите запустить?

Пример с двумя каналами для 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;

}
mDI-WFG
Родился
Сообщения: 10
Зарегистрирован: Чт мар 17, 2011 07:38:54

Re: Программирование STM8

Сообщение mDI-WFG »

Всем спасибо за помощь, понял где был не прав=), вроде все стабильно работает.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Программирование STM8

Сообщение uldemir »

Несколько железный вопрос. Хочу делать первое устройство. Один 8-ми разрядный порт будет шиной данных к ЖКИ графическому дисплею. Но, тот порт который мне подходит для этой цели из соображений удобства разводки содержит пин совмещенный со SWIM интерфейсом. Смогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки (а так это первая конструкция - отлаживаться придется долго и хорошо).
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
EugenyAM
Родился
Сообщения: 13
Зарегистрирован: Вт окт 14, 2008 06:48:04
Откуда: Omsk
Контактная информация:

Re: Программирование STM8

Сообщение EugenyAM »

Смогут ли они работать хором или все-же для SWIM надо выбрать контакт, который в схеме совсем не используется? Хотелось бы SWIM использовать не только для программирования кристалла, но и для отладки


Если для отладки - только отдельно
Для программирования без отладки - есть положительный опыт совмещения
Аватара пользователя
skef
Родился
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

Re: Программирование STM8

Сообщение skef »

Недавно взялся за изучение микроконтроллеров 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) Связано ли это (и как) с приоритетом прерываний?
на любой элемент найдется мощность, которая его сожжет.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Программирование STM8

Сообщение avreal »

ISR - Interrupt Service Routine, обработчик прерываний.

AL = 0:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По ней восстанавливается контекст и управление передётся в точку после команды WFI. Процессор по флагу из прерывания смотрит:
- если надо что-то делать, то делает
- если надо продолжать спать, то сразу делает переход назад на команду WFI, которая опять сохраняет контекст и загоняет процесоср в сон

AL = 1:
Программа доходит до WFI, сохраняет контекст и засыпает.
Приходит прерывание, сразу начинается обработка (контекст сохранён), в конце обработки выполняется команда IRET.
По IRET процессор сразу засыпает без восстановления контекста и возврата в точку после команды WFI.

Т.е. вместо установки флагов для анализа «наверху» при необходиости что-то обработать выше обработчк сбрасывает AL и IRET возвращает в основную программу. Если же делать больше нечего (прерывание не обнаружило ничего достойного внимания), то AL остаётся поднятым и процессор сразу засыпает.
Экономия активного времени -- восстановление контекста + то время, которое «верхний» уровень потратил бы на анализ флага + сохранение контекста
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
skef
Родился
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

Re: Программирование STM8

Сообщение skef »

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

Сообщение avreal »

Надеюсь, прямо в кодах программировать не собираетесь? :)))
Тогда просто запомните, что любая команда с регистром Y длиннее на один байт, чем команда с регистром X и по мере возможность следует использовать регистр X (это не всегда так, в самом конце я про это добавил, но в первом приближении можно таким правилом пользоваться).

Префиксы меняют поведение следующей команды.
Грубо говоря, где-то есть триггер, который обычно сброшен (и сбрасывается после каждой команды).
Когда в нём 0, то используется регистр X. Пишем команду

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

   ldw X,#$1234
для загрузки константы в X. Будет сгенерирован код

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

     0xAE 0x12 0x34
Теперь пишем команду

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

   ldw Y,#$1234
для загрузки константы в Y. Код

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

0x90 0xAE 0x12 0x34

Префикс 0x90 взводит тот триггер и он переключает дешифратор, который теперь обеспечивает работу следующей команды (видом 1:1 как для загрузки X) с регистром Y. Сразу после выполнения триггер сбрасывается и последовательнсть

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

0x90 0xAE 0x12 0x34
     0xAE 0x56 0x78
занесёт первой строкой 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-битный аккумулятор.
Короче, перед нами процесор с длинной и неплохой родословной :)))

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

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

     0xСE 0x12 0x34
0x72 0xСE 0x12 0x34 

Первая команда LDW X, $1234 -- загружаем в X содержимое ячейки памяти с адресом 0x1234
Вторая команда LDW X,[$1234.w] -- загружаем в X содержимое ячейки памяти, адрес которой лежит в ячейке с адресом 0x1234

Сделано это для того, чтобы для довольно редко используемых команд не тратить место в основном коде команды. Например, пришлось бы всегда в коде команды иметь бит для выбора X/Y и для выбора дополнительной косвенности -- вот уже два бита и пропало. Итого в один байт влезет меньше команд.

Если порыться, то там есть и команды, которые имеют одинаковую длину и для X, и для Y. Но там и так префикс есть для дополнительного уровня косвенности и для выбоора длины адреса той ячейки, в которой лежит адрес, а под выбор X/Y таки бит задействован.
Но эти знания уже на втором этапе работы с STM8 на ассемблере может понадобитсья, когда уже на высокий уровнеь оптимизации выходить. Поскольку я этого делать не собираюсь, я детально и не смотрел.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Программирование STM8

Сообщение avreal »

Кто пользуется НЕ-IAR-ом, покажите, как оно компилирует чтение 16-разрядного регистра, что-то в таком духе:

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

    uint8_t hi = TIM3_CNTRH;
    uint16_t ticks = (hi << 8) + TIM3_CNTRL;
IAR раскатывает простыню

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

     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

Сообщение avreal »

Ну вот, тема на кучу страниц, а ответить некому.
Ещё перл от IAR

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

  uint8_t uu;
...
  ++uu;

IAR/STM8 1.20

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

    ld    A, #1   ; 2 байта
    add   A, L:uu ; 3 байта
    ld    L:uu, A ; 3 байта

IAR/STM8 1.30

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

    ld    A, L:uu ; 3 байта
    inc   A       ; 1 байт
    ld    L:uu, A ; 3 байта

При том, что можно

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

    inc   L:uu ; 4 байта

Тут в теме упоминались другие компиляторы, пожалуйста, покажите их код для такой простой операци и для того, что в предыдущем сообщении. Мне тесно во времени качать/править пробовать все. И так для всех делаю, а не для себя (хотя, возможно, после этого и я с STM8 начну работать, понравились ;)).
Я ж не сам себе IAR выбрал, меня попросили под него кое-что для STM8 сделать.
Может, ещё не поздно переагитировать :)))
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: Программирование STM8

Сообщение Zheleznjakov »

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
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Re: Программирование STM8

Сообщение DrWatson »

Может имеет смысл сделать объявление вида:

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

unsigned int ticks;
#define ticks_hi (*((unsigned char *) &ticks))
#define ticks_lo (*((unsigned char *) (&ticks)+1))


Тогда COSMIC выдает так:

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

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

Правда надо проверить действительно ли старший байт идет первым, но судя по адресам H и L TIM3_CNTR должно быть правильно.
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


С инкрементом глобальной переменной COSMIC особо не заморачивается:

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

2884                     ; 27    hi++;
2886  0056 3c02             inc   _hi

Хм, у меня инкремент локальной компилируется так:

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

2893                     ; 27    hi++;
2895  0057 0c01             inc   (OFST-2,sp)


Версия COSMICa 4.2.8
Последний раз редактировалось DrWatson Сб май 14, 2011 18:28:37, всего редактировалось 2 раза.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: Программирование STM8

Сообщение Zheleznjakov »

глобальные:

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

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
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Re: Программирование STM8

Сообщение DrWatson »

Использование ИЛИ вместо сложения как минимум уберет условный переход и формирование переноса. Вообще в данном случае использование сложения незачем.
А вот это вообще непонятно:

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

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

Сообщение Zheleznjakov »

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
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Re: Программирование STM8

Сообщение DrWatson »

Блин, обманул с версией ) 4.2.8 у меня, а 5.2.5 - это Idea или как ее там, просто на сплэше выскочила, я и повелся.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: Программирование STM8

Сообщение Zheleznjakov »

хух, а то я уже ещё раз скачал с офф сайта и там то же 4.3.6 :) подумал фришная устарела...
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Ответить

Вернуться в «Разные вопросы по МК»