Не прошло и 2-ух лет как я получил ваш контроллер. Что-то не получается у меня к CAPCOM обратиться, уж я и 0x6008 в XADDR4 писал и 0x6E83. Так это возможно все-таки? Или только 0x0E83?_sva_ писал(а): 2. Обойти можно. Если CAN имеет только одну возможность обращения по адресам (0E800 - 0EFFF) и все разряды адресов используются для декодирования, то обращаться к CAPCOM можно и по адресам, например, 1E890-1E8D8 или 6E890-6E8D8 и все должно корректно работать.
1887ВЕ3Т
Модераторы: ea, Alis, pip, gurzzza, _sva_
Re: 1887ВЕ3Т
Re: 1887ВЕ3Т
Не совсем верно использовать в качестве StartUpa файл START_V2.a66, лучше использовать START167.A66.
Настройку шины XBUS необходимо сделать до команды EINIT.
Недавно была выявлена проблема из-за которой одновременная работа с CAN и CC6 была невозможна, но был найден обход этой проблемы: для регистра XADRS4 указываем память через, например, шестой сегмент. Пример кода инициализации шины XBUS для одновременной работы CAN и CC6:
MOV R1, #0009H
EXTR #1H
MOV XPERCON, R1
NOP
NOP
MOV R1, #0E93H
EXTR #1H
MOV XADRS1, R1
NOP
NOP
MOV R1, #14BFH ;16-bit demux
EXTR #1H
MOV XBCON1, R1
NOP
NOP
MOV R1, #06E80H
EXTR #1H
MOV XADRS4, R1
NOP
NOP
MOV R1, #04BFH
EXTR #1H
MOV XBCON4, R1
NOP
NOP
EINIT
Настройку шины XBUS необходимо сделать до команды EINIT.
Недавно была выявлена проблема из-за которой одновременная работа с CAN и CC6 была невозможна, но был найден обход этой проблемы: для регистра XADRS4 указываем память через, например, шестой сегмент. Пример кода инициализации шины XBUS для одновременной работы CAN и CC6:
MOV R1, #0009H
EXTR #1H
MOV XPERCON, R1
NOP
NOP
MOV R1, #0E93H
EXTR #1H
MOV XADRS1, R1
NOP
NOP
MOV R1, #14BFH ;16-bit demux
EXTR #1H
MOV XBCON1, R1
NOP
NOP
MOV R1, #06E80H
EXTR #1H
MOV XADRS4, R1
NOP
NOP
MOV R1, #04BFH
EXTR #1H
MOV XBCON4, R1
NOP
NOP
EINIT
Re: 1887ВЕ3Т
Ну, дело не в имени файла, а в том что в нем написано: от исходного START_V2.a66 там одно название.Sanek писал(а):Не совсем верно использовать в качестве StartUpa файл START_V2.a66, лучше использовать START167.A66.
Сделал, хотя по моим ощущениям это не обязательно.Sanek писал(а): Настройку шины XBUS необходимо сделать до команды EINIT.
Наверно я стал старый. Настроил все как вы говорите. В k1887ve3t.h передефайнил регистры:Sanek писал(а): Недавно была выявлена проблема из-за которой одновременная работа с CAN и CC6 была невозможна, но был найден обход этой проблемы: для регистра XADRS4 указываем память через, например, шестой сегмент. Пример кода инициализации шины XBUS для одновременной работы CAN и CC6:
Было:
Код: Выделить всё
#define CCU6_T12 (*((unsigned int volatile sdata *) 0xE890))
Стало:
Код: Выделить всё
#define CCU6_T12 (*((unsigned int volatile huge *) 0x6E890))
Re: 1887ВЕ3Т
Так делать не надоВ k1887ve3t.h передефайнил регистры:
------------------------
Re: 1887ВЕ3Т
А как надо?Sanek писал(а):Так делать не надоВ k1887ve3t.h передефайнил регистры:
Настраиваю XADRS4/XBCON4 только для CAPCOM6, CAN - выключен (XBCON1=0).
Если передефайнить - просто не работает, если не передефайнить - все виснет (я так думаю возникает ILLBUS).
Re: 1887ВЕ3Т
Данный вариант выдает синусоиду на СС60(вывод P1L0), при этом ССOUT63(P1L6) не должен выдавать сигнал, так как выключен ECT13OCCU6_MODCTR=(1<<7)| //Multi channel mode
(1<<8); //T3->CC60
Что бы одновременно выдавать сигнал синусоида на СС60 и CCOUT63 необходимо сделать так:
CCU6_MODCTR = (1<<7)| (1<<8) | (1<<15);
Проверили на своей макетной плате.
Re: 1887ВЕ3Т
Спасибо, что тратите на меня свое время.Sanek писал(а):Данный вариант выдает синусоиду на СС60(вывод P1L0), при этом ССOUT63(P1L6) не должен выдавать сигнал, так как выключен ECT13OCCU6_MODCTR=(1<<7)| //Multi channel mode
(1<<8); //T3->CC60
Что бы одновременно выдавать сигнал синусоида на СС60 и CCOUT63 необходимо сделать так:
CCU6_MODCTR = (1<<7)| (1<<8) | (1<<15);
Проверили на своей макетной плате.
Проблема в том что сигнал на СС60 не имеет ничего общего с синусом. В программе есть прерывание для переинициализации ПЕК, оно должно вызываться с частотой 20000/10 точек = 2000 Гц. При выдаче синуса с ССOUT63 все так и происходит, при перенаправлении выхода Т3 на СС60 прерывания начинают сыпаться чаще. Для наглядности я прикрепляю два рисунка с Осциллографа (в одном случае - на выходе синус, в другом не пойми что). Я полагал, что перенаправление никак не должно оказывать влияние на формирование прерывании от CAPCOM6, но модуль работает как-то иначе.
- Вложения
-
- sinus.zip
- (5.86 КБ) 162 скачивания
Re: 1887ВЕ3Т
Denis, пришлите пожалуйста два *.hex файла:
- ШИМ на выход CCOUT63
- ШИМ на выход СС60
- ШИМ на выход CCOUT63
- ШИМ на выход СС60
Re: 1887ВЕ3Т
Высылаю.Sanek писал(а):Denis, пришлите пожалуйста два *.hex файла:
- ШИМ на выход CCOUT63
- ШИМ на выход СС60
- Вложения
-
- caphex.zip
- (1.86 КБ) 164 скачивания
Re: 1887ВЕ3Т
Я тоже наверное стал старыйDenis писал(а):Ну, дело не в имени файла, а в том что в нем написано: от исходного START_V2.a66 там одно название.Sanek писал(а):Не совсем верно использовать в качестве StartUpa файл START_V2.a66, лучше использовать START167.A66.
Сделал, хотя по моим ощущениям это не обязательно.Sanek писал(а): Настройку шины XBUS необходимо сделать до команды EINIT.
Наверно я стал старый. Настроил все как вы говорите. В k1887ve3t.h передефайнил регистры:Sanek писал(а): Недавно была выявлена проблема из-за которой одновременная работа с CAN и CC6 была невозможна, но был найден обход этой проблемы: для регистра XADRS4 указываем память через, например, шестой сегмент. Пример кода инициализации шины XBUS для одновременной работы CAN и CC6:
Было:Код: Выделить всё
#define CCU6_T12 (*((unsigned int volatile sdata *) 0xE890))
Стало:Ничего не работает.Код: Выделить всё
#define CCU6_T12 (*((unsigned int volatile huge *) 0x6E890))
У меня так тоже не заработало, хотя делал по совету Шеховцова. Ну, по крайней мере, сходу не заработало... А времени ковыряться нет. К тому же ремап в 6-ой или какой еще сегмент приводит к адресации через переопределение сегмента или страницы данных вместо работы с ближней памятью.
Поэтому я оставил свои макросы на входе и выходе всех процедур, где используются регистры CAN и CCU6. Эти макросы просто открывают и закрывают адресные окна. Вот они:
#define RestoreCAN // Restore access (if it was) to CAN address window
// after CAN usage instead of access refusal (DisableCAN)
#ifndef RestoreCAN
#define DisableCAN
#endif
#ifdef DisableCAN // Close access to CAN address window after usage
// Get_CAN_Access must be invoked before any access to CAN register
#define Get_CAN_Access __asm { /* Open CAN address window */ \
__asm EXTR #3 \
__asm PUSH XBCON4 /* save XBCON4 value */ \
__asm AND XBCON4,#0xFBFF /* disable XCS4 (CCU6) */ \
__asm OR XBCON1,#0x400 /* enable XCS1 (CAN) */ \
}
// Reset_CAN_Access must be invoked after CAN registers using
#define Reset_CAN_Access __asm { /* Close CAN address window */ \
__asm EXTR #2 \
__asm AND XBCON1,#0xFBFF /* disable XCS1 (CAN) */ \
__asm POP XBCON4 /* restore XBCON4 value */ \
}
#endif
#ifdef RestoreCAN // Restore access to CAN address window after usage
// Get_CAN_Access must be invoked before any access to CAN register
#define Get_CAN_Access __asm { /* Open CAN address window */ \
__asm EXTR #4 \
__asm PUSH XBCON4 /* save XBCON4 value */ \
__asm PUSH XBCON1 /* save XBCON1 value */ \
__asm AND XBCON4,#0xFBFF /* disable XCS4 (CCU6) */ \
__asm OR XBCON1,#0x400 /* enable XCS1 (CAN) */ \
}
// Reset_CAN_Access must be invoked after CAN registers using
#define Reset_CAN_Access __asm { /* Restore CAN address window */ \
__asm EXTR #2 \
__asm POP XBCON1 /* restore XBCON1 value */ \
__asm POP XBCON4 /* restore XBCON4 value */ \
}
#endif
Здесь использована условная компиляция: в зависимости от объявления RestoreCAN, окно CAN при использовании в конце процедуры либо закрывается макросом Reset_CAN_Access, либо возвращаются старые настройки. Такие же объявил для CCU6. Идея, думаю, понятна.
Если обращений к регистрам периферии много, такой подход даже сэкономит и место в памяти, и время исполнения, благодаря ближней адресации. Но есть недостаток. Как для JTAG не знаю, а при использовании отладки по старинке через USART (MON166) нужно не забывать закрывать все окна отладчика (или менять адреса), где светится состояние регистров периферии (CAN или CCU6), если следующая остановка будет после Reset_CAN_Access. Так как доступ к области памяти будет закрыт, но MON166 ничего об этом не знает, начнет считывать... А ВЕ3Т почему-то в такой ситуации виснет вместо выдачи 0xFFFF