реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Sam7ex256 и UART, Не срабатывает прерывание
Brain_
сообщение Dec 9 2009, 08:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Добрый день, уважаемые эксперты.
Недавно взялся изучать ARM (на плате SAM7EX256). Возникла проблема с прерыванием от UART. Перелопатил примеры и точ то нашел на форуме. Ни в какую не хочет работать.
Для компиляции использую IAR 5.40.
Может еще какие настройки нужны? Нет ли (как в AVR) какой нибудь комады типа SEI?
Вот код:
CODE
#include <board.h>
#include <irq/irq.h>
#include <usart/usart.h>
#include <pmc/pmc.h>
#include "lcd.h"

volatile int uart_count_rx_irq;
//volatile int uart_count_rx_sim;

void InitFreq(void)
{
AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ;
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 | (16<<8) | (AT91C_CKGR_MUL & (72<<16)) | (AT91C_CKGR_DIV & 14);
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
}

void InitPeriphery(void)
{
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;

// BUTTON SW1, SW2
AT91C_BASE_PIOB->PIO_ODR |= BIT24 | BIT25; //Configure in Input
AT91C_BASE_PIOB->PIO_PER |= BIT24 | BIT25; //Enable PB24

//Joystick
AT91C_BASE_PIOB->PIO_ODR |= BIT7 | BIT8 | BIT9 | BIT14 | BIT15; //Configure in Input
AT91C_BASE_PIOB->PIO_PER |= BIT7 | BIT8 | BIT9 | BIT14 | BIT15; //Enable PB25
}

char U0ReadChar(void)
{
while(!(AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY));
return (AT91C_BASE_US0->US_RHR & 0x1FF);
}

void U0WriteChar(char sym)
{
while(!(AT91C_BASE_US0->US_CSR & AT91C_US_TXRDY));
AT91C_BASE_US0->US_THR = sym & 0x1FF;
}

void U0_ISR(void)
{
unsigned int status;

status = AT91C_BASE_US0->US_CSR;

if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY)
{
uart_count_rx_irq++;
U0WriteChar(U0ReadChar());
}
}

void U0Init(void)
{
unsigned int mode = AT91C_US_USMODE_NORMAL
| AT91C_US_CLKS_CLOCK
| AT91C_US_CHRL_8_BITS
| AT91C_US_PAR_NONE
| AT91C_US_NBSTOP_1_BIT
| AT91C_US_CHMODE_NORMAL;

//For UART0
AT91C_BASE_PIOA->PIO_PDR = BIT0 | BIT1 | BIT27 | BIT28;
AT91C_BASE_PIOA->PIO_ASR = BIT0 | BIT1 | BIT27 | BIT28;
AT91C_BASE_PIOA->PIO_BSR = 0;

// Enable the peripheral clock in the PMC
PMC_EnablePeripheral(AT91C_ID_US0);

//Disable Time Guard
AT91C_BASE_US0->US_TTGR = 0;

// Configure the USART in the desired mode @115200 bauds
USART_Configure(AT91C_BASE_US0, mode, 115200, BOARD_MCK);

// Configure the RXBUFF interrupt
IRQ_ConfigureIT(AT91C_ID_US0, 0, U0_ISR);

//Enable USART int
AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;

//Enable AIC int
IRQ_EnableIT(AT91C_ID_US0);

// Enable receiver & transmitter
USART_SetTransmitterEnabled(AT91C_BASE_US0, 1);
USART_SetReceiverEnabled(AT91C_BASE_US0, 1);
}

void main()
{
InitFreq();
InitPeriphery();
U0Init();

InitSPI();
InitLCD();
Backlight(BKLGHT_LCD_ON);

while(1)
{
//Left SW
if(!((AT91C_BASE_PIOB->PIO_PDSR) & BIT24))
{
Backlight(BKLGHT_LCD_ON);
}
//Right SW
if(!((AT91C_BASE_PIOB->PIO_PDSR) & BIT25))
{
Backlight(BKLGHT_LCD_OFF);
}
//Joy Center
if(!((AT91C_BASE_PIOA->PIO_PDSR) & BIT15))
{
char tmp[] = "000";
tmp[2] = uart_count_rx_irq % 10 + '0';
tmp[1] = (uart_count_rx_irq / 10) % 10 + '0';
tmp[0] = (uart_count_rx_irq / 100) % 10 + '0';
LCDPutStr(tmp, 104, 0, LARGE, BLACK, WHITE);

tmp[2] = uart_count_rx_sim % 10 + '0';
tmp[1] = (uart_count_rx_sim / 10) % 10 + '0';
tmp[0] = (uart_count_rx_sim / 100) % 10 + '0';
LCDPutStr(tmp, 88, 0, LARGE, BLACK, WHITE);
}

// if(AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY)
// {
// U0WriteChar(U0ReadChar());
// uart_count_rx_sim++;
// }

}
}


Сообщение отредактировал Brain_ - Dec 9 2009, 08:06
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 9 2009, 14:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Далее:
Код
if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY)

Это условие не выполнится никогда.

Цитата(Brain_ @ Dec 9 2009, 11:05) *
Нет ли (как в AVR) какой нибудь комады типа SEI?

Код
I_BIT                   EQU     0x80

mrs        r0, CPSR
bic        r0, r0, #I_BIT
msr        CPSR_c, r0

Код
#include <intrinsics.h>

__enable_interrupt();
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 10 2009, 14:13
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Dec 9 2009, 16:00) *
__enable_interrupt();

Оно то есть, но
1. обычно часто глобальное разрешение прерываний делается в стартапе.
2. CPSR из user mode менять нельзя.

автор имел в виду надо ли что-то дополнительно разрешать глобально или не надо в C main, ответ - не надо.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 10 2009, 14:39
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Вообще-то в main прерывания разрешать надо. В main программа заходит обычно с запрещенными прерываниями.

В iare это __enable_irq();

Если стартап стандартный (т.е. хэндлер IRQ находится в нем и вызывает процедуру по адресу из AIC с сохраненнием регистров) - то ничего больше делать не надо, кроме как разрешить irq в main.

А если не стандартный - то разрешив прерывания - у вас все подвиснет капитально. И тогда процедуру обработки прерываний надо будет обрамлять атрибутом __irq __arm Name(void)

---
ЗЫ НЕ встречал стартапов, которые бы уводили main в user mode. Это самоубийство какое-то.

Сообщение отредактировал DpInRock - Dec 10 2009, 14:45


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 15:04
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Dec 10 2009, 17:13) *
автор имел в виду надо ли что-то дополнительно разрешать глобально или не надо в C main, ответ - не надо.

Смелый ответ.

Цитата(DpInRock @ Dec 10 2009, 17:39) *
Вообще-то в main прерывания разрешать надо. В main программа заходит обычно с запрещенными прерываниями.

И этот тоже.

Вообще-то я не зря написал, что бесполезно давать советы, не видя стартапа. Их много разных, порой совершенно маразматических. Не надо заниматься гаданием.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Dec 10 2009, 15:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(DpInRock @ Dec 10 2009, 17:39) *
ЗЫ НЕ встречал стартапов, которые бы уводили main в user mode. Это самоубийство какое-то.

Нескромный вопрос: а Вы кейл хоть раз видели?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 10 2009, 17:02
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
Нескромный вопрос: а Вы кейл хоть раз видели?

Скромно отвечу: и видеть не собираюсь. Хватает ИАР. Тем более что и топикастер о нем спрашивает.

Цитата
И этот тоже.

Раз автор копается в примерах, то не встречал в атмеловских примерах user mode. Вообще ни в одном месте. Да и в иаровских примерах тоже. Подозреваю, что user мод никто не использует. Даже майкрософт.
http://www.wasm.ru/article.php?article=securewincearm
Не проверял, не знаю. Но нет причин не доверять.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 17:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DpInRock @ Dec 10 2009, 20:02) *
Раз автор копается в примерах, то не встречал в атмеловских примерах user mode.

А почему именно атмеловские? Мало ли примеров в интернете.

Цитата(DpInRock @ Dec 10 2009, 20:02) *
Подозреваю, что user мод никто не использует. Даже майкрософт.

Вот кусочек из кейловского примера:
Код
Mode_USR        EQU     0x10

;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR
                IF      :DEF:__MICROLIB

                EXPORT __initial_sp

                ELSE

                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size

                ENDIF


; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0


ИМХО, господа, ответственнее надо относится к раздаче советов. В частности, не нужно гадать, что там может быть написано в стартапе, если он не приложен к сообщению. И нет такого понятия, как "стандартный стартап", ибо стандарта на стартапы в природе нет.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 10 2009, 17:41
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
А почему именно атмеловские?

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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 10 2009, 20:51
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Так и где же долгожданный исходник startup'a для всеобщего обозрения?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 11 2009, 10:35
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Прошу прощения, за то что 2 дня не появлялся sad.gif

Что такое sturt up?, где его искать? и в чем его писать?
Если можете, дайте ссылку почитать..
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 11 2009, 10:43
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Brain_ @ Dec 11 2009, 13:35) *
Что такое sturt up?, где его искать?

Стартап - ассемблерный файл в составе проекта, содержащий точку входа, код начальной инициализации процессора и (обычно) вектора прерываний. Может называться startup.s, cstartup.s и т.п.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 11 2009, 11:29
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



В ИАР, если руками не говорить про стартап, то его и не будет.

C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\examples\Atmel\at91lib\boards\at91sam7x-ek

Вот тут с расширением .s

И вообще, для начала оттуда берете и пробуете. Потом оставляете этот стартап для себя на пожизненно.

Он, кстати, оставляет main в систем режиме.

А примеры от NXP (чисто посмотрел у них примеры для usb) - действительно, загоняют кругом в user. При этом sys даже не планируется к использованию... Для всяких абортов стек определяют, а для сиса - нет. И прерывания разрешают. Ибо в стартапе делают все вообще.

Сообщение отредактировал DpInRock - Dec 11 2009, 11:35


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 11 2009, 11:40
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DpInRock @ Dec 11 2009, 14:29) *
Потом оставляете этот стартап для себя на пожизненно.

Вредный совет. У этого стартапа отвратнейший обработчик прерываний.

Цитата(DpInRock @ Dec 11 2009, 14:29) *
При этом sys даже не планируется к использованию... Для всяких абортов стек определяют, а для сиса - нет.

SP для SYS и USER вообще-то один.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 11 2009, 11:54
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Про отвратнейший - да сойдет. Но для начала - очень нормально. И обработчики прерываний не задумываясь работают.
Да, и вход в сис с разрешенными прерываниями!!!! Типа надо помнить. Я у себя запрещаю.
Только стека на всякиий случай для начала не пожалейте.


Про один стек - новость. Буду знать.
"Как много нам открытий чудовищных..." (С) Сан Сергеич.

---
Для себя я сначала брал стартап в папке PowerPac. Он меня и приучил запрещать прерывания на входе. Токо для sam7x я что-то там не обнаружил стартапа отдельно.

Сообщение отредактировал DpInRock - Dec 11 2009, 11:59


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 09:03
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Старт Ап нашел. Добавил прямо тот который был в
C:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\examples\Atmel\at91lib\boards\at91sam7x-ek

Только вот его добавление ни к каким результатам не привело sad.gif Все так же молчание в обработчике прерываний.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 10:45
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Так может вы его пришлете для обозрения?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 11:28
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



C удовольствием smile.gif
CODE

/*
IAR startup file for AT91SAM7X microcontrollers.
*/

MODULE ?cstartup

;; Forward declaration of sections.
SECTION IRQ_STACK:DATA:NOROOT(2)
SECTION CSTACK:DATA:NOROOT(3)

//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------

#define __ASSEMBLY__
#include "board.h"

//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------

#define ARM_MODE_ABT 0x17
#define ARM_MODE_FIQ 0x11
#define ARM_MODE_IRQ 0x12
#define ARM_MODE_SVC 0x13
#define ARM_MODE_SYS 0x1F

#define I_BIT 0x80
#define F_BIT 0x40

//------------------------------------------------------------------------------
// Startup routine
//------------------------------------------------------------------------------

/*
Exception vectors
*/
SECTION .vectors:CODE:NOROOT(2)

PUBLIC resetVector
PUBLIC irqHandler

EXTERN Undefined_Handler
EXTERN SWI_Handler
EXTERN Prefetch_Handler
EXTERN Abort_Handler
EXTERN FIQ_Handler

ARM

__iar_init$$done: ; The interrupt vector is not needed
; until after copy initialization is done

resetVector:
; All default exception handlers (except reset) are
; defined as weak symbol definitions.
; If a handler is defined by the application it will take precedence.
LDR pc, =resetHandler ; Reset
LDR pc, Undefined_Addr ; Undefined instructions
LDR pc, SWI_Addr ; Software interrupt (SWI/SYS)
LDR pc, Prefetch_Addr ; Prefetch abort
LDR pc, Abort_Addr ; Data abort
B . ; RESERVED
LDR pc, =irqHandler ; IRQ
LDR pc, FIQ_Addr ; FIQ

Undefined_Addr: DCD Undefined_Handler
SWI_Addr: DCD SWI_Handler
Prefetch_Addr: DCD Prefetch_Handler
Abort_Addr: DCD Abort_Handler
FIQ_Addr: DCD FIQ_Handler

/*
Handles incoming interrupt requests by branching to the corresponding
handler, as defined in the AIC. Supports interrupt nesting.
*/
irqHandler:
/* Save interrupt context on the stack to allow nesting */
SUB lr, lr, #4
STMFD sp!, {lr}
MRS lr, SPSR
STMFD sp!, {r0, lr}

/* Write in the IVR to support Protect Mode */
LDR lr, =AT91C_BASE_AIC
LDR r0, [r14, #AIC_IVR]
STR lr, [r14, #AIC_IVR]

/* Branch to interrupt handler in Supervisor mode */
MSR CPSR_c, #ARM_MODE_SYS
STMFD sp!, {r1-r3, r4, r12, lr}
MOV lr, pc
BX r0
LDMIA sp!, {r1-r3, r4, r12, lr}
MSR CPSR_c, #ARM_MODE_IRQ | I_BIT

/* Acknowledge interrupt */
LDR lr, =AT91C_BASE_AIC
STR lr, [r14, #AIC_EOICR]

/* Restore interrupt context and branch back to calling code */
LDMIA sp!, {r0, lr}
MSR SPSR_cxsf, lr
LDMIA sp!, {pc}^


/*
After a reset, execution starts here, the mode is ARM, supervisor
with interrupts disabled.
Initializes the chip and branches to the main() function.
*/
SECTION .cstartup:CODE:NOROOT(2)

PUBLIC resetHandler
EXTERN LowLevelInit
EXTERN ?main
REQUIRE resetVector
ARM

resetHandler:

/* Set pc to actual code location (i.e. not in remap zone) */
LDR pc, =label

/* Perform low-level initialization of the chip using LowLevelInit() */
label:
LDR r0, =LowLevelInit
LDR r4, =SFE(CSTACK)
MOV sp, r4
MOV lr, pc
BX r0

/* Set up the interrupt stack pointer. */
MSR cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT ; Change the mode
LDR sp, =SFE(IRQ_STACK)

/* Set up the SYS stack pointer. */
MSR cpsr_c, #ARM_MODE_SYS | F_BIT ; Change the mode
LDR sp, =SFE(CSTACK)

/* Branch to main() */
LDR r0, =?main
MOV lr, pc
BX r0

/* Loop indefinitely when program is finished */
loop4:
B loop4

END
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 13:55
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Первое, что в глаза бросается - в main() вы шагаете с уже разрешенными прерываниями. Все ваши прерывания настраиваются тоже в main? Тогда это очень не хорошо.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 14 2009, 16:36
Сообщение #20


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



А вот религия не позволяет обучиться работе с прерываниями, например, на таймере?
Чтобы прочувствовать весь механизм? А уж после приниматься за следущий уровень?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 17:02
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Религия тут не при чем smile.gif На таймере тоже пробовал. В main же всю инициализаию и настройку прерываний я реализовываю в отдельных функциях потом из из main вызываю. В данном коде просто для наглядности запихнул прямо в main.
Может есть у кого готовый пример (работающий конкрутно для Iar 5.4, заточенный под sam7ex) рализации UART-эхо через прерывания? Буду премного благодарен если скинете на почту.
Просто тяжко как-то мне пока после AVR и MSP принимтаься за RISC процессоры sad.gif

Сообщение отредактировал Brain_ - Dec 14 2009, 17:04
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 17:19
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Заходите на http://www.atmel.com/dyn/products/tools_ca...sp?tool_id=4343. Там есть: AT91SAM7X-EK Software Package for IAR 5.2, Keil and GNU (40 MB, revision 1.5, updated 12/08). Скачайте и посмотрите, что к чему.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 17:30
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Brain_ @ Dec 14 2009, 12:03) *
Все так же молчание в обработчике прерываний.

Во-первых, это -
Код
if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY)

- исправили?

Во-вторых, как смотрите работу прерываний - по эху?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 17:37
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



А обработчике я ляп исправил. Спасибо ))

Изначально я хотел сделать эхо (Вроде несложный пример и много функциональных возможносте можно попробовать потестировать) но в конечном итоге мне б хоть в обработчик этого прерывания попасть. На данный момент в обработчике инкрементируется счетчик. По кнопке я значение счетчика вывожу на LCD. Вот кроме нуля я там еще ничего не видел wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 17:52
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Хорошо, передача отдельно работает?

Мне, если честно, лень разбирать правильность вызовов многочисленных "библиотечных" процедур, поэтому проверьте, не должно ли быть написано PMC_EnablePeripheral(1UL << AT91C_ID_US0) вместо PMC_EnablePeripheral(AT91C_ID_US0) и т.п.
Еще лучше будет, если вы полностью откажетесь от их использования: вызывать "библиотку" для записи одного регистра, да еще и рискуя, как в приведенном примере, ошибиться - глупо.

P.S. Сейчас, наверное, набегут защитники "атмеловских библиотек". Не слушайте их.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 18:13
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Про все ужасы и минусы библиотечных функций я имею представление smile.gif

Пример с atmelевского сайта (точнее то что было в папке с примерами самого Iar, пока различий не нашел) я пробовал запустить. Но ничего не получилось. Это и навело меня на мысль, что где то подвох, и побудило сюда отписаться.

На мелкие ошибки типа PMC_EnablePeripheral(1UL << AT91C_ID_US0) я тоже проверял. не однократно. Завтра еще проверю для уверенности.

Передача отдельно работает. Прием отдельно тоже работает (когда я в main пишу цикл ожидания символа и потом его читаю)
Не хотят работать именно прерывания.

PS Кстати, обязательно писать 1UL вместо 1? в памяти ведь они одинаково выглядят и при логических операциях тоже?

Сообщение отредактировал Brain_ - Dec 14 2009, 18:14
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 18:28
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Brain_ @ Dec 14 2009, 21:13) *
PS Кстати, обязательно писать 1UL вместо 1? в памяти ведь они одинаково выглядят и при логических операциях тоже?

Нет, привычка просто. Чтобы не получить ворнинг при сдвиге на 31.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 18:30
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы умеете зажигать/гасить LED? Если умеете, в самом начале обработчика зажгите его и остановитесь. Будет сразу понятно выходите вы на обработчик или нет.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 18:43
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



У меня нету Диодов, зато есть LCD у которого можно включать и выключать подсветку. Не заходит программа в функцию прерывания... проверял.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 14 2009, 19:30
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Первым делом проверить правильность формирования таблицы векторов прерываний (по нужным адресам таблицы прописаны ли верные адреса обработчиков прерываний). Второе - проверить правильность инициализации AIC.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 14 2009, 19:34
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Во всех без исключения примерах настройки AIC одинаковые (+- значение приоритета). Я думаю что проблема в адресах (Это видимо как раз то, что в стартапе прописывается или я что то все-таки не допонял?).
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 15 2009, 07:05
Сообщение #32


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Дело не в примерах, а в вашей абсолютно конкретной программе. Хоть одно прерывание работает, если AIC, как вы утверждаете, правильно настроен? Похоже, что нет. Адреса с 0х00000000 printf'ом для контроля ведь не трудно распечатать? О чем мы тут не знаю какой день разговоры ведем?
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 15 2009, 09:18
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Куда их printf выведет?
Как адреса получить?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 15 2009, 09:40
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Согласно вашему startup'у первые (8+5)*4 адреса содержат интересующие адреса. printf выводит результат, как правило, в USART DBG, который можно на любой терминальной программе увидеть.

Прочитать таблицу:

Код
int *pt = (int *)0;
int i = 13;
while(i--)
    printf("%08X -> %08X\n", pt, *pt++);


Получите: адрес -> содержимое ячейки по этому адресу
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 15 2009, 10:26
Сообщение #35


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



А где исправленный текст программы?
При разрешенных (реально разрешенных) прерываниях неправильный вектор скорее всего убъет программу. Это раз.

Если ваша программа работает (а как вы узнаете об этом, кстати), то значит реально никаких прерываний нет.

Тренируйтесь на таймере и используйте UART как отладчик.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 15 2009, 13:41
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



это то что находится по нулевому адресу.
18 0C 06 03
18 0C 06 03
18 0C 06 03
18 0C 06 03
18 0C 06 03
14 0A 05 02
14 0A 05 02
CC 66 33 19
E8 F4 7A BD
E8 F4 7A BD
E8 F4 7A BD
E8 F4 7A BD

Проверяю работоспособность диплеем и кнопками.

Сообщение отредактировал Brain_ - Dec 15 2009, 14:12
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 15 2009, 17:36
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну и сидит тут всякая фигня. Уж точно с адреса 0х20 по 0х34 должны сидеть адреса функций обработки соответствующих прерываний. Ну и на сладкое дизассемблированный текст:


Код
00000000 180C0603    STMNEDA    ip, {r0,r1,r9,r10}
00000004 180C0603    STMNEDA    ip, {r0,r1,r9,r10}
00000008 180C0603    STMNEDA    ip, {r0,r1,r9,r10}
0000000C 180C0603    STMNEDA    ip, {r0,r1,r9,r10}
00000010 180C0603    STMNEDA    ip, {r0,r1,r9,r10}
00000014 140A0502    STRNE    r0, [r10], #-&502
00000018 140A0502    STRNE    r0, [r10], #-&502
0000001C CC663319    STCGTL    p3, c3, [r6], #-&64!
00000020 E8F47ABD    LDMIA    r4!, {r0,r2-r5,r7,r9,r11-lr}^
00000024 E8F47ABD    LDMIA    r4!, {r0,r2-r5,r7,r9,r11-lr}^
00000028 E8F47ABD    LDMIA    r4!, {r0,r2-r5,r7,r9,r11-lr}^
0000002C E8F47ABD    LDMIA    r4!, {r0,r2-r5,r7,r9,r11-lr}^
00000030 E8F47ABD    LDMIA    r4!, {r0,r2-r5,r7,r9,r11-lr}^


Вы, кстати, включите генерацию листинга startup-файла. Там увидите правильные коды команд по соответствующим адресам. Адресов функций там не будет, так как их позже подставляет linker, но эти адреса можно найти в map-файле, который можно заставить генерить linker (что очень часто бавает полезно)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 15 2009, 17:47
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Brain_ @ Dec 15 2009, 16:41) *
это то что находится по нулевому адресу.

Вроде в первый раз (одной строкой) что-то более похожее на правду выкладывалось, или мне показалось?

Давно бы уже выложили проект свой, мы бы его поправили. Иначе все как-то бестолково.
Go to the top of the page
 
+Quote Post
Brain_
сообщение Dec 17 2009, 10:47
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887



Приношу свои извинения, по поводу компостирования умов, всем, кто участвовал в обсуждении.
Мне удалось переделать пример с RTT под UART. прерывания заработали.

Правда не могу понять почему. Все функции и библиотеки которые использовались у в RTT проекте я себе скопировал и добавил. Все настройки проекта проверил. Все один в один. Но пример(переделанный) работает, моя прога - нет sad.gif

Видимо придется пока пользоваться этим проектом как стартовым sad.gif

Всем спасибо.

Сообщение отредактировал Brain_ - Dec 17 2009, 10:48
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 23:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.03978 секунд с 7
ELECTRONIX ©2004-2016