Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с STM8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
Страницы: 1, 2, 3
_Bill
Проблема состоит в конфигурации портов В/В.
Имею контроллер STM8S103K. Для начала решил попробовать использовать порт как обычный счетчик и посмотреть на нем сигналы. Для этого выбрал PORTB. Сконфигуриловал его как порт вывода. В бесконечном цикле наращиваю счетчик на 1
Код
1$: inc      PB_ODR
    jra      1$

Смотрю сигналы на выводах порта. А сигналов там вовсе и нет. На паре выводов низкий уровень (true open drain), на остальных - высокий. Попробовал использовать другой порт - PORTC. Абсолютно все то же самое. Взял третий - PORTD. Вроде и работает, но не совсем. На разрядах 0, 7 высокий уровень, на остальных как и положено - меандр. Попробовал чуть усложнить код
Код
1$:  inc    PB_ODR
     mov    PD_ODR, PB_ODR
     jra    1$

Абсолютно ничего не изменилось. На разрядах порта B постоянные уровни, на разрядах 1-6 порта D - меандр.
Вот и ломаю голову - что я сделал не так? Смотрел фирменные библиотеки, каких-то особых хитростей по конфигурации портов не увидел. Можно предположить, что я при пайке спалил выходы портов. Но это маловероятно. На всякий случай решил собрать еще одну платку с контроллером и посмотреть что будет.
PS: А контроллер мне нравится все больше и больше. Вот только бы заставить его работать нормально. rolleyes.gif
scifi
А что если новое значение, записываемое в порт, не успевает передёрнуть уровни, и чтение из порта возвращает старое значение (или, хуже, комбинацию старого и нового)?
IMHO, нужно, чтобы счётчик крутился во внутренней памяти, а наружу выводить копию счётчика.
_Bill
Цитата(scifi @ May 19 2010, 22:31) *
IMHO, нужно, чтобы счётчик крутился во внутренней памяти, а наружу выводить копию счётчика.

И так тоже делал, разницы нет.
Dog Pawlowa
Цитата(_Bill @ May 19 2010, 20:58) *
Проблема состоит в конфигурации портов В/В.

Так выложите, как Вы конфигурируете, сравню с библиотечными.
Светодиод то моргает. rolleyes.gif
Stanislav_S
Кстати каая у вас там ожидаемая частота должна быть на выходе?, потому как там есть еще регистры CR1 и CR2, там максимальная частота ногодрыганья задается, да и выводы в порту имеют разную допустимую частоту ногодрыганья.
_Bill
Цитата(Dog Pawlowa @ May 20 2010, 10:37) *
Так выложите, как Вы конфигурируете, сравню с библиотечными.
Светодиод то моргает. rolleyes.gif

Нет светодиод не мигает. Я пока все осциллографом смотрю. А код... вот он
Код
;
; ** InitPorts    -- функция инициализации портов В/В
;
InitPorts:
    ld    a, #0FFh    ; Initiate ports
    ld    PB_DDR,    a        ;
    ld    PB_CR1,    a        ;
    ld    PD_DDR,    a        ;
    ld    PD_CR1,    a        ;
    ld    PD_CR2,    a        ;
;    ld    a, #LED_MASK ; Установить порт управления LED драйвером на вывод
;    ld    LED_DDR, a    ;
;    ld    LED_CR1, a    ; включить push-pull режим
;    clr    LED_PORT    ; Сбросить порт
    ret
;
; ***** main - головная функция *****
;
_main:
    ldw    x, #RAM_END    ; Инициализировать стек
    ldw    sp, x            ;
    bset    SWEN        ; Switch clock to HSE
    mov    CLK_SWR, #0xB4        ;
    callr    InitPorts    ; Инициализировать порты

1$:        ;;; Бесконечный цикл
;    btjf    TIM_05, 2$    ; Проверить флаг события и переход, если не установлен
;    bres    TIM_05        ; Сбросить флаг
;    callr    Bin2BCD        ; Преобразовать новое значение счетчикак для вывода
;2$:
;    callr    LEDout        ; Вывод значения счетчика на индикатор
;    inc    PB_ODR        ; Use ports a a binary counter
    inc    PD_ODR            ;
    bcpl    PB_ODR, #1
    bcpl    PD_ODR, #1
    bcpl    PD_ODR, #6
    bres    PD_ODR, #0
    jra    1$;;;
Dog Pawlowa
Цитата(_Bill @ May 20 2010, 12:14) *
Нет светодиод не мигает.

У меня диод мигает при использовании функции из библиотеки, содержащей
GPIOx->ODR ^=(u8) mask;

А порт конфигурируется в режим GPIO_MODE_OUT_PP_LOW_FAST, т.е. вроде вижу по тексту - и в CR2 записывается 1.
После обеда гляну с отладчиком.
_Bill
Цитата(Dog Pawlowa @ May 20 2010, 14:04) *
У меня диод мигает при использовании функции из библиотеки, содержащей
GPIOx->ODR ^=(u8) mask;

А порт конфигурируется в режим GPIO_MODE_OUT_PP_LOW_FAST, т.е. вроде вижу по тексту - и в CR2 записывается 1.
После обеда гляну с отладчиком.

Это все в "железе" работает?
topkin
Взял STM8S - Discovery, подаренный на компэловском семинаре, написал простецкую программу, как раз по вашему случаю. По - поводу написания и всего остального прошу не пинать, в связи с отсутствием времени получилось вот так и все работает

/* MAIN.C file
*
* Copyright © 2002-2005 STMicroelectronics
*/

#include "STM8S105C6.h"

void GPIO_Conf(void)
{
PD_DDR = 0xFF; // all PD pins as output
PD_CR1 = 0xFF; // all PD pins output push pull
PD_CR2 = 0; // all PD pins speed 2MHz
PD_ODR = 0; // all set to 0
}


void main()
{
unsigned long int i;

GPIO_Conf();
while (1)
{
for(i = 0; i < 10000; i++);
PD_ODR = PD_ODR ^ 0xFF;
}
}

А почему вы тут сразу 2 порта настраиваете, порт B и D:
InitPorts:
ld a, #0FFh ; Initiate ports
ld PB_DDR, a ;
ld PB_CR1, a ;
ld PD_DDR, a ;
ld PD_CR1, a ;
ld PD_CR2, a ;
_Bill
Ну, так оба порта хотел попробовать. Один не получился, сконфигурировал второй. Правда, контроллер у меня другой - STM8S103K.
topkin
При беглом просмотре вашего кода ошибок не видно, может быть Stanislav_S прав про частоту? Попробуйте сделать совсем просто, к примеру как в моем коде или скомпилируйте и прошейте его, поменяв только заголовочник и порт. Плюс ватч дог у вас отключен? Может дело в нем. По умолчанию он должен быть отключен, но, если я не ошибаюсь, конфигурация периферии и ватч дога в частности, задается в options bytes и далее работа контроллера при включении питания будет зависеть от настроект в этих байтах.
_Bill
Цитата(topkin @ May 20 2010, 15:37) *
При беглом просмотре вашего кода ошибок не видно, может быть Stanislav_S прав про частоту? Попробуйте сделать совсем просто, к примеру как в моем коде или скомпилируйте и прошейте его, поменяв только заголовочник и порт. Плюс ватч дог у вас отключен? Может дело в нем. По умолчанию он должен быть отключен, но, если я не ошибаюсь, конфигурация периферии и ватч дога в частности, задается в options bytes и далее работа контроллера при включении питания будет зависеть от настроект в этих байтах.

Я проверял программу с использованием фабричных установок (частота внутреннего генератора / 8 = 2МГц). Разницы абсолютно никакой. И потом, у порта D не работает самый старший разряд, а все остальные, за исключением самого младшего, работают. Пробовал управлять скоростью нарастания на выходе порта при помощи регистра CR2, разница в длительности фронтов заметна, но работоспособности никак не сказывается.
Что касается Watchdog таймера, то он у меня отключен. Даже если бы он был включен, то при правильной работе сигналы на выходах портов все равно были бы видны, разница между периодом Watchdog таймера и цикла программы составляет несколько порядков.
topkin
Уже лучше, ну если эти пины внешне не притянуты к земле или питанию, тогда мистика или что то не так с контроллером
Вообще, на этот раз, я отошел от своих принципов и использую предлагаемые библиотеки ST, в общем, солидарен с "Dog Pawlowa".
_Bill
Цитата(topkin @ May 20 2010, 17:06) *
Уже лучше, ну если эти пины внешне не притянуты к земле или питанию, тогда мистика или что то не так с контроллером
Вообще, на этот раз, я отошел от своих принципов и использую предлагаемые библиотеки ST, в общем, солидарен с "Dog Pawlowa".

Только что попробовал другой контроллер, результат тот же самый. sad.gif
topkin
Очень странно, где то трабл, чудес не бывает. Можете выложить полный код еще раз?
_Bill
Цитата(topkin @ May 21 2010, 09:00) *
Очень странно, где то трабл, чудес не бывает. Можете выложить полный код еще раз?

Нет проблем
Код
    switch    .text
;
; ** InitPorts    -- функция инициализайии портов В/В
;
InitPorts:
    ld    a, #0FFh    ; Initiate ports
    ld    PB_DDR,    a        ;
    ld    PB_CR1,    a        ;
    ld    PD_DDR,    a        ;
    ld    PD_CR1,    a        ;
    ld    PD_CR2,    a        ;
;    ld    a, #LED_MASK ; Установить порт управления LED драйвером на вывод
;    ld    LED_DDR, a    ;
;    ld    LED_CR1, a    ; включить push-pull режим
;    clr    LED_PORT    ; Сбросить порт
    ret
;
; ***** main - головная функция *****
;
_main:
    ldw    x, #RAM_END    ; Инициализировать стек
    ldw    sp, x            ;
    bset    SWEN        ; Switch clock to HSE
    mov    CLK_SWR, #0xB4        ;
    callr    InitPorts    ; Инициализировать порты

1$:        ;;; Бесконечный цикл
;    btjf    TIM_05, 2$    ; Проверить флаг события и переход, если не установлен
;    bres    TIM_05        ; Сбросить флаг
;    callr    Bin2BCD        ; Преобразовать новое значение счетчикак для вывода
;2$:
;    callr    LEDout        ; Вывод значения счетчика на индикатор
    inc    PB_ODR        ; Use ports a a binary counter
    inc    PD_ODR            ;
;    bcpl    PB_ODR, #1
;    bcpl    PD_ODR, #1
;    bcpl    PD_ODR, #6
;    bres    PD_ODR, #0
    jra    1$;;;
Dog Pawlowa
Вот мой "моргающий код" на библиотечных функциях.

Код
void main(void)
{    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    GPIO_DeInit(GPIOD);
    GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);

  for (;;)
  {    GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
  }
}
topkin
Приболел, засем долго не появлялся.
Вы свою проблему так и не победили? Могу только высказать предположение. Максимальная частота изменения пина 10МГц. У вас другом за другомЭ, в общем цикле, идет инкрементирование счетчика(порта), может тут собака зарыта? Попробуйте "подергать" именно проблемными пинами через задежку. Если и это не поможет, то я не знаю даже....
_Bill
Цитата(topkin @ May 25 2010, 13:22) *
Приболел, засем долго не появлялся.
Вы свою проблему так и не победили? Могу только высказать предположение. Максимальная частота изменения пина 10МГц. У вас другом за другомЭ, в общем цикле, идет инкрементирование счетчика(порта), может тут собака зарыта? Попробуйте "подергать" именно проблемными пинами через задежку. Если и это не поможет, то я не знаю даже....

Нет, проблема до сих пор не решена. Собрал вторую плату - ведет себя аналогично первой. Если говорить насчет частоты, то6 во-первых PORTD все-таки работает; во-вторых, изначально я пробовал запускать программу с внутренним генератором (16МГц / 8) и результат был тот же самый. Инкрементирование порта ни чем не отличается от инкрементирования любой другой ячейки памяти (в PIC, кстати сказать, сделано аналогично). Я пробовал по-разному изменять программу. Например, инкрементировал аккумулятор и результат пересылал в порт, инкрементировал один порт (неработающий) и результат пересылал в другой (работающий) порт. Абсолютно нет никакой разницы. Ни один порт толком не заработал.
В общем, пришел к выводу, что дело скорее всего не в программе, а именно в "железе". Правда, единственное в чем я отошел от рекомендаций фирмы, это величина емкости внешнего конденсатора. Фирма рекомендует значения 0.47 - 1.0 мкф. У меня стоит конденсатор номиналом 2.2 мкф. Есть призрачная надежда, что с заменой конденсатора все встанет на свои места. Но ...
topkin
Цитата(_Bill @ May 25 2010, 14:05) *
Нет, проблема до сих пор не решена. Собрал вторую плату - ведет себя аналогично первой. Если говорить насчет частоты, то6 во-первых PORTD все-таки работает; во-вторых, изначально я пробовал запускать программу с внутренним генератором (16МГц / 8) и результат был тот же самый. Инкрементирование порта ни чем не отличается от инкрементирования любой другой ячейки памяти (в PIC, кстати сказать, сделано аналогично). Я пробовал по-разному изменять программу. Например, инкрементировал аккумулятор и результат пересылал в порт, инкрементировал один порт (неработающий) и результат пересылал в другой (работающий) порт. Абсолютно нет никакой разницы. Ни один порт толком не заработал.
В общем, пришел к выводу, что дело скорее всего не в программе, а именно в "железе". Правда, единственное в чем я отошел от рекомендаций фирмы, это величина емкости внешнего конденсатора. Фирма рекомендует значения 0.47 - 1.0 мкф. У меня стоит конденсатор номиналом 2.2 мкф. Есть призрачная надежда, что с заменой конденсатора все встанет на свои места. Но ...

Дам-с, выходит какие то проблемы с железом, поставка такая что ли, я с таким не сталкивался...
oll
Цитата(_Bill @ May 25 2010, 16:05) *
Нет, проблема до сих пор не решена. Собрал вторую плату - ведет себя аналогично первой.

2 _Bill может попробовать проверить железо на Си, а потом перейти к ассемблеру (можно и листинг подсмотреть). Аналогично Dog Pawlowa в IAR сделал пробный проектик моргания штатным светодиодом Discovery с использованием библиотек из примера - по прерыванию 2 таймера светодиодик исправно мигает. Ассемблер STM8 хорош, но на Си хороши и готовые библиотеки - не пришлось сильно копаться в даташите.
_Bill
Цитата(oll @ May 26 2010, 00:23) *
2 _Bill может попробовать проверить железо на Си, а потом перейти к ассемблеру (можно и листинг подсмотреть). Аналогично Dog Pawlowa в IAR сделал пробный проектик моргания штатным светодиодом Discovery с использованием библиотек из примера - по прерыванию 2 таймера светодиодик исправно мигает. Ассемблер STM8 хорош, но на Си хороши и готовые библиотеки - не пришлось сильно копаться в даташите.

Делал я на Си. Попробовал IAR. Разницы абсолютно никакой нет.
topkin
Проверил все пины D - порта, на своем ките, все работает. Что то у вас не то с партией наверное....
_Bill
Цитата(topkin @ May 27 2010, 11:09) *
Проверил все пины D - порта, на своем ките, все работает. Что то у вас не то с партией наверное....

В партии еще осталось 8 штук. Что-то не хочется их все запаивать.
А какой контроллер у вас? Может свой код выложите?
topkin
Контроллер у меня STM8S105C6T6. Я предпочитаю использовать готовые библиотеки, но для вашего случая написал на прямую с регистрами, для более понятного восприятия. Код до безобразия прост, все в одном файле)
Код
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/

#include "STM8S105C6.h"

void GPIO_Conf(void)
{
    PD_DDR = 0xFF;            // all PD pins as output
    PD_CR1 = 0xFF;            // all PD pins output push pull
    PD_CR2 = 0;                    // all PD pins speed 2MHz
    PD_ODR = 0;                    // all set to 0
}


void main()
{
    unsigned long int i;
    
    GPIO_Conf();
    while (1)
    {
        for(i = 0; i < 10000; i++);
            PD_ODR = PD_ODR ^ 0xFF;
    }
}
_Bill
Цитата(topkin @ May 28 2010, 08:52) *
Код до безобразия прост, все в одном файле)

Попробовал как у вас. Никаких изменений. Уже не знаю что и делать.
topkin
Даааа, причина должна быть, чудес не бывает. А больше вариантов никаких нет? Проблема только с этим железом или другие мк от STM8 вы не пробывали? Прям мистика какае то. жаль что вы из другого города, я бы вам дал свой кит для теста, или подарил) второй такой же подаренный лежит без толку)
_Bill
Цитата(topkin @ May 28 2010, 09:49) *
Даааа, причина должна быть, чудес не бывает. А больше вариантов никаких нет? Проблема только с этим железом или другие мк от STM8 вы не пробывали? Прям мистика какае то. жаль что вы из другого города, я бы вам дал свой кит для теста, или подарил) второй такой же подаренный лежит без толку)

Нет, других МК пока нет. Жду когда появится STM8S Discovery в "Промэлектроника".
_Bill
Цитата(_Bill @ May 28 2010, 17:08) *
Нет, других МК пока нет. Жду когда появится STM8S Discovery в "Промэлектроника".

В общем, дело такое. Прошил свою программу в STM8S Discovery. Все работает нормально. Так что, похоже, все упирается в STM8S103K6 (в Discovery стоит STM8S105C6). Или нет?
dimka76
Цитата(_Bill @ Jun 23 2010, 13:27) *
В общем, дело такое. Прошил свою программу в STM8S Discovery. Все работает нормально.


А чем вы прошивали контроллер до появления у вас STM8S-Discovery ?
_Bill
Цитата(dimka76 @ Jun 23 2010, 15:23) *
А чем вы прошивали контроллер до появления у вас STM8S-Discovery ?

ST_Link
fmdost
Цитата(_Bill @ May 25 2010, 14:05) *
В общем, пришел к выводу, что дело скорее всего не в программе, а именно в "железе". Правда, единственное в чем я отошел от рекомендаций фирмы, это величина емкости внешнего конденсатора. Фирма рекомендует значения 0.47 - 1.0 мкф. У меня стоит конденсатор номиналом 2.2 мкф. Есть призрачная надежда, что с заменой конденсатора все встанет на свои места. Но ...


2.2 мкф керамика 0805 y5v?
Если да то надо заменить на электролит аналогичной ёмкости + керамику на 0.1. Звенят эти чЮдоконденсаторы(0805) на мегагерце, ничуть не хуже кварцев cranky.gif.
_Bill
Цитата(Т.Достоевский @ Jun 24 2010, 03:23) *
2.2 мкф керамика 0805 y5v?
Если да то надо заменить на электролит аналогичной ёмкости + керамику на 0.1. Звенят эти чЮдоконденсаторы(0805) на мегагерце, ничуть не хуже кварцев cranky.gif.

У меня стоят танталовые чип. Емкость пробовал ставить и 2.2, и 1.0. Разницы никакой нет.
topkin
Цитата(_Bill @ Jun 23 2010, 13:27) *
В общем, дело такое. Прошил свою программу в STM8S Discovery. Все работает нормально. Так что, похоже, все упирается в STM8S103K6 (в Discovery стоит STM8S105C6). Или нет?

Да, в моих двух экземплярах STM8S - DISCOVERY стоит именно STM8S105C6, думаю и у вас тоже, чай на одной китайской фабрике сделаны. Судя по всему дело было в контроллере, хотя очень странно это все, мне как то слабо верится)
Peps
Мельком просматривая Ваш код (в ассемблере ST8S не силен) обратил внимание, что Вы используете таймер 5, которого в микроконтроллере STM8S103K просто нету (смотрел даташит).
Может быть это как то влияет на работоспособность вашей программы.
Сам сейчас пишу библиотеки инициализации и отлаживаюсь на Discovery но с расчетом на 103 контроллеры, которые буду использовать. Поэтому Ваша проблема меня насторожила.
_Bill
Цитата(Peps @ Jul 9 2010, 09:37) *
Мельком просматривая Ваш код (в ассемблере ST8S не силен) обратил внимание, что Вы используете таймер 5, которого в микроконтроллере STM8S103K просто нету (смотрел даташит).
Может быть это как то влияет на работоспособность вашей программы.
Сам сейчас пишу библиотеки инициализации и отлаживаюсь на Discovery но с расчетом на 103 контроллеры, которые буду использовать. Поэтому Ваша проблема меня насторожила.

Кому вопрос? Если - мне, то я таймер вообще не использую.
ведущий_специалист
Всем привет. Решил прицепить часы реального времени ds1338 к stm8s105c4. Платка самодельная, на ней успешно работает SPI и шим. С I2C получилась проблема. Кое как контроллер все таки начал писать в дску данные. При считывании контроллер висит. При отладке посмотрел что ждет event события. Осцил показывает что sda в нуле. I2C использую аппаратный, причем в "фузах" прошил ремап на другие ноги порта. Всю голову изломал, уже готов сделать все на программном i2c, но движет какой то спортивный интерес.
Прилагаю кусок кода....
Код
void Init_I2C(void)
{


    I2C_Init(400000, 0xD0, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, (u8)16 );

}


//=============Читаем И2ц Часы =========================
unsigned char ds_read(unsigned char address)
{
unsigned char data;
/* генерируем start & ожидаем event detection */
        I2C_GenerateSTART(ENABLE); // i2c_start();
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));   // тут уже висим.......
    
        I2C_Send7bitAddress(0xD0, I2C_DIRECTION_TX);
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
        I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED); // i2c_write(0xD0);
        
         I2C_SendData(address);
         while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // i2c_write(address);

         I2C_GenerateSTART(ENABLE);
         while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));      // i2c_start(); (повторный старт)
        
        
         I2C_Send7bitAddress(0xD0, I2C_DIRECTION_RX);
         while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
         I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);  //       i2c_write(0xD1); (читаем)

          while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
         data = I2C_ReceiveData(); //data=i2c_read(0);
        
        I2C_GenerateSTOP(ENABLE); // i2c_stop();
        return data;
}

//======================Пишем в И2ц Часы ================ (вроде как работает)
void ds_write(unsigned char address, unsigned char data)
{
        I2C_GenerateSTART(ENABLE); // i2c_start();
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT)); //
        // I2C_SendData(0xd0);
        // while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // i2c_write(address);
        
        I2C_Send7bitAddress(0xD0, I2C_DIRECTION_TX);
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
        I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED); // i2c_write(0xD0);
        
        I2C_SendData(address);
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // i2c_write(address);
        
        I2C_SendData(data);
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // i2c_write(data);
        
        I2C_GenerateSTOP(ENABLE); // i2c_stop();

}

void write_time_ds (void)
{
  ds_write(0x00, s);  
  ds_write(0x01, m);
  ds_write(0x02, h);
}


void  get_time_ds(void)
{
  //  
  //
  s = ds_read(0x00);
  m = ds_read(0x01);
  h = ds_read(0x02);
}
проверяю так, сперва вызываю write_time_ds(); потом пытаюсь читать get_time_ds();
вобщем ваши мнения господа
ведущий_специалист
Всем спасибо за ответы....Разобрался сам. Надо перед стоп было ставить NACK
Stanislav_S
Начал мучать потихоньку DISCОVERY, работаю с IAR, создал два проекта - один с использованием стандартной библиотеки периферии, другой без нее - так сказать все руками smile.gif Решил запустить таймер номер 4 и поморгать светодиодиком, однако что то нифига не получается ни руками ни с использованием библиотеки, нет ли у кого примера работы с таймером 4? А то весь моск сломал, но чего то не идет smile3046.gif
oll
Цитата(Stanislav_S @ Jul 20 2010, 20:50) *
Начал мучать потихоньку DISCОVERY, работаю с IAR, создал два проекта - один с использованием стандартной библиотеки периферии, другой без нее - так сказать все руками smile.gif Решил запустить таймер номер 4 и поморгать светодиодиком, однако что то нифига не получается ни руками ни с использованием библиотеки, нет ли у кого примера работы с таймером 4? А то весь моск сломал, но чего то не идет smile3046.gif

для второго таймера не пойдет?
topkin
Цитата(Stanislav_S @ Jul 20 2010, 18:50) *
Начал мучать потихоньку DISCОVERY, работаю с IAR, создал два проекта - один с использованием стандартной библиотеки периферии, другой без нее - так сказать все руками smile.gif Решил запустить таймер номер 4 и поморгать светодиодиком, однако что то нифига не получается ни руками ни с использованием библиотеки, нет ли у кого примера работы с таймером 4? А то весь моск сломал, но чего то не идет smile3046.gif


Один из первых проектов под дискавери, используется таймер 2, зажигает светодиод с частотой 1Гц по прерыванию с использованием библиотек ST. Правда использовался STVD + компилятор от raisonance. С cosmic тоже где то есть, разницы там почти нет, но искать лень. Подогнать под IAR проблем не составит.
Stanislav_S
Ок спасибо, помучаю таймер номер 2, хотя все таки хотелось 4, поскольку из доки нифига не ясно как оно работает, дока пока только удручает своей лаконичностью 07.gif , а за примеры спасибо, буду ломать моск дальше smile.gif
topkin
Цитата(Stanislav_S @ Jul 21 2010, 11:53) *
Ок спасибо, помучаю таймер номер 2, хотя все таки хотелось 4, поскольку из доки нифига не ясно как оно работает, дока пока только удручает своей лаконичностью 07.gif , а за примеры спасибо, буду ломать моск дальше smile.gif

Так с TIM4 должно быть еще проще, ибо он 8-ми разрядный. Что касаемо док от ST то это да, особенно после атмела было тяжко). Но я сейчас привык и кажется что удобно и понятно) Что касаемо микроконтроллеров, то вам нужно 2 доки, одна - по сути саммари конкретно на чип с его характеристиками, а вторая более подробная - reference manual, где подробно расписана вся периферия и прочее.... Удачного освоения

Вот код мерцания светодиодом по прерыванию TIM4, за 5 минут написал, так что не пинайте сильно. Сам проект под STVD + raisonance в прикрепленных файлах. Частота мерцания правда чуть больше герца, с делителями баловаться не стал)
Функция main:
Код
/* MAIN.C file
*
* Copyright (c) 2010, topkin
*/
#include "stm8s.h"

#define LED1             GPIO_PIN_0
#define _1Hz_LSI         0xFE


//*******************************************************************************
//                                                                     Main function
//*******************************************************************************
main()
{
    
    // 1. Initialize HSI CLK
    CLK_DeInit();                                                                                                                                        // after reset Fclk = HSI / 8 = 2MHz
        //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //set prescaler
    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, DISABLE);        // set to LSI

    // 3. GPIO config
    GPIO_DeInit(GPIOD);
        // Configure PD0 (LED1) as output push-pull low (led switched on)
    GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
    
    // 4. TIM4 initialization
    TIM4_DeInit();
    CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);
    TIM4_TimeBaseInit(TIM4_PRESCALER_128,_1Hz_LSI);
    TIM4_SetAutoreload(_1Hz_LSI);
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    TIM4_Cmd(ENABLE);
    
    enableInterrupts();
    
    // Main loop
    while (1){
        
    };
    
}


И прерывание:

Код
void IRQ23Handler (void) interrupt 23
{
    GPIO_WriteReverse(GPIOD, GPIO_PIN_0);                // Blink LED1
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}
Stanislav_S
Ага спасибо заработало, все оказалось просто smile.gif Буду мучать дальше, а вот библиотека их ненравится, больно код пухлый получается, поэтому лучше руками делать ИМХО.
topkin
Цитата(Stanislav_S @ Jul 21 2010, 13:43) *
Ага спасибо заработало, все оказалось просто smile.gif Буду мучать дальше, а вот библиотека их ненравится, больно код пухлый получается, поэтому лучше руками делать ИМХО.

Не за что. Библиотека - согласен, мне тоже не нравится, как более плотно сяду на STM8, так я ее под себя перепишу
Linker
На самом деле разбираться с данным процем по имеющейся документации сложновато - очень много букаф. Пытаюсь разобраться как работает железо используя дизасемблированнный СИ код, однако следовать по лабиринтам сотворенного компилятором кода не хватает сил.
Пытался понять как происходит моргание диодом - замаялся ходить по бесконечным переходам и вызовам подпрограм. Зачем столько кода для такой простой операции? В чем смысл? Может СИшный компилятор так многочисленные железячные баги обходит? Может кто объяснит популярно?
IGK
Цитата(Linker @ Jul 22 2010, 18:51) *
...однако следовать по лабиринтам сотворенного компилятором кода не хватает сил.

Ну, слава Богу! Думал, один я такой тупой:-) Уже с понедельника не могу разобраться с работой сенсорной кнопки - именно по причине того, что засыпаю над ассемблером:-) Правда, сижу за компом по вечерам, после работы на корабле. А там работа то вприсядку, то вприпрыжку:-)
Не думаю, что это попытка замылить что-то не работающее в камне. Скорее, стиль программирования такой.
Но лично для себя уже решил - в пень их библиотеки, буду писать свой код с нуля, по даташиту. Долго, но хоть ошибки свои будут... Типа как я взял с avrfreaks умножение 16х24 для ЦФ и потом много месяцев искал ошибки в алгоритме. А это ассемблерная вставка врала, но только при определенных значениях множителей и не так часто:-( Пока я не догадался устроить тотальную проверку (умножением в столбик). Это первый и, надеюсь, последний раз, когда я пользовался чужими подпрограммами. И написал бы это умножение за час-другой, да лень было. Что, кстати, и пришлось сделать в конце-концов.
Dog Pawlowa
Цитата(IGK @ Jul 22 2010, 19:42) *
Ну, слава Богу! Думал, один я такой тупой:-) Уже с понедельника не могу разобраться с работой сенсорной кнопки

По информации о работе сенсорных кнопок от других производителей, это весьма непростое дело.
Может, не стоит тратить время? wink.gif
topkin
Цитата(Linker @ Jul 22 2010, 19:51) *
На самом деле разбираться с данным процем по имеющейся документации сложновато - очень много букаф. Пытаюсь разобраться как работает железо используя дизасемблированнный СИ код, однако следовать по лабиринтам сотворенного компилятором кода не хватает сил.
Пытался понять как происходит моргание диодом - замаялся ходить по бесконечным переходам и вызовам подпрограм. Зачем столько кода для такой простой операции? В чем смысл? Может СИшный компилятор так многочисленные железячные баги обходит? Может кто объяснит популярно?

Вы имеете ввиду моргание светодиодом по срабатыванию сенсорной кнопки? Я тоже посмотрел тач сенс пример, в общем и целом стало понятно как оно работает, но до мелочей докапываться не стал, ибо времени нет) Кстати, что за Си - компилятор?
IGK
Цитата(Dog Pawlowa @ Jul 22 2010, 20:09) *
По информации о работе сенсорных кнопок от других производителей, это весьма непростое дело.
Может, не стоит тратить время? wink.gif

Я просто хотел убедиться, что кнопки и от СТМ боятся влаги и пота. Решил, для начала, разобраться с алгоритмом. Потом тестовую платку из 4-х кнопок сварганить. А тут такой облом - вызов на вызове, голова пухнет. Хотя, глядя на картинки из док, и не скажешь, что сложный алгоритм.
Да ну их, эти сенсоры. Оставлю кнопки, как было. Тем более, все таймеры, кроме 4-го, заняты под ШИМы.
Ладно, займусь сравнением "пухлости" кода фильтров. Пока не имею понятия, насколько будет оптимален 40-битный МАС по объему кода и скорости. Значит, опять ассемблер рассматривать. А вокруг лето, море. Девушки на пляже, наверное, как минимум топлесс. Но я там еще не был в этом году...

Цитата(topkin @ Jul 23 2010, 07:46) *
Кстати, что за Си - компилятор?

Пока космик. То, что скачал с примерами.
Но у меня фильтры реализованы на ассемблере, так как не смог уместить 4 ФНЧ2 и 4 ПФ1 в 16-ю мегу. МАС 16х24=40 бит, это оптимально для моего сигнала. На первый взгляд камешек не настолько шустрый, чтобы здесь обойтись без ассемблера. И вообще пока непонятно, как в него все упихать :-) Я ведь стал присматриваться к СТМ8 по простой причине: нужно малое потребление (батарейное питание), нужен дешевый, не слишком точный и многоразрядный АЦП. 18 разрядов, как минимум. Тут хорошо работает связка ЦАП-АЦП, с оверсемплингом можно получить 19-20 бит. Это все есть на борту, и за смешные деньги. И место должно все это занимать как можно меньше. На отдельных микрухах никак не складывалось, чего только я туда не тыкал... То АЦП дорогой, то быстродействие маловато, то ЦАПа дешевого не купить. Там, где это в одном флаконе, так флакон дорогущий и поставки на Украину проблематичны. А тут в свободной продаже и недорого:-)
Но, как всегда - только начал им заниматься, как один за другим начали выходить из строя разные приборы. Жара в этом году несусветная. 2012 и не дождемся, наверное...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.