72 сообщения в этой теме

i80186    10

хотел уточнить насчёт изменения скорости 2/10мГц.

это скорость с которой может ножка дергаться? Это зависит от внутреннего кварца? А если использовать внешний кварц, тогда как скорость регулировать?

Отправлено с моего Wileyfox Swift через Tapatalk

Там не 2/10МГц, там до 2 или до 10 МГц, и зависит это от частоты тактирования. Т. е. при любом источнике, хоть внутренним хоть внешним, режим FAST (до 10Мгц) заставляет действовать порт без ограничений скорости, а обычный режим вносит замедление переключений. Само собой скорость кратна текущей тактовой частоте. Коэффициент кратности не указан в описалове, тут я без понятия, как то не особо вникал, но можно наверное где то в дебрях их офф. сайта найти.

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
admin    2 236

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

А также подготовлен он-лайн тест. После просмотра видео вы можете проверить себя как вы усвоили материал.

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


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

Конспект к лекции 4.

Тема урока: "Тактовые генераторы"

1. Регистры управления статусом встроенных тактовых генераторов (CLK_ICKR) Internal clock register17d80d4e7ed6.jpg

Address offset: 0x00

Reset value: 0x01

Биты 7 и 6 - зарезервированы

5-й бит:

REGAH - Regulator Active-halt (переключатель Активен - Остановка)

REGAH (rw) Отключает программно внутренний источник питания ядра процессора (используется для понижения энергопотребления)

0: Основной регулятор напряжения ВКЛЮЧЕН, положение Active-halt mode - ON

1: Основной регулятор напряжения ВЫКЛЮЧЕН, положение Active-halt mode - OFF (время пробуждения увеличивается)

LSIRDY - Low speed internal ready (готовность низкоскоростного тактовый генератора)

4-й бит:

LSIRDY (r) Бит готовности низкоскоростного тактового генератора (устанавливается аппаратно)

0: Низкочастотный тактовый генератор НЕ ГОТОВ (LSI clock not ready)

1: Низкочастотный тактовый генератор ГОТОВ (LSI clock ready)

LSIEN- Low speed internal enable (Влючене низкоскоростного тактовый генератора)

3-й бит:LSIEN (rw) Бит включения низкоскоростного тактового генератора (Устанавливается программно или аппаратно если необходим низкочастотный тактовый генератор)

0: Низкочастотный тактовый генератор ВЫКЛЮЧЕН (LSI - off)

1: Низкочастотный тактовый генератор ВКЛЮЧЕН (LSI - On)

2-й бит:FHWU (rw) Быстрое пробуждение из режима "Активен/Активная-остановка"

0: Быстрое пробуждение из режима "Активен/Активная-остановка ОТКЛЮЧЕНА (Halt/Active-halt - off)

1:Быстрое пробуждение из режима "Активен/Активная-остановка ВКЛЮЧЕНА (Halt/Active-halt - on)

HSIRDY- High speed internal ready

1-й бит:HSIRDY(r) Сигнализация о готовности высокочастотного встроенного тактового генератора. (Устанавливается аппаратно)

0: Высокочастотный тактовый генератор НЕ ГОТОВ (HSI clock not ready)

1: Высокочастотный тактовый генератор ГОТОВ (HSI clock ready)

HSIEN- High speed internal enable

0-й бит:HSIEN (rw) Бит включающий встроенный высокочастотный тактовый генератор. (Устанавливается программно или аппаратно если необходим высокочастотный тактовый генератор)

0: Высокочастотный тактовый генератор ВЫКЛЮЧЕН (HSI - off)

1: Высокочастотный тактовый генератор ВКЛЮЧЕН (HSI - on)

2. Регистры управления внешним тактовым генератором (CLK_ECKR) External clock register

655b3c2fe40b.jpg

Address offset: 0x01

Reset value: 0x00

Биты с 7 по 2 - зарезервированы

HSERDY- High speed external enable

1-й бит:HSERDY (r) Готовность высокочастотного внешнего тактового генератора

0: Высокочастотный внешний тактовый генератор НЕ ГОТОВ (HSE clock not ready)

1: Высокочастотный внешний тактовый генератор ГОТОВ (HSE clock ready)

HSEEN- High speed external enable

0-й бит:HSEEN (rw) Разрешение работы высокочастотного внешнего тактового генератора

0: Высокочастотный внешний тактовый генератор ВЫКЛЮЧЕН (HSE clock off)

1: Высокочастотный внешний тактовый генератор ВКЛЮЧЕН (HSE clock on)

3.1 Регистр статуса генератора CLK_CMSR Clock master status register

f65e0f05f5b1.jpg

Address offset:0x03

Reset value: 0xE1

CKM - Clock master status bits

CKM (r) Эти биты устанавливаются и сбрасываются аппаратно.

0xE1 - HSI выбран высокочастотный внутренний тактовый генератор

0xD2 - LSI выбран низкокочастотный внутренний тактовый генератор

0xB4 - HSE выбран внешний высокочастотный тактовый генератор

3.2 Регистр переключения генератора CLK_SWR Clock master swith register

6260df8661a8.jpg

Address offset: 0x04

Reset value: 0xE1

SWI (rw) Эти биты устанавливаются и сбрасываются

0xE1 - HSI выбран высокочастотный внутренний тактовый генератор

0xD2 - LSI выбран низкокочастотный внутренний тактовый генератор

0xB4 - HSE выбран внешний высокочастотный тактовый генератор

пример кода:

const unsigned char HSE=0xb4; //внешний генератор

CLK_SWR=HSE; //записываем новое значение типа генератора

4. Регистр контроля переключения CLK_SWCR Switch control register

551570cc5151.jpg

Address offset: 0x05

Reset value: 0xXX

Биты с 7 по 4 - зарезервированы

SWIF- switch interrupt flag

3-й бит:SWIF (rc_w0) Бит флага прерывания по переключению

0 Переключение не завершено, генератор не готов (Target clock source not ready)

1 Переключение завершено, генератор готов (Target clock source ready)

SWIEN- switch interrupt enable

2-й бит:SWIEN (rw) Разрешение прерывания по переключению

0 Прерывание запрещено (Clock switch interrupt disabled)

1 Прерывание разрешено (Clock switch interrupt enabled)

SWEN- switch enable

1-й бит:SWEN (rw) Бит разрешения переключения

0 Переключение между генераторами запрещено (Disable clock switch execution)

1 Переключение между генераторами разрешено (Enable clock switch execution)

код: CLK_SWCR_SWEN=1; //разрешаем переключение между генераторами

SWBSY- switch busy

0-й бит:SWBSY (rw) Бит сигнализирующий что идет переключение

0 Переключение между генераторами завершено (No clock switch ongoing)

1 Происходит переключение между генераторами (Clock switch ongoing)

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

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


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

5. Регистр делителей CLK_CKDIVR Clock divider register

d29906952a92.jpg

Address offset: 0x06

Reset value: 0x18

Биты с 7 по 5 - зарезервированы

4й и 3-й бит:HSIDIV (rw) Задаем предделитель для высокочастотного HSI тактового генератора

00 f HSI = f HSI RC output /1

01 f HSI = f HSI RC output /2

10 f HSI = f HSI RC output /4

11 f HSI = f HSI RC output /8

0й, 1й и 2-й бит:CPUDIV(rw) Задаем предделитель для микропроцессора.

000: f CPU = f MASTER / 1

001: f CPU = f MASTER / 2

010: f CPU = f MASTER / 4

011: f CPU = f MASTER / 8

100: f CPU = f MASTER / 16

101: f CPU = f MASTER / 32

110: f CPU = f MASTER / 64

111: f CPU = f MASTER / 128

6 регистр тактирования переферии CLK_PCKENR1 Peripheral clock gating register

0eaf44de6a3c.jpg

Address offset: 0x07

Reset value: 0xFF

Периферийные устройства генератора тактовых импульсов

0 f MASTER Недоступна для переферии (f MASTER to peripheral disabled)

1 f MASTER Доступна для переферии (f MASTER to peripheral enabled)

PCKEN17 - TIM1

PCKEN16 - TIM3

PCKEN15 - TIM2 / TIM5

PCKEN14 - TIM4 / TIM6

PCKEN13 - UART 1/2/3/4

PCKEN12 - UART 1/2/3/4

PCKEN11 - SPI

PCKEN10 - I2C

7 регистр тактирования переферии CLK_PCKENR2 Peripheral clock gating register

a88dd4d425de.jpg

Address offset: 0x0A

Reset value: 0xFF

Периферийные устройства генератора тактовых импульсов

0 f MASTER Недоступна для переферии (f MASTER to peripheral disabled)

1 f MASTER Доступна для переферии (f MASTER to peripheral enabled)

PCKEN27 - CAN

PCKEN26 - Зарезервирован

PCKEN25 - Зарезервирован

PCKEN24 - Зарезервирован

PCKEN23 - ADC

PCKEN22 - AWU

PCKEN21 - Зарезервирован

PCKEN20 - Зарезервирован

8. регистр безопасности CLK_CSSR Clock security system register

d2f892a2eeb9.jpg

Address offset: 0x08

Reset value: 0x00

Биты с 7 по 4 - зарезервированы

CSSD -Clock security system detection

3-й бит:CSSD (rc_w0) Бит определяющий сбой

0: внешний генератор частоты не обнаружен (CSS is off or no HSE crystal clock disturbance detected.)

1: внешний генератор частоты обнаружен (HSE crystal clock disturbance detected)

CSSDIE -Clock security system detection interrupt enable

2-й бит:CSSDIE(rw) Бит разрешающий прерывания по событию (не обнаружен кварц)

0: Запрещено (Clock security system interrupt disabled)

1: Разрешено (Clock security system interrupt enabled)

CSSDIE -Clock security system detection interrupt enable

1-й бит:AUX (r) Бит состояния встроенного тактового генератора включен/выключен

0: встроенный тактовый генератор выключен(Auxiliary oscillator is off.)

1: Встроенныйтактовый генератор включен на частоте HSI/8 (Auxiliary oscillator (HSI/8) is on and selected as current clock master source)

CSSEN -Clock security system enable

1-й бит:CSSEN(rwo) Бит включающий этот узел безопасности

0: выключен (Clock security system off)

1: включен (Clock security system on)

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

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


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

9.Регистр конфигурации выходной тактовой частоты CLK_CCOR Configurable clock output register

60f3ac171abb.jpg

Address offset: 0x09

Reset value: 0x00

Бит 7 - зарезервирован

CCOBSY: Configurable clock output busy

6-й бит:CCOBSY(r) Бит состояния

0: Тактовый генератор не занят (CCO clock not busy)

1: Тактовый генератор занят (CCO clock busy )

CCORDY: Configurable clock output ready

5-й бит:CCORDY(r) Данный узел осуществил переключение и готов к выдаче тактовой частоты

0: Тактовый генератор не занят (CCO clock not available)

1: Тактовый генератор занят (CCO clock available)

CCOSEL[3:0]: Configurable clock output selection.

с 4й по 1-й бит:CCOSEL(rw) Выбираем частоту которую будем выдавать наружу.

0000 f HSIDIV

0001 f LSI

0010 f HSE

0011 Резерв

0100 f CPU

0101 f CPU /2

0110 f CPU /4

0111 f CPU /8

1000 CPU /16

1001 f CPU /32

1010 f CPU /64

1011 f HSI

1100 f MASTER

1101 f CPU

1110 f CPU

1111 f CPU

c1e04eb44696.jpg

Ручное управление генератором:

690f92e1a20a.jpg

2a15158a73fb.jpg

Вопросы по лекции 4:

- то есть можно устройству использовать частоту 24 МГц а процессор питать от 24МГц / 8 / 128 = 234КГц?

- REGAH - что значит отключает внутренний источник питания ядра процессора? Отключить процессор от питания вообще, или в процессоре есть какая то своя батарейка? За что эта батарейка отвечает?

- у регистра CLK_SWCR бит SWIF что означает запись - rc_w0? read clock..... а w0 что?

- у регистра CLK_CSSR бит CSSEN что означает запись rwo?

- что означает запись в заглавии описания каждого регистра CLK_CKDIVR и им подобным: Address offset: 0x06 и Reset value: 0x18?

- как происходит работа регистра калибровки тактового генератора (CLK_HSITRIMR)?

- что означает 7:0 в таблице регистра CLK_CMSR и CLK_SWR?

- регистр CLK_CMSR указывает на f master?

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


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

Про 24 МГц, нет так для внешнего нельзя. Так можно только для внутреннего. Т. е. 16 000 000/8/128, для внешнего только /128.

Про источник питания ядра. Это было в первом или втором ролике, и это ещё будет более подробно. Питания ядра осуществляется от 1,8В, внутри встроенный стабилизатор напряжения , вот он и отключается.

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

rw0 - обозначает, что бит может читаться множество раз, но записать его можно только единожды.

Adress offset - физический адрес регистра в памяти микроконтроллера, Reset Value - состояние принимаемое регистром после сброса.

[7:0] - обозначает разрядность регистра - байт, т. е. невозможно побитовое чтение/запись, компилятор будет ругаться.

CLK_CMSR показывает какой из генераторов сейчас используется в качестве тактового для системы.

В принципе все обозначения для каждого бита/регистра типа rc_rw0 описываются прямо в описание, и искать весь перечень таких сокращений не нужно. Можно просто перевести. Но если нужно, я поищу полную таблицу.

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

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


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

Хотел уточнить по уроку 3 Конфигурация выводов.

Вот у меня есть код, но он не включает светодиод. Почему?

Ведь регистр CR1 если он равен нулю, то он принимает значение - стандартный выход. Но при значении 0, ничего на ножке нет, кроме скачущего напряжения (замерить тостером его невозможно). Тогда что же это за стандартный выход? И в каких случаях его используют?

int main( void )
{
PB_DDR_bit.DDR2=1; // направление - выход
PB_CR1_bit.C12=0; // стандартный выход
PB_CR2_bit.C22=0; // 2МГц
PB_ODR_bit.ODR2=1; // выход включен
return 0;
}

И второй вопрос:

Почему в окне whaсh1

- значения a и b недоступны?

- почему значение с он вообще не показывает?

c191d038d3e7.jpg

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


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

Потому что включается светодиодом нулём, ну в STM8S-DISCOVERY так по схеме сделано. Да и сам светодиод подключён к PD0. И когда CR1 "0", тогда открытый исток, надо туда "1" для "стандартного выхода".

Не доступны, видимо потому, что объявляются внутри основной функции. Зачем их там объявлять то вообще? Лучше на верх их самый, вон туда где #include. Функция она как бы всегда вызвана, память, занятая этими переменными, никогда не освободится. Вот видимо разработчики среды и не понимали зачем, и закрался баг. Просто не надо внутри основной функции их объявлять, смысла нет. А переменная "с" вообще не объявляется, точнее операция с двумя другими переменными выполняется прям при её объявление, так делать не хорошо.

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

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


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

все таки не очень понятно, а каких случаях используется регистр CR1 со значением 0? Почему при значении 0 на выходе шалтай болтай с напряжением?

Отправлено с моего Wileyfox Swift через Tapatalk

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


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

все таки не очень понятно, а каких случаях используется регистр CR1 со значением 0? Почему при значении 0 на выходе шалтай болтай с напряжением?

Отправлено с моего Wileyfox Swift через Tapatalk

Так я же уже пояснял. Например питание микроконтроллера 5В, необходимо подключить низковольтную логику, скажем 1,28В. Включаем этот режим, вешаем подтягивающий резистор к 1,28В, имеем выходной сигнал для низковольтной логики. Шалтай болтай именно потому, что единицы нет, только ноль, единицу нужно внешним резистором задавать. Фактически, когда на выход должна быть подана единица в таком режиме, а резистора нет, вывод и болтается в воздухе, он просто отключён.

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

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


Ссылка на сообщение
Поделиться на других сайтах
IDis    4
Например питание микроконтроллера 5В, необходимо подключить низковольтную логику, скажем 1,28В. Включаем этот режим, вешаем подтягивающий резистор к 1,28В, имеем выходной сигнал для низковольтной логики. Шалтай болтай именно потому, что единицы нет, только ноль, единицу нужно внешним резистором задавать

Пытался медитировать... но просветления не наступило.

- имеем сигнал.

- на выходе ноль.

Что это за сигнал такой в виде нуля?

Если мы на эту ножку подаем 1.28В тогда почему она считается выходом на не входом?

И как происходит управление низковольтной нагрузкой?

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

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


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

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

https://ru.wikipedia.org/wiki/%D0%9A%D0%9C%D0%9E%D0%9F

Вот там на рисуночке верхний транзистор как бы отключён.

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


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

А как использовать прерывания на выходах? (не через таймер)

Не подскажите как программно реализовать следующее:

- включен светодиод

- Когда на ножке А2 сигнал меняется с 1 на 0

- используем прерывание и выключаем светодиод

Какие регистры для этого используются?

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


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

Там отдельные регистры в контроллере прерываний есть для настройки прерываний от портов, про это ещё не было уроков.

Т.е. в регистре EXTI_CR1 надо для соответствующего порта биты выставить.

Собственно а для чего прерывание?

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


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

в качестве тренировки. Кстати было бы классно давать домашнее задание к урокам.

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


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

DOC000954191.jpg

Скоро опубликуют видео с практикой. Там датчик заднего хода - ультразвуковой измеритель расстояния. Есть возможность для творчества. Например его в измеритель уровня переделать. Правда надо датчик HC-SR04 иметь.

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

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


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

Пытаюсь разобраться сo счетчиком.

- на 15 мин. лекции 4 вы сказали что задаем значение для TIM4_ARR=100; и он дальше сравнивает со значением счетчика, счетчик это TIM4_CNTR . Но вы нигде этот регистр не использовали. Да и в режиме отладки он не показывает значение TIM4_CNTR.

- почему vector =TIM4_OVR_UIF_vector? откуда мы берем TIM4_OVR_UIF_vector?

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

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


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

В настройках таймера загружается значение в регистр автозагрузчика TIM4_ARR. Это делается только один раз. И показывает он значение таймера.

Значение векторов прерывания в заголовочном файле в самом низу.

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


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

#include <iostm8s105c6.h>
void main (void)
{
TIM4_CR1_CEN=1; // включили таймер
TIM4_CR1_ARPE=1; //разрешаем автолоадер
int a=0;
TIM4_ARR=7;
if (TIM4_ARR==TIM4_CNTR)
	 a=3;
else
       a=1;
}

как увидеть чему равен счетчик?

И как мне сосчитать до 7?

почему я не вижу значение а в окне watch?

b724c69a40d1.jpg

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

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


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

Объявляй переменные вне основной функции(вне main)

TIM4_ARR и TIM4_CNT сравнивать не надо. Это автоматически происходит. Просто проверяй флаг UIF, когда он становиться равен 1, то произошло событие переполнения счётчика/превышение его значение над регистром ARR.

Если просто для попробовать, то величину ARR побольше сделай, так смотреть удобнее будет.

Т. е. должно быть как то так.

#include <iostm8s105c6.h>

int a=0;

void main (void)

{

TIM4_CR1_CEN=1; // включили таймер

TIM4_CR1_ARPE=1; //разрешаем автолоадер

TIM4_ARR=7;

if (TIM4_SR_UIF==1){

a=3;

TIM4_SR_UIF=0;

}

else {

a=1;

}

}

После if, else, и прочих операторов кавычки ставить надо.

И программу надо зациклить, так она только один раз выполниться. Например так.

#include <iostm8s105c6.h>

int a=0;

void main (void)

{

TIM4_CR1_CEN=1; // включили таймер

TIM4_CR1_ARPE=1; //разрешаем автолоадер

TIM4_ARR=7

loop:

if (TIM4_SR_UIF==1){

a=3;

TIM4_SR_UIF=0;

}

else {

a=1;

}

goto loop;

}

И да, побольше величину в ARR, ну что бы видно было как таймер насчитывает. Так слишком быстро происходит счёт, можно и не увидеть число 7, потому что пока операторы выполняются регистры отладчиком не обновляются, у тебя сейчас всего восемь тактов на таймере до переполнения, не знаю сколько if else выполняется, можешь просто не увидеть. Ну или предделитель задай.

Если надо именно момент увидеть когда таймер стал больше какого то числа, то проверяешь сам регистр счётчика таймера, т. е. так.

loop:

if (TIM4_CNTR>=6){

a=3;

}

else {

a=1;

}

goto loop;

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
IDis    4
Объявляй переменные вне основной функции

То есть все переменные должны быть объявлены глобально?

И это надо делать для всех функций?

И для цикла for такая же ерунда? То есть нельзя написать for (int i; i>0; i++){}?

Я так и не нашел, где можно глянуть значение таймера? Вы в лекции об этом не упоминали.

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


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

Нет не все конечно. Только те, что в функции main. И в циклах не надо объявлять, это просто нечитаемо.

А значение таймера - регистр TIM4_CNTR. Это собственно и есть сам таймер.

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

Так то, по стандартам языка, можно и в функции main объявлять, но вот не нравиться это среде и отладчику. Но вот в операторе это точно делать не стоит.

Т. е. каждую переменную, ну или массив, отдельной строкой всегда. Всегда в начале функции/файла. Всегда с комментарием.

Именно в начале не от того, что по другому работать не будет. Возможно и будет, просто разбираться в программе будет сложно, если будет иначе.

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

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


Ссылка на сообщение
Поделиться на других сайтах
IDis    4
значение таймера - регистр TIM4_CNTR. Это собственно и есть сам таймер.

в упор не вижу. Регистр этот в нуле.

4ec47a6b5b4b.jpg

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


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

Так с STM8S-DISCOVERY или просто на симуляторе? Симулятор не обеспечивает работу периферии.

Ну да на симуляторе, конечно оно и не будет показывать. С самого начала про этого говорилось. Надо "живое" устройство. Это или что то своё, использующие ST-LINK, или STM8S-DISCOVERY.

Он не дорогой, в районе 1000р., в зависимости от места покупки. Очень стоит его купить. Там сразу два устройства - ST-LINK и платка с процессором.

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

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


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

Возник еще вопрос:

если и процессор и таймер тактируются от одного генератора (HSI)

То интересно, почему значения таймера отличаются от значения тактов процессора.

У процессора прошло 13 тактов а у таймера значение - 24

Что считает процессор понятно, один такт это передача 8 байт информации.

А таймер что считает?

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Pivowar
      Всем привет!
      Мы ищем человека которому интересно заниматься проектированием схем, плат и созданием своих устройств. Мы стартап-команда, занимающаяся разработкой IoT, на основе различных микроконтроллеров с последующей интеграцией с облачными технологиями. Так же имеется большое количество проектов по разработке программно-аппаратных решений "под ключ". Для всего этого необходимо проектировать схемы, разрабатывать прототипы, подбирать различные модули и компоненты, создавать gerber файлы и подготавливать это все для производства. Прошу на обсуждение всех заинтересовавшихся. 
      Наше место дислокации: г. Москва, СЗАО, метро "Октябрьское Поле"
    • Гость Vlad_krsu
      Автор: Гость Vlad_krsu
      Разбираюсь с микросхемой UC3825. Есть работающая схема контроля скважности выходного сигнала переменным резистором, подключенным к ноге 8. Приложена к посту
      Задался целью управлять этой микросхемой не переменным резистором, а с помощью ШИМ от 5в микроконтроллера. Насколько я понял по даташиту UC3825 может работать по току и по напряжению и теоретически это возможно.
      Есть ли кто ни будь, кто хорошо разбирается в функционале это микрухи? Как можно подключить к ней МК и будет ли она работать от входного ШИМ сигнала, частотой скажем 1кГц?

    • Автор: ekaterina_b
      Команда проекта расположена в разных странах, но большинство технических специалистов находятся в России, а именно в Санкт-Петербурге. Само назначение проекта - создание умной потребительской электроники, гаджетов и онлайн-сервисов. Отличительной особенностью этой работы является возможность участия в создании инновационных, нестандартных продуктов. Если тебе это по душе, то откликайся! В связи с расширением мы ищем Инженера-схемотехника.
      Обязанности:
      Разработка электрических принципиальных схем; Выбор элементной базы; Трассировка печатных плат; Техническое сопровождение изготовления опытных образцов, отладка и настройка; Требования:
      Знание и опыт работы с AltiumDesigner; Опыт работы в сфере радио и высокочастотной электроники. Условия:
      Дружная команда единомышленников; Уютный офис в центре города Конкурентоспособная заработная плата; Фрукты и сладости в офисе; Полное обеспечение всеми необходимыми в работе учебными материалами; Возможность участие в отраслевых мероприятиях.
    • Автор: Wenter
      Суть программы нажали на кнопку ушли в прерывание, в прерывании от кнопки поменяли уровень на порту со светодиодом, порт с LED соединён с другим портом на котором тоже есть прерывание при переходе из 0 в 1, Соответственно при нажатии кнопки ушли в прерывание там выставили смену уровня на другой ноге и должно сработать другое прерывание. Проблема, прерывание от кнопки работает, прерывание от смены уровня нет. Хотя этаже программа работала, плата STM8L152C6T6 пере прошивалась затем залилась этаже прога и не заработала.
      Ещё вопрос при прерывании от кнопки устанавливается бит флага  EXTI_SR1_bit.P1F а чтоб его сбросить почему то работает EXTI_SR1_bit.P2F=0; а не EXTI_SR1_bit.P1F=0;
      Код программы полностью: В IAR
      /*
      *15.11.2016
      *STM8L152C6T6
      *
      *Измерять таймером задержку от нажатия кнопки до начала генерации
      */
      #include "iostm8l152c6.h"
      int perep;
      unsigned int tic;
      /**************Обработка вектора прерывания от кнопки**************/
           #pragma vector=EXTI1_vector
           __interrupt void Pin1_interrupt(void)
           {
             EXTI_SR1_bit.P2F=0;//Сброс флага прерывания
             TIM1_CR1_bit.CEN = 1; //Запускаем таймер
             PC_ODR_bit.ODR7^=1; //Инверсия порта С7
           }
      /**************Обработка вектора прерывания от начала генерации**************/
         
       #pragma vector=EXTI6_vector
           __interrupt void Pin6_interrupt(void)
           {
             EXTI_SR1_bit.P2F=0;//Сброс флага прерывания
              TIM1_CR1_bit.CEN = 0; //Останавливаем  таймер
              tic=TIM1_CNTRL;
             PE_ODR_bit.ODR7^=1; //Инверсия порта E7
             
           }
      /************************При переполнении таймера*******************************************************/
       /*#pragma vector=TIM1_OVR_UIF_vector
           __interrupt void TIM1_OVF(void)
           {
             //perep++;
             
           }*/
      int main( void )
      {
      /***************Выберем частоту SYSCLK************/
        //По умолчанию тактируемся от HSI/8
        CLK_CKDIVR=0;// Выбираем делитель на 1
       
      /********Инициализация пина который моргает Светодиодом ИИИИИИИИИИИИИИИНДИКАЦИЯ********/  
        PC_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход
        PC_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать
        //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком
        //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход)
       
        /********Инициализация пина который моргает Светодиодом********/  
        PE_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход
        PE_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать
        //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком
        //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход)
      /****************************************************************************************/  
       
       /*****************ПРЕРЫВАНИЕ ОТ КНОПКИ****************************************************************************/
        /*С начало настраиваем пины с кнопкой*/
        PC_DDR_bit.DDR1 =0; //Настраиваем 1й пин порта C на вход
        PC_CR1_bit.C11=1; //Настроили порт кнопки на вход pull-up
        PC_CR2_bit.C21=1; //Размещаем прерывание
       
        /***************Настройка прерываний**************/
        /*В регистре EXTI_CONF1 по умолчанию все 0
          тоесть каждый пин даёт нам отдельное прерывание*/
       
        //Настраиваем фронт срабатывания прерывания
        //Т.к. кнопка замыкается на землю то выбираем задний фронт
         EXTI_CR1_bit.P1IS=2; //Прерывание на ножке срабатывает по заднему фронту
         //ITC_SPR1_bit.VECT1SPR=0; //Высокий прерывание от нашей кнопки
      /**************************************************************************************************************/
         
      /*********************ПРЕРЫВАНИЕ ПРИ НАЧАЛЕ ГЕНЕРАЦИИ**********************************************************/
        PC_DDR_bit.DDR6 =0; //Настраиваем 6й пин порта C на вход
        PC_CR1_bit.C16=1; //Настроили порт  на вход pull-up
        PC_CR2_bit.C26=1; //Размещаем прерывание
       
        /***************Настройка прерываний**************/
        /*В регистре EXTI_CONF1 по умолчанию все 0
          то есть каждый пин даёт нам отдельное прерывание*/
       
        //Настраиваем фронт срабатывания прерывания
        //Фронт  прерывания передний
        EXTI_CR2_bit.P6IS=1; //Прерывание на ножке срабатывает по переднему фронту
        //ITC_SPR2_bit.VECT6SPR=3; //Средний приоритет  прерывание от нашей кнопки
         
      /*********Настройка таймера TIM1***************************/
        CLK_PCKENR2_bit.PCKEN21 = 1; //Включаем тактирование таймера TIM1
        //Делитель на 160
        //НО выставляем 15(так как всегда +1)
        TIM1_PSCRH = (15) >> 8;
        TIM1_PSCRL = (15)& 0xFF;
        TIM1_PSCRH = (0) >> 8;
        TIM1_PSCRL = (0)& 0xFF;
        //Счет по умолчанию вверх TIM1_CR1 DIR=0
        //Значение регистра сравнения(До чего тикает таймер)
        TIM1_ARRH = (10000) >> 8;
        TIM1_ARRL = (10000)& 0xFF;//Частота переполнений = 16М / 1600 / 10000 = 1 Гц
       /*Новый пред делитель в таймер записывается только после  события Update (Update Event — UEV)
         чтоб сразу инициализировать нужный пред делитель
         вызовем программно Update (Update Event — UEV), и чтоб в это время не уйти в какое нибудь
         прерывание разрещим прерывание только от переполнения таймера */
        TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
        TIM1_EGR_bit.UG = 1;  //Вызываем Update Event
        TIM1_IER_bit.UIE = 0; //Запрещаем прерывание при совпадении с ARR
        TIM1_CR1_bit.CEN = 0; //не Запускаем таймер
       
         asm("RIM");//Глобальное разрешение прерываний
         
        while(1)
        {
        }
      }
       
    • Автор: rampage17
      Доброго времени суток всем.
       
      В данный момент работаю над небольшим проектом.
      Имеется готовая модель rc-вертолета ( T605 SHUTTLE ), необходимо поставить на него микроконтроллер, гироскоп и акселерометр (думаю использовать MPU-6050 и MPU-9250) и написать для него мозги.
      МК должен принимать данные с датчиков, выполнять работу по стабилизации вертолета, посылать ШИМ-сигнал.
      Какой лучше подобрать микроконтроллер, который бы подходил под поставленную задачу ? Пока думаю над atmega 128a (просто потому, что имел с ним дело уже).
      P.S. если с программированием проблем возникнуть не должно, то как это всё подобрать, установить, спаять и тд понятия не имею, поэтому буду благодарен любым советам на эту тему
      Спасибо.
  • Сообщения

    • "Вздутики" - это лечение гриппа зеленкой.
      Измериловкку в руки и вперед.
    • Можно и без строба. Данные выдавать быстро, но редко. Засветкой сегментов во время передачи можно будет пренебречь.
    • Так банили уже меня. Я заново зарегистрировался. Не пойму ничего. Может я проклят? Почему меня потом опять забанят? И скажут что я тролль_? Не знаю. Если нельзя создавать темы даже в курилке, то чтьо уже и говорить уже!  Что я такого сделал типа? Вы думаете что я типа один такой, да? Я ходил по другим сайтам и стал таким же, как и те люди что на сайтах. Ну лядно. Так как я уже признался что я нарушил правила меня забанят и второй раз.  Я не наркоман вроде бы. И не алкоголик (хотя иногда так хочеться выпить типа боярышника!). Хоть я и пишу идиотские тексты в вопросах, я вроде бы не нарущаю правила форума .  Ну тогда я здесь не задам своих идиотских вопросов. Правда, знаю я физику или нет Вы никак не сможете узнать и это не имеет никакого значения в тех схемах что я спрашивал. я хотел спросить. дпайте плиз ссылку на пару на Ваший взгляд идиотских формов где можно задавать мои вопросы!
    • Сделай флаг, который будет выставляться при нажатии кнопки. Например: uint8_t blink = 0, press = 0; if(BUTTON_PRESS){ if(press == 0){ press = 1; blink = !blink; } _delay_ms(100); }else{ press = 0; } if(blink){ мигаем } Тут одно нажатие кнопки будет включать мигание, а второе выключать. Переменная press сделана для того, чтобы при удержании кнопки blink не щелкался по кругу.
    • у меня нет достаточно большой коллекции наушников - так померяйте, хотя бы, те, что есть. У друзей на пол часа одолжите. Даже небольшой практический опыт будет ценнее, чем куча беспочвенных догадок.
    • Комрады!   Как на базе, например, Atmega8 сделать устройство с аналоговым входом, который будет принимать сигнал в диапазоне от -10 до +10В с полосой пропускания 100 Гц? Что нужно, кроме делителя напряжения? Как сделать так, чтобы МК понимал, что ему на вход пришло, скажем, именно -4В, а не  +4В?