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

 
 
> нет прерывания по заполнению буфера от adc
sergey sva
сообщение Feb 27 2009, 15:10
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Не как не могу найти причину в чем дело, ацп запускаю от таймера, то есть в прерывании от таймера запускаю
преобразование, после прерывание, по заполнению буфера,но его нет.
CODE

void InitADC(void){
p_PMC->PMC_PCER = BV(AT91C_ID_ADC);
/* razreshenie tactirovanija ADC */
p_ADC->ADC_CR = AT91C_ADC_SWRST;
/* sbros ADC */
p_ADC->ADC_CHER = (AT91C_ADC_CH4 | AT91C_ADC_CH5 | AT91C_ADC_CH6 | AT91C_ADC_CH7);
/* razreshenie kanalov 1 2 3 4 */
p_ADC->ADC_MR = (AT91C_ADC_LOWRES_10_BIT | ( (6) << 8 ) | (5 << 24));
/* razreshenie 8 ili 10 bit; chastota sinh ADC; wrema viborki hranenija; */
p_AIC->AIC_SVR[AT91C_ID_ADC] = (unsigned long)Func_Irq_Adc;
/* vector programm prer. ADC */
p_AIC->AIC_SMR[AT91C_ID_ADC] = 0x06;
/* prioritet prer. ot T0 0 7 */
p_AIC->AIC_IECR = BV(AT91C_ID_ADC);
/* razreshenie prer. ot ADC */
p_ADC->ADC_RPR = (unsigned long) &ADCBUFER[0];
/* ukazatel na bufer priema */
p_ADC->ADC_RCR = sizeof(ADCBUFER);
/* razmer bufera priema */
p_ADC->ADC_RNPR = 0;
/* ukazatel na bufer 2 priema */
p_ADC->ADC_RNCR = 0;
/* razmer bufera 2 priema */
p_ADC->ADC_PTCR = AT91C_PDC_RXTEN;
/* razreshenie priema peredachi */
p_ADC->ADC_IER = AT91C_ADC_ENDRX; /*| AT91C_ADC_EOC3; */
/* Prerivanie po zapolneniu bufera */
// p_ADC->ADC_CR = AT91C_ADC_START;
}//end
//------------------------------------------------------------


void Func_Irq_Adc(void) { AT91C_BASE_PIOA->PIO_CODR = REL1; //для проверки вставил эту строчку она просто включает реле, но
// реле не включается
unsigned int status;
/* peremennaja statusa preobrazovanija */
status = p_ADC->ADC_SR;
/* zapis v peremennuu statusa */
if(status & AT91C_ADC_ENDRX){
/* proverca zapolnenija bufera */
p_ADC->ADC_RPR = (unsigned long)(ADCBUFER);
p_ADC->ADC_RCR = sizeof(ADCBUFER);
FlagAdcEnd = 145;
}//end if(status & AT91C_ADC_ENDRX)

p_AIC->AIC_EOICR = status;
}//end void Func_Irq_Adc(void)
//------------------------------------------------------------

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
sergey sva
сообщение Feb 28 2009, 13:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Может что то пропустил, прерывания от таймера есть, а прерываний от ацп нет,атрибуты __attribute__ ((interrupt)); не забыл указать
Каналы ацп 4567 которые не требуют настройки pio. мк at91sam7s256 gcc
CODE

#include <AT91SAM7S256.H>
#include "board.h"
#include "adc.h"
//------------------------------------------------------------
unsigned int ADCBUFER[4];
int y = 0;
//------------------------------------------------------------
AT91PS_TC p_TC0 = AT91C_BASE_TC0;
AT91PS_AIC p_AIC = AT91C_BASE_AIC;
AT91PS_PMC p_PMC = AT91C_BASE_PMC;
AT91PS_ADC p_ADC = AT91C_BASE_ADC;
//------------------------------------------------------------
void Init_T0(void){
p_PMC->PMC_PCER = BV(AT91C_ID_TC0);
/*Razreshenie taktirovanija T0 */
p_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_CPCTRG;
/* Pririvanie kogda TC0 = TC_RC*/
p_TC0->TC_RC = (unsigned int)(100*(12000000/1000.0/128.0)/(sizeof(ADCBUFER)/2 - 6 + 3) - 1);
/**/
/*Init Interrupt*/
p_TC0->TC_IER = AT91C_TC_CPCS;
/* razreshenie prer. pri sofpadenii*/
p_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) Func_Irq_Timer0;
/* vector programm prer. T0 */
p_AIC->AIC_SMR[AT91C_ID_TC0] = 0x07;
/* prioritet prer. ot T0 0 7 */
p_AIC->AIC_IECR = BV(AT91C_ID_TC0);
/* razreshenie prer. ot T0 */
p_TC0->TC_CCR = AT91C_TC_CLKEN;
/* razreshenie sinhronizacii T0 */
p_TC0->TC_CCR = AT91C_TC_SWTRG;
/* perezapusk T0 */
}//end
//------------------------------------------------------------
void InitADC(void){
p_PMC->PMC_PCER = BV(AT91C_ID_ADC);
/* razreshenie tactirovanija ADC */
p_ADC->ADC_CR = AT91C_ADC_SWRST;
/* sbros ADC */
p_ADC->ADC_CHER = AT91C_ADC_CH4 | AT91C_ADC_CH5 | AT91C_ADC_CH6 | AT91C_ADC_CH7;
/* razreshenie kanalov 1 2 3 4 */
p_ADC->ADC_MR = AT91C_ADC_LOWRES_10_BIT | ( (12/2/ADC_CLK - 1) << 8 ) | (5 << 24);
/* razreshenie 8 ili 10 bit; chastota sinh ADC; wrema viborki hranenija; */
p_AIC->AIC_SVR[AT91C_ID_ADC] = (unsigned long)Func_Irq_Adc;
/* vector programm prer. ADC */
p_AIC->AIC_SMR[AT91C_ID_ADC] = 0x05;
/* prioritet prer. ot T0 0 7 */
p_AIC->AIC_IECR = BV(AT91C_ID_ADC);
/* razreshenie prer. ot ADC */
p_ADC->ADC_RPR = (unsigned long)(ADCBUFER);
/* ukazatel na bufer priema */
p_ADC->ADC_RCR = sizeof(ADCBUFER);
/* razmer bufera priema */
p_ADC->ADC_RNPR = 0;
/* ukazatel na bufer 2 priema */
p_ADC->ADC_RNCR = 0;
/* razmer bufera 2 priema */
p_ADC->ADC_PTCR = AT91C_PDC_RXTEN;
/* razreshenie priema peredachi */
p_ADC->ADC_IER = AT91C_ADC_ENDRX; /*| AT91C_ADC_EOC3; */
/* Prerivanie po zapolneniu bufera */
// p_ADC->ADC_CR = AT91C_ADC_START;
}//end
//------------------------------------------------------------
void Func_Irq_Adc(void){
unsigned int status;
/* peremennaja statusa preobrazovanija */
status = p_ADC->ADC_SR;

AT91C_BASE_PIOA->PIO_CODR = REL1; // эта функция не выполняется, релюшка не включается

/* zapis v peremennuu statusa */
if(status & AT91C_ADC_ENDRX){
/* proverca zapolnenija bufera */
p_ADC->ADC_RPR = (unsigned long)(ADCBUFER);
p_ADC->ADC_RCR = sizeof(ADCBUFER);
}//end if(status & AT91C_ADC_ENDRX)

/* */
p_AIC->AIC_EOICR = status;
}//end void Func_Irq_Adc(void)
//------------------------------------------------------------
void Func_Irq_Timer0(void){
p_ADC->ADC_CR = AT91C_ADC_START;

/*
if(y == 1){y = 0; AT91C_BASE_PIOA->PIO_CODR = REL1;AT91C_BASE_PIOA->PIO_SODR = REL2;}else{y = 1;AT91C_BASE_PIOA->PIO_SODR = REL1;AT91C_BASE_PIOA->PIO_CODR = REL2;}
*/ /* Проверка эта функция выпоняется, если раскоментировать то релюхи жужат */

/* zapusk ad preobrazovanie */
p_AIC->AIC_EOICR = p_TC0->TC_SR;
}//end void Func_Irq_Timer0(void)
//------------------------------------------------------------

adc.h
CODE

#ifndef _ADC_H_
#define _ADC_H_
//------------------------------------------------------------
#define BV(x) (1UL<<(x))
#define ADC_CLK 6
//------------------------------------------------------------
extern unsigned int ADCBUFER[4];

//------------------------------------------------------------
extern void InitADC(void);
extern void Init_T0(void);
void Func_Irq_Timer0(void) __attribute__ ((interrupt));
void Func_Irq_Adc(void) __attribute__ ((interrupt));
//------------------------------------------------------------
#endif

Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 28 2009, 19:53
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Попробовал разрешил все прерывание, толку все равно нет, может еще до инициализации нужно что то разрешать. ?
Системный тактовый сигнал разрешен pPMC->PMC_SCER = (AT91C_PMC_UDP|AT91C_PMC_PCK );
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 1 2009, 10:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Такая запись в функции инициализации ацп, тоже не вызывает прерывания, что где копать, ума не преложу.
Код
p_ADC->ADC_IER = 0x000fffff;//AT91C_ADC_RXBUFF; /*| AT91C_ADC_EOC3; */
/* Prerivanie po zapolneniu bufera */
p_AIC->AIC_IECR = (1 << AT91C_ID_ADC);
/* razreshenie prer. ot ADC */
p_AIC->AIC_ISCR = (1 << AT91C_ID_ADC);
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 10:56
Сообщение #5


Гуру
******

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



Запись в AIC_ISCR может активировать только edge-triggered прерывание.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Mar 1 2009, 11:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Все разобрался,заработало smile.gif.
Проблема была в файле at91sam7s256.h файл который я где то скачал или взял из какого то проекта оказался совсем не для
sam7s256 а для sam7sx256, я даже не предполагал, что может что то быть в нем не так.Прикрепленный файл  ______.zip ( 53.16 килобайт ) Кол-во скачиваний: 98

хоть и название и в шапке написано , вроде как к at91sam7s256/
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:43
Рейтинг@Mail.ru


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