Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-май-25 20:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ] 
Автор Сообщение
 Заголовок сообщения: 1886ВЕ4У
СообщениеДобавлено: 2009-май-21 16:01 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 2009-янв-20 10:05
Сообщения: 777
8-ми разрядный микроконтроллер 1886ВЕ4У


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Создание USB-устройства
СообщениеДобавлено: 2010-дек-05 13:42 
Не в сети

Зарегистрирован: 2010-апр-18 12:59
Сообщения: 62
Добрый день. У меня проблема с написанием программы для USB-устройства сданным микроконтроллером. Написал шаблон с описаниями дескрипторов. Но при подсоединении к порту ОС пишет, что устройство не опознано. Запускаю USBView там все поля дескрипторов нулевые. Может что-нибудь подскажете. Тактирование - генератор 48МГц для USB, для ядра - режим LF. Сторожевой таймер отключен. Режим микроконтроллера.

include <1886VE4M.INC>
;*******
TEMP0 EQU 0030h
;*******
org 0h
goto start

intvector1:
org 8h
retfie

intvector2:
org 10h
retfie

intvector3:
org 18h
retfie

intvector4:
org 20h
retfie
;*******
org 100h
USB_Descriptor:
ADDWF PCL,F

;DeviceDescriptor
RETLW 12h ;bLenght 1
RETLW 01h ;bDescriptorType 2
RETLW 10h ;bcdUSB_H 3
RETLW 01h ;bcdUSB_L 4
RETLW 00h ;bDeviceClass 5
RETLW 00h ;bDeviceSubClass 6
RETLW 00h ;bDeviceProtocol 7
RETLW 08h ;bMaxPacketSize0 8
RETLW 34h ;idVendor_H 9
RETLW 12h ;idVendor_L 10
RETLW 78h ;idProduct_H 11
RETLW 56h ;idProduct_L 12
RETLW 01h ;bcdDevice_H 13
RETLW 00h ;bcdDevice_L 14
RETLW 00h ;iManufacturer 15
RETLW 00h ;iProduct 16
RETLW 00h ;iSerialNmber 17
RETLW 01h ;bNumConfigurations 18
;ConfigurationDescriptor
RETLW 09h ;bLenght 19
RETLW 02h ;bDecsriptorType 20
RETLW 00h ;wTotalLenght_H 21
RETLW 20h ;wTotalLenght_L 22
RETLW 01h ;bNumInterfaces 23
RETLW 01h ;bConfigurationValue 24
RETLW 00h ;iConfiguration 25
RETLW 80h ;bmAttributes 26
RETLW 32h ;MaxPower 27
;InterfaceDescriptor
RETLW 09h ;bLenght 28
RETLW 04h ;bDescriptorType 29
RETLW 00h ;bInterfaceNumber 30
RETLW 00h ;bAlternateSetting 31
RETLW 02h ;bNumEndpoints 32
RETLW 00h ;bInterfaceClass 33
RETLW 00h ;bInterfaceSubClass 34
RETLW 00h ;bInterfaceProtocol 35
RETLW 00h ;iInterface 36
;Endpoint1Descriptor
RETLW 07h ;bLength 37
RETLW 05h ;bDescriptorType 38
RETLW 81h ;bEndpointAddress 39
RETLW 02h ;bmAttributes 40
RETLW 00h ;wMaxPacketSize_H 41
RETLW 40h ;wMaxPacketSize_L 42
RETLW 01h ;bInterval 43
;Endpoint2Descriptor
RETLW 07h ;bLength 44
RETLW 05h ;bDescriptorType 45
RETLW 02h ;bEndpointAddress 46
RETLW 02h ;bmAttributes 47
RETLW 00h ;wMaxPacketSize_H 48
RETLW 40h ;wMaxPacketSize_L 49
RETLW 01h ;bInterval 50
;Endpoint3Descriptor
RETLW 07h ;bLength 51
RETLW 00h ;bDescriptorType 52
RETLW 00h ;bEndpointAddress 53
RETLW 00h ;bmAttributes 54
RETLW 00h ;wMaxPacketSize_H 55
RETLW 00h ;wMaxPacketSize_L 56
RETLW 00h ;bInterval 57
;Endpoint4Descriptor
RETLW 07h ;bLength 58
RETLW 00h ;bDescriptorType 59
RETLW 00h ;bEndpointAddress 60
RETLW 00h ;bmAttributes 61
RETLW 00h ;wMaxPacketSize_H 62
RETLW 00h ;wMaxPacketSize_L 63
RETLW 00h ;bInterval 64
;LangCode
RETLW 08h ;bLenght 65
RETLW 03h ;bDescriptorType 66
RETLW 09h ;wLangId[0] 67
RETLW 04h ;wLangId[1] 68
RETLW 09h ;wLangId[2] 69
RETLW 04h ;wLangId[3] 70
RETLW 09h ;wLangId[4] 71
RETLW 04h ;wLangId[5] 72
;String1Descriptor
RETLW 0Ah ;bLength 73
RETLW 03h ;bDescriptorType 74
RETLW 00h ;bString[0] 75
RETLW 00h ;bString[1] 76
RETLW 00h ;bString[2] 77
RETLW 00h ;bString[3] 78
RETLW 00h ;bString[4] 79
RETLW 00h ;bString[5] 80
RETLW 00h ;bString[6] 81
RETLW 00h ;bString[7] 82
;String2Descriptor
RETLW 0Ah ;bLength 83
RETLW 03h ;bDescriptorType 84
RETLW 00h ;bString[0] 85
RETLW 00h ;bString[1] 86
RETLW 00h ;bString[2] 87
RETLW 00h ;bString[3] 88
RETLW 00h ;bString[4] 89
RETLW 00h ;bString[5] 90
RETLW 00h ;bString[6] 91
RETLW 00h ;bString[7] 92
;String3Descriptor
RETLW 0Ah ;bLength 93
RETLW 03h ;bDescriptorType 94
RETLW 00h ;bString[0] 95
RETLW 00h ;bString[1] 96
RETLW 00h ;bString[2] 97
RETLW 00h ;bString[3] 98
RETLW 00h ;bString[4] 99
RETLW 00h ;bString[5] 100
RETLW 00h ;bString[6] 101
RETLW 00h ;bString[7] 102
;String4Descriptor
RETLW 1Ah ;bLength 103
RETLW 03h ;bDescriptorType 104
RETLW 00h ;bString[0] 105
RETLW 00h ;bString[1] 106
RETLW 00h ;bString[2] 107
RETLW 00h ;bString[3] 108
RETLW 00h ;bString[4] 109
RETLW 00h ;bString[5] 110
RETLW 00h ;bString[6] 111
RETLW 00h ;bString[7] 112
RETLW 00h ;bString[8] 113
RETLW 00h ;bString[9] 114
RETLW 00h ;bString[10] 115
RETLW 00h ;bString[11] 116
RETLW 00h ;bString[12] 117
RETLW 00h ;bString[13] 118
RETLW 00h ;bString[14] 119
RETLW 00h ;bString[15] 120
RETLW 00h ;bString[16] 121
RETLW 00h ;bString[17] 122
RETLW 00h ;bString[18] 123
RETLW 00h ;bString[19] 124
RETLW 00h ;bString[20] 125
RETLW 00h ;bString[21] 126
RETLW 00h ;bString[22] 127
RETLW 00h ;bString[23] 128

start:
CALL USB_Init
MOVLB Bank4
USB_WaitSetup:
BTFSS USB_STAT,5
goto USB_WaitSetup
BCF USB_STAT,4
MainLoop:
goto MainLoop

USB_Init:
MOVLB Bank1
CLRF TEMP0,F
USB_LoadDescr:
MOVFP TEMP0,DESC_ADR
MOVFP TEMP0,WREG
CALL USB_Descriptor
MOVFP WREG,DESC_DATA
INCF TEMP0,F
BTFSS TEMP0,7
goto USB_LoadDescr
MOVLB Bank0
MOVLW 40h
MOVWF EP1_CFG1
MOVWF EP2_CFG1
MOVLW 04h
MOVWF EP1_CFG2
MOVLW 02h
MOVWF EP2_CFG2
MOVLB Bank4
MOVLW 03h+08h
MOVWF USB_CTRL
RETURN

end


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание USB-устройства
СообщениеДобавлено: 2010-дек-06 11:32 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
ElectroAlex писал(а):
Добрый день. У меня проблема с написанием программы для USB-устройства сданным микроконтроллером. Написал шаблон с описаниями дескрипторов. Но при подсоединении к порту ОС пишет, что устройство не опознано. Запускаю USBView там все поля дескрипторов нулевые. Может что-нибудь подскажете. Тактирование - генератор 48МГц для USB, для ядра - режим LF. Сторожевой таймер отключен. Режим микроконтроллера.
end


Все USB устройства требуют не только правильно заполненного дескриптора, но и поддержки определенного протокола обмена командами и данными. Исключение составляют только устройства работающие с USB драйверами типа USBIO. И это относится не только к микроконтроллеру 1886ВЕ4, а ко всем микроконтроллерам с USB.
Выберите тип USB устройства которое Вы хотите реализовать, или тип USB драйвера с которым будете работать, и изучите соответствующую документацию.
Из стандартных USB устройств на микроконтроллере 1886ВЕ4 легко реализуется USB Mass Storage Devices.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-18 15:22 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
Здравствуйте! Буду очень признателен за помощь:
Отлаживаю программу для МК 1886ВЕ4.
Одна из функций программы - измерение частоты импульсов, поступающих на вход PORTA.0.
По этому входу активен обработчик прерываний, в котором ведется подсчет числа поступивших импульсов.
По достижению N импульсов считываются текущие показания таймера T0 и выводятся на ПК через USB.
Источником тактовых импульсов для таймера является внешний генератор.
Период регистрируемых импульсов достаточно большой, поэтому ведется учет переполнений таймера T0 в соответствующем обработчике прерываний.

Проблема вот в чем:
Замечено, что периодически пропускаются импульсы по входу А.0, а так же переполнения таймера, то есть обработчики соответствующих прерываний не вызываются.


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


Код:
#include <1886VE4d.h>
#include "int17xxx.h"
#pragma origin 0x8

uns 8 ... //инициализация глобальных переменных
interrupt iServer(void)
{
multi_interrupt_entry_and_save
  PERIPHERIAL_service:
 
  TMR0_service:
  T0IF=0;
  //работа с переменными, портами ввода-вывода и периферией

  T0CKI_service:
  INT_service:
  if(INTF==1)
   {
   INTF=0;
   //работа с переменными, портами ввода-вывода и периферией
   }
interrupt_exit_and_restore
}

void main(void)
{
uns8 ...
uns 16 ... //инициализация переменных


//настройка портов ввода-вывода
//работа с портами

GLIND=1;
T0STA=0b01000100;
TMR0L=0;TMR0H=0;
T0IE=1;
INTE=1;
T0CKIE=0;
PEIE=0;
GLINTD=0;

//инициализация USB

while(1) //основной цикл работы программы
{
//работа с переменными, портами ввода-вывода
//чтение, запись в USB
}
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-19 12:04 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Один обработчик для нескольких источников - неудачная идея. Следует разделить прерывания, чтобы избежать проблем синхронизации, когда во время обработки прерывания возникает другое событие.
Код:
interrupt iServer(void)
{
multi_interrupt_entry_and_save
  PERIPHERIAL_service:
  TMR0_service:
  T0IF=0;
  ..
goto RESTORE_and_return;
  T0CKI_service:
  INT_service:
  INTF=0;
  ..
  RESTORE_and_return:
interrupt_exit_and_restore
}
- Тут прерывания будут обрабатываться по очереди. Можно также один из флагов анализировать в основном цикле.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-19 15:01 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
Исправил, как в Вашем примере.
Проблема осталась. По очереди обработчики не вызываются.
Для изучения возможных причин на время работы обоих обработчиков поднимаю сигнал на двух выходах МК и анализирую осциллографом.
Замечено, что если обработчик прерывания по входу (без учета макроса interrupt_exit_and_restore) завершается примерно за 1.5 мкс до переполнения таймера, то обработчик по переполнению не вызывается. Такое событие происходит достаточно редко, поэтому поймать его осциллографом достаточно тяжело и статистики набрать не получилось, но раз пять-шесть выловил.
И наоборот, если выполняется обработчик по переполнению таймера, и приходит импульс на вход, то обработчик по входу не вызывается.
Если это как-то поможет, могу прикрепить осциллограммы.

Еще вопрос.
Нужно ли глобально запрещать прерывания (GLINTD=1) на время выполнения обработчиков?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-19 15:34 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
oleg_snz писал(а):
Исправил, как в Вашем примере.
Проблема осталась. По очереди обработчики не вызываются.
Для изучения возможных причин на время работы обоих обработчиков поднимаю сигнал на двух выходах МК и анализирую осциллографом.
Замечено, что если обработчик прерывания по входу (без учета макроса interrupt_exit_and_restore) завершается примерно за 1.5 мкс до переполнения таймера, то обработчик по переполнению не вызывается. Такое событие происходит достаточно редко, поэтому поймать его осциллографом достаточно тяжело и статистики набрать не получилось, но раз пять-шесть выловил.
И наоборот, если выполняется обработчик по переполнению таймера, и приходит импульс на вход, то обработчик по входу не вызывается.
Если это как-то поможет, могу прикрепить осциллограммы.

Еще вопрос.
Нужно ли глобально запрещать прерывания (GLINTD=1) на время выполнения обработчиков?

Глобально запрещать прерывания не нужно, во время обработки прерывания это происходит автоматически.

А по проблеме. Пришлите сгенеренный ASM файл с полной программой обработки прерываний на togidny@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-19 19:50 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
отправил


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-20 13:48 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
oleg_snz писал(а):
отправил

Я попробовал получить пропуски прерываний. Из Вашей программы выкинул вычисления, но оставил такую же настройку портов, прерываний и таймера. Подавал рядом расположенные импульсы на порты, разные варианты смещений друг относительно друга. Прерывания всегда отрабатывались (судя по PORTE,4 и PORTE,6).

Попробуйте тоже отключить всё "лишнее" и посмотреть не исчезнут ли пропуски.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-21 15:21 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
Пропуски остались, но минимальный объем вычислений и операций с портами пришлось оставить. Все равно арифметика и работа с портами не должны влиять на обработку прерываний.
Временно решил проблему костылем в виде обработки данных на компе, благо сбойных измерений немного и они легко обнаруживаются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-21 15:32 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
oleg_snz писал(а):
Пропуски остались, но минимальный объем вычислений и операций с портами пришлось оставить. Все равно арифметика и работа с портами не должны влиять на обработку прерываний.
Временно решил проблему костылем в виде обработки данных на компе, благо сбойных измерений немного и они легко обнаруживаются.

Пришлите минимально возможную программу (ASM) и диаграмму импульсов, при которой возникают пропуски. Мне бы поймать эти пропуски, тогда возможно найдется причина.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-фев-24 14:27 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
oleg писал(а):
Пришлите минимально возможную программу (ASM) и диаграмму импульсов, при которой возникают пропуски. Мне бы поймать эти пропуски, тогда возможно найдется причина.

Добрый день.
Все лишнее из программы выбросил, вот что осталось:
Открыть исходник программы
#include <1886VE4d.h>
#include "int17xxx.h"
#pragma origin 0x8
uns8 q1,w1,e1,q2,w2,e2;
interrupt iServer(void)
{
multi_interrupt_entry_and_save
PERIPHERIAL_service:
TMR0_service:
PORTE.4=1;
T0IF=0;
for(w1=0;w1<10;w1++)e1=w1;
PORTE.4=0;
goto RESTORE_and_return;
T0CKI_service:
INT_service:
PORTE.6=1;
INTF=0;
for(w2=0;w2<10;w2++)e2=w2;
PORTE.6=0;
RESTORE_and_return;
interrupt_exit_and_restore
}
void main(void)
{
GLINTD=1;
DDRC=0xff;
DDRD=0xff;
DDDRE=0b10101111;
T0STA=0b01000100;
TMR0L=0;
TMR0H=0;
T0IE=1;
INTE=1;
T0CKIE=0;
PEIE=0;
GLINTD=0;
while(1);
}
Закрыть


Пропуски наблюдаются примерно один раз в 30 секунд по обоим обработчикам. На вход A0 подаю импульсы с генератора 1кГц. На вход таймер T0 подаю 20МГц (потом делится на 4, так что остается 5МГц). Ядро МК тактируется от генератора USB (48/2)Мгц.
На осциллограммах показаны пропуски и примерное положение пропусков.
Извиняюсь за плохое качество картинок - они подверглись цифро-бумажно-цифровому преобразованию.


Вложения:
dia2.jpg
dia2.jpg [ 1.11 МБ | Просмотров: 10424 ]
dia1.jpg
dia1.jpg [ 1.28 МБ | Просмотров: 10424 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Таймер на 1886ВЕ4
СообщениеДобавлено: 2014-фев-28 15:35 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
Здравствуйте! Теперь такая проблема:
МК 1886ВЕ4. Тактовая частота 24МГц (половина частоты USB). Активны два прерывания - по переполнению таймера T0 и по входу A0. Источник тактовой частоты таймера - внешний генератор с частотой 20 МГц, после предделителя на четыре остается 5 МГц.
В обработчике по таймеру ведется учет числа переполнений.
При поступлении импульса на вход A0, в обработчике по данному входу читается текущее значения счетчика и передается по USB в ЭВМ.
Так вот, суть проблемы в том, что значения времени, получаемые на ЭВМ, не соответствую ожиданиям.
Например, если на вход A0 подать частоту 500 Гц, на ЭВМ получаем вот такие значения:

№__hi____lo_____TMR0H__TMR0L___t_фактич.,с___t_факт.к.0,с____t_ожидаемое.,с____отклонение, с
1___0____167____6_______237_____2.189257_____0______________0________________0
2___0____167____47______253_____2.191259_____0.0021024______0.002_____________0.000102
3___0____167____87______13______2.193359_____0.0041024______0.004_____________0.000102
4___0____167____126_____29______2.195359_____0.0061024______0.006_____________0.000102
5___0____167____163_____45______2.197257_____0.008__________0.008_____________0
6___0____167____202_____61______2.199257_____0.01___________0.010_____________0
7___0____167____243_____77______2.201359_____0.0121024______0.012_____________0.000102
. . . . . . . . . . . . . . . .

Замечено, что отклонение фактических значений времени от ожидаемых или близко к 0, или составляет 102 мкс, что соответствует 510 отсчетам таймера (при T=0,2 мкс).
Такая ситуация наблюдается на протяжении всего периода измерения, причем ошибка не накапливается.
Правильность вычислений и передачу данных на ПК вроде проверил.
Может я как-то криво читаю таймер?

Открыть исходник программы
#include <1886VE4d.h>
#include "int17xxx.h"
#pragma origin 0x8
uns8 q1,w1,e1,q2,w2,e2;
interrupt iServer(void)
{
multi_interrupt_entry_and_save
PERIPHERIAL_service:
TMR0_service:
T0IF=0;
if(lo==255)ho++;
lo++;
goto RESTORE_and_return;
T0CKI_service:
INT_service:
INTF=0;
EP3_REG=hi;
EP3_REG=lo;
EP3_REG=TMR0H;
EP3_REG=TMR0L;
RESTORE_and_return;
interrupt_exit_and_restore
}
void main(void)
{
GLINTD=1;
DDRC=0xff;
DDRD=0xff;
DDDRE=0b10101111;
TMR0L=0;
TMR0H=0;
T0STA=0b01000100;
T0IE=1;
INTE=1;
T0CKIE=0;
PEIE=0;
GLINTD=0;
init_usb();
while(1);
}
Закрыть


В спецификации на ВЕ4 сказано:
"Проблема считывания 16-разрядного значения регистров TMR0L и TMR0H
заключается в том, что после считывания младшего (или старшего) байта, его
значение может измениться от FFh к 00h. Для обеспечения однозначного
считывания состояния счетчика рекомендуется маскировать сигнал запроса на
обработку прерывания"
Не понятен смысл данного абзаца. Какое прерывание нужно маскировать и зачем?
Ведь даже если прерывания будут запрещены, есть вероятность переполнения одного из регистров после его чтения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер на 1886ВЕ4
СообщениеДобавлено: 2014-мар-02 11:34 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1271
Откуда: Тула
в ВЕ2 был буфер на чтение и запись таймера. в ВЕ4 такого разве нет?
при этом существовал определенный порядок записи и чтения. см спеку на ВЕ2.

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

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-мар-02 20:28 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
prostoRoman,
в спецификации на ВЕ4 ничего про буфер не сказано. Но есть рекомендации по записи регистров таймера (сначала младший, потом старший), а так же по чтению - процитировал выше, но смысл не совсем ясен. Если говорить про ситуацию, когда после чтения одного из регистров, его значение меняется с FF на 00, тогда предложенный Вами вариант чтения позволит исключить неверное считывание результата.
Однако у меня другой случай - значение таймера отличается на 510 отсчетов от того, каое должно быть. Как будто вместо увеличения младшего регистра (TMR0L) на 2, произошло увеличение старшего (TMR0H).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер на 1886ВЕ4
СообщениеДобавлено: 2014-мар-03 11:34 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
oleg_snz писал(а):
Здравствуйте! Теперь такая проблема:
МК 1886ВЕ4. Тактовая частота 24МГц (половина частоты USB). Активны два прерывания - по переполнению таймера T0 и по входу A0. Источник тактовой частоты таймера - внешний генератор с частотой 20 МГц, после предделителя на четыре остается 5 МГц.
В обработчике по таймеру ведется учет числа переполнений.
При поступлении импульса на вход A0, в обработчике по данному входу читается текущее значения счетчика и передается по USB в ЭВМ.
Так вот, суть проблемы в том, что значения времени, получаемые на ЭВМ, не соответствую ожиданиям.
Например, если на вход A0 подать частоту 500 Гц, на ЭВМ получаем вот такие значения:

№__hi____lo_____TMR0H__TMR0L___t_фактич.,с___t_факт.к.0,с____t_ожидаемое.,с____отклонение, с
1___0____167____6_______237_____2.189257_____0______________0________________0
2___0____167____47______253_____2.191259_____0.0021024______0.002_____________0.000102
3___0____167____87______13______2.193359_____0.0041024______0.004_____________0.000102
4___0____167____126_____29______2.195359_____0.0061024______0.006_____________0.000102
5___0____167____163_____45______2.197257_____0.008__________0.008_____________0
6___0____167____202_____61______2.199257_____0.01___________0.010_____________0
7___0____167____243_____77______2.201359_____0.0121024______0.012_____________0.000102
. . . . . . . . . . . . . . . .

Замечено, что отклонение фактических значений времени от ожидаемых или близко к 0, или составляет 102 мкс, что соответствует 510 отсчетам таймера (при T=0,2 мкс).
Такая ситуация наблюдается на протяжении всего периода измерения, причем ошибка не накапливается.
Правильность вычислений и передачу данных на ПК вроде проверил.
Может я как-то криво читаю таймер?

Если посчитать на сколько у Вас изменяется таймер за 0.2 мс, то получаются интересные цифры:
10512 (+512 !!!) / 10000 / 10000 / 9488 (-512 !!!) / 10000 / 10512 (+512 !!!)/ Т.е. ошибка всегда +/- 512.
Если расписать считанные Вами значения таймера, то получиться:
1 - 110.1110.1101
2 - 10.1111.1111.1101
3 - 101.0111.0000.1101
в этих значениях и далее во всех приведенных всегда 9 бит равен "1". Это и дает ошибку на +/- 512.
Это ошибка в некоторых старых контроллерах 1886ВЕ3 и ВЕ4, которая сейчас исправлена. Возникает она только при считывании TMR0H при включенном 02h или 0Ah банке периферийных регистров. У Вас как раз и включен банк 02h, т.к. используется регистр EP3_REG. Измените номер банка при чтении TMR0H и ошибка исчезнет.

oleg_snz писал(а):
В спецификации на ВЕ4 сказано:
"Проблема считывания 16-разрядного значения регистров TMR0L и TMR0H
заключается в том, что после считывания младшего (или старшего) байта, его
значение может измениться от FFh к 00h. Для обеспечения однозначного
считывания состояния счетчика рекомендуется маскировать сигнал запроса на
обработку прерывания"
Не понятен смысл данного абзаца. Какое прерывание нужно маскировать и зачем?
Ведь даже если прерывания будут запрещены, есть вероятность переполнения одного из регистров после его чтения.

К сожалению спецификация много раз редактировалась различными "редакторами". А исходный смысл следующий.

При считывании значения таймера, Вы выполняете два 8-ми разрядных чтения, т.к. таймер 16-ти разрядный. И в момент между чтениями может произойти увеличение значения таймера с переполнением младшего байта. Это приведет к тому, что считанные 8-ми разрядные части составят ошибочное 16-ти разрядное число. Например, при первом считывании таймера его значение было 01FFh. Затем таймер инкрементировался и его значение при втором считывании стало 0200h. Если первым Вы считали младший байт, то у Вас получиться 02FFh, если первым считали старший байт - то 0100h, и то и другое значение далеко от действительности. И соответственно это нужно исправлять. Алгоритмов коррекции множество и каждый придумывает для себя наиболее подходящий. В общем суть сводится к тому, что необходимо контролировать событие переполнения младшей части таймера между чтениями частей таймера.

А упоминание про запрет прерываний имеет следующий смысл. Между чтениями половинок таймера может дополнительно возникнуть ещё и какое-либо прерывание и в этом случае таймер может успеть "нащёлкать" очень много и истинное его значение станет установить ещё сложнее.

P.S. А моё письмо про прерывания Вы получили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2014-мар-03 16:42 
Не в сети

Зарегистрирован: 2012-фев-16 20:47
Сообщения: 11
oleg, спасибо за разъяснение. Завтра попробую изменить номер банка, очень надеюсь что все наладится.
Письмо про прерывания получил, благодарю за оперативный ответ. Хорошо было бы теперь исправить ошибку, или указать на ее наличие в спецификации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2015-июн-22 14:32 
Не в сети

Зарегистрирован: 2015-июн-22 14:01
Сообщения: 1
Здравствуйте! Буду очень признателен за помощь.
Мы не давно приобрели у вас МК 1886ВЕ4У. При написании программы для компьютера по работе с USB устройством возник вопрос: "как проверить программу, не используя МК 1886ВЕ4У." (Требования заказчика).
Может быть вы прорабатывали данный вопрос?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2015-июн-22 15:36 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 432
Цитата:
как проверить программу, не используя МК 1886ВЕ4У." (Требования заказчика).

Я так понимаю, что речь идет о проверке программы для ПК.
Используйте ЛЮБОЙ ДРУГОЙ МК с аналогичным функционалом.
Остальные варианты подскажут телепаты. Необходимо знать какое устройство должен эмулировать второй ПК (который будет подключен спецкабелем).
Нормальный обмен USB-USB между двумя ПК невозможен, поскольку оба выступают как хост.
Один из вариантов "спецкабеля" (ссылку не найду) представлял из себя цепочку USB->UART<->UART<-USB.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2015-июн-22 15:39 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
Павел Ходырев писал(а):
Здравствуйте! Буду очень признателен за помощь.
Мы не давно приобрели у вас МК 1886ВЕ4У. При написании программы для компьютера по работе с USB устройством возник вопрос: "как проверить программу, не используя МК 1886ВЕ4У." (Требования заказчика).
Может быть вы прорабатывали данный вопрос?

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

В данном случае простой выход - это сделать специализированный кабель на 1886ВЕ4У и обеспечить этим полную совместимость этого кабеля с реальным устройством.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2016-сен-12 16:41 
Не в сети

Зарегистрирован: 2016-авг-17 12:15
Сообщения: 2
Здравствуйте! Приобрели отладочный комплект на плате Eval9_V2 с процессором 1886ВЕ4У.
Никак не могу понять почему при вот таком коде:
Код:
#include <D:\MILANDR\1886\IDE1886\Headers\1886VE4d.h>

/******************/
void main(void)
{
     DDRC = 0;
     PORTC = 0;
     while (1){
           PORTC = 0x01;
           }
}

на PC0 у меня вот такая осциллограмма?
Открыть
Вложение:
IMG_20160912_162800.jpg
IMG_20160912_162800.jpg [ 1.17 МБ | Просмотров: 5080 ]

Вложение:
IMG_20160912_162821.jpg
IMG_20160912_162821.jpg [ 1.21 МБ | Просмотров: 5080 ]
Закрыть

Что не так сделано? Или чего я не понимаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2016-сен-12 16:50 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
Радар писал(а):
Здравствуйте! Приобрели отладочный комплект на плате Eval9_V2 с процессором 1886ВЕ4У.
Никак не могу понять почему при вот таком коде:
Код:
#include <D:\MILANDR\1886\IDE1886\Headers\1886VE4d.h>

/******************/
void main(void)
{
     DDRC = 0;
     PORTC = 0;
     while (1){
           PORTC = 0x01;
           }
}

на PC0 у меня вот такая осциллограмма?
Открыть
Вложение:
IMG_20160912_162800.jpg

Вложение:
IMG_20160912_162821.jpg
Закрыть

Что не так сделано? Или чего я не понимаю?


Сторожевой таймер ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2016-ноя-09 11:27 
Не в сети

Зарегистрирован: 2016-ноя-09 10:57
Сообщения: 2
Здравствуйте. Разрабатываю устройство для вывода информации на ПК через интерфейс USB. Для написания программного обеспечения использовал части кода программ для работы с демонстрационными платами Eval9, не изменяя ту часть, в которой происходит заполнение дескрипторов для определения устройства на ПК. В качестве драйвера использовал LibUSB. При подключении устройство было опознано и с него получилось считать данные, записанные в дескрипторе. После была написана новая прошивка, но с ней устройство не опознавалось. Использовав старую прошивку, получаю ту же ошибку:USB-устройство Windows не удается опознать, и оно было остановлено, поскольку сообщило о возникновении ошибки. При автоматическом поиске драйверов система Windows определила, что драйверы для этого устройства не нуждаются в обновлении, так как наиболее подходящее программное обеспечение уже установлено(хотя по факту его нет). При установке драйвера вручную появляется ошибка, что не найден драйвер, совместимый с этим устройством, либо он не пригоден для поддержки устройства.
Подскажите, пожалуйста, почему библиотека LibUSB может не восприниматься устройством как драйвер, если она уже с ним работала?
Микроконтроллер читается через программатор и на него можно записывать другие прошивки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2016-ноя-10 12:00 
Не в сети

Зарегистрирован: 2016-ноя-09 10:57
Сообщения: 2
И можно ли реализовать виртуальный com-порт при подключении через USB?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-фев-25 15:09 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Здравствуйте. Изучаю данный мк с помощью отладочного комплекта. У меня возникла проблема в работе с портами С и Д в качестве входов.
Я не разбираюсь в прерываниях, не знаю ассемблер, и разбирал дефолтный код на си. Написал код где для отображения сигналов порта С использую светодиоды на порте Е. И его результат мне не понятен совершенно. Подводя сигнал "земли" вход не реагирует никак, но реакция появляется если я кратковременно касаюсь его выводов проводом висящим в воздухе - биты переключаются группами, в непонятном мне порядке, да еще и работают как переключатели. Может я чего то не настроил? Сбивает то что с портом Е все прекрасно, и с выводом сигналов на С и Д тоже. А вход никак не хочет.


Вложения:
Комментарий к файлу: Проект по работе с портом С как входом.
prj.rar [16.7 КБ]
Скачиваний: 80
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-04 09:43 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Живые есть? А то может некропостингом занимаюсь :mrgreen:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-12 10:25 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Помощь все еще нужна. :|


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-12 14:25 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 337
Откуда: ПКК "Миландр"
Petr02 писал(а):
Подводя сигнал "земли" вход не реагирует никак, но реакция появляется если я кратковременно касаюсь его выводов проводом висящим в воздухе - биты переключаются группами, в непонятном мне порядке, ...

Не вполне понятно в чем проблема. Выводы настраиваются как входы, и судя по всему ловят утечки и наводки. С антенной ловят успешнее, чем без нее.

Petr02 писал(а):
... да еще и работают как переключатели.

Это не понятно что означает.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-12 15:15 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Vasiliy писал(а):
Не вполне понятно в чем проблема. Выводы настраиваются как входы, и судя по всему ловят утечки и наводки. С антенной ловят успешнее, чем без нее.

Vasiliy писал(а):
Petr02 писал(а):
... да еще и работают как переключатели.

Это не понятно что означает.

Я тоже подумал что мой несчастный провод - антенна. Но не совсем. Если бы он был антенной то диод отображал бы улавливаемый сигнал. У меня не так.
Так, портЕ работает как кнопка: есть перемычка - диоды горят, нет перемычки - не горят. Это потому что я постоянно сбрасываю и опрашиваю порт Е.
С портами Ц и Д такой истории не получается. Несмотря на то что я через код устанавливаю точно такой же код он срабатывает не каждый раз:
Есть перемычка - свет есть, нет перемычки - свет есть( :shock: ), снова есть перемычка - свет пропал, нет перемычки - света нет.
Я назвал это переключателем потому что имел в виду обычный переключатель, как те что включают свет.
Проблема еще и в том что такое срабатывание - почти случайный результат. И, еще раз, это не антенна, потому что смена состояния диода происходила только в момент касания пина порта с проводником. Я уже оставлял их минут на 10 с подключенными - ничего не происходило. :?
Могу видео записать, если это сможет помочь :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-12 15:39 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 337
Откуда: ПКК "Миландр"
Лучше настроить только один пин, и снять осциллограмму с пометкой при каком напряжении поданном на этот вход светодиод загорается, а при каком гаснет (или не гаснет).
Уберите из кода все лишнее, просто опрашивайте один пин и либо зажигайте лампочку, либо гасите. Снаружи вход подтягивайте то к 1, то к 0.

Убедитесь что микросхема NAND памяти неактивна, и не формирует уровни на проверяемый пин.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-мар-12 15:45 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Понял, спасибо, примерно через неделю отпишусь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-апр-02 12:57 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Прошу прощение за такой доооОООооолгий ответ :| , я все еще разбираюсь с осцилографом. Может у вас есть небольшой пример кода с чтением с портов C или D ? Может я быдлокодил с ошибкой, и осцилограф не нужен :roll: ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ4У
СообщениеДобавлено: 2019-апр-17 14:15 
Не в сети

Зарегистрирован: 2018-окт-31 11:38
Сообщения: 12
Всем спасибо, проблема решена.
Думал что спалил мк и поэтому порты Ц и Д чудят. Но потом таки взял в кривые руки мультиметр и понял что все элементы на плате целы но на порт Ц И Д питание не подается. Прошил дефолтную прошивку и обнаружил что питание, ВНЕЗАПНО, есть. Оказалось что питание для портов идет при включени блока с юсб и разрешении на прерывания. Короче мало опыта у меня и внимательности.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB