Перейти к содержанию
    

Проблема состоит в конфигурации портов В/В.

Имею контроллер 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:

Изменено пользователем _Bill

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что если новое значение, записываемое в порт, не успевает передёрнуть уровни, и чтение из порта возвращает старое значение (или, хуже, комбинацию старого и нового)?

IMHO, нужно, чтобы счётчик крутился во внутренней памяти, а наружу выводить копию счётчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IMHO, нужно, чтобы счётчик крутился во внутренней памяти, а наружу выводить копию счётчика.

И так тоже делал, разницы нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема состоит в конфигурации портов В/В.

Так выложите, как Вы конфигурируете, сравню с библиотечными.

Светодиод то моргает. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати каая у вас там ожидаемая частота должна быть на выходе?, потому как там есть еще регистры CR1 и CR2, там максимальная частота ногодрыганья задается, да и выводы в порту имеют разную допустимую частоту ногодрыганья.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так выложите, как Вы конфигурируете, сравню с библиотечными.

Светодиод то моргает. :rolleyes:

Нет светодиод не мигает. Я пока все осциллографом смотрю. А код... вот он

;
; ** 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$;;;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет светодиод не мигает.

У меня диод мигает при использовании функции из библиотеки, содержащей

GPIOx->ODR ^=(u8) mask;

 

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

После обеда гляну с отладчиком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня диод мигает при использовании функции из библиотеки, содержащей

GPIOx->ODR ^=(u8) mask;

 

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

После обеда гляну с отладчиком.

Это все в "железе" работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Взял 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 ;

Изменено пользователем topkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, так оба порта хотел попробовать. Один не получился, сконфигурировал второй. Правда, контроллер у меня другой - STM8S103K.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При беглом просмотре вашего кода ошибок не видно, может быть Stanislav_S прав про частоту? Попробуйте сделать совсем просто, к примеру как в моем коде или скомпилируйте и прошейте его, поменяв только заголовочник и порт. Плюс ватч дог у вас отключен? Может дело в нем. По умолчанию он должен быть отключен, но, если я не ошибаюсь, конфигурация периферии и ватч дога в частности, задается в options bytes и далее работа контроллера при включении питания будет зависеть от настроект в этих байтах.

Изменено пользователем topkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При беглом просмотре вашего кода ошибок не видно, может быть Stanislav_S прав про частоту? Попробуйте сделать совсем просто, к примеру как в моем коде или скомпилируйте и прошейте его, поменяв только заголовочник и порт. Плюс ватч дог у вас отключен? Может дело в нем. По умолчанию он должен быть отключен, но, если я не ошибаюсь, конфигурация периферии и ватч дога в частности, задается в options bytes и далее работа контроллера при включении питания будет зависеть от настроект в этих байтах.

Я проверял программу с использованием фабричных установок (частота внутреннего генератора / 8 = 2МГц). Разницы абсолютно никакой. И потом, у порта D не работает самый старший разряд, а все остальные, за исключением самого младшего, работают. Пробовал управлять скоростью нарастания на выходе порта при помощи регистра CR2, разница в длительности фронтов заметна, но работоспособности никак не сказывается.

Что касается Watchdog таймера, то он у меня отключен. Даже если бы он был включен, то при правильной работе сигналы на выходах портов все равно были бы видны, разница между периодом Watchdog таймера и цикла программы составляет несколько порядков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже лучше, ну если эти пины внешне не притянуты к земле или питанию, тогда мистика или что то не так с контроллером

Вообще, на этот раз, я отошел от своих принципов и использую предлагаемые библиотеки ST, в общем, солидарен с "Dog Pawlowa".

Изменено пользователем topkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже лучше, ну если эти пины внешне не притянуты к земле или питанию, тогда мистика или что то не так с контроллером

Вообще, на этот раз, я отошел от своих принципов и использую предлагаемые библиотеки ST, в общем, солидарен с "Dog Pawlowa".

Только что попробовал другой контроллер, результат тот же самый. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень странно, где то трабл, чудес не бывает. Можете выложить полный код еще раз?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...