Работаю с атмегой 328(без буквы p). Проект создал в Atmel Studio7. ОС на компе - 7ка.
Код
#include <avr/io.h> //подключаем по id соответствующий заголовок
#include <avrlibdefs.h> //sei()
#include <avrlibtypes.h>
#include "hall.h" //define F_CPU
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h> //memcpy()
#include "init.c"
static inline void ADC_SingleStart() __attribute__((always_inline));
static inline void ADC_WaitConvert() __attribute__((always_inline));
static inline void ADC_OFF() __attribute__((always_inline));
static inline void ResetTimers() __attribute__((always_inline));
u32 Timers[TIMERS_MAX];
// Declare your global variables here
//*******************************************
// T = 0.20ms
//*******************************************
ISR(TIMER0_OVF_vect)
{
static u08 entryCnt = 0;
entryCnt++;
//for(u08 i = 0; i < TIMERS_MAX; i++){
if(entryCnt==5){
Timers[SYS_TIMER_ID]++;
entryCnt = 0;
}
OCR0A = pwmLevels[PWM5_1];
OCR0B = pwmLevels[PWM5_2];
OCR1A = pwmLevels[PWM5_3];
OCR1B = pwmLevels[PWM5_4];
OCR2A = pwmLevels[PWM5_5];
OCR2B = pwmLevels[PWM5_6];
}//-----------------------------------------
#define FIRST_ADC_INPUT 7
#define LAST_ADC_INPUT 7
u16 adcData[LAST_ADC_INPUT - FIRST_ADC_INPUT + 1];
// ADC interrupt service routine
ISR(ADC_vect)
{
static u08 i = 0;
// Read the AD conversion result
adcData[i] = ADCW;
// Select next ADC input
if (++i > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
i = 0;
ADMUX = (ADC_VREF_TYPE|FIRST_ADC_INPUT)/*+i*/;
// Delay needed for the stabilization of the ADC input voltage
_delay_us(10);
}
// Single start the AD conversion
void ADC_SingleStart()
{
ADCSRA|=(1<<ADEN)|(1<<ADSC);
}
//ожидание ADC преобразования
void ADC_WaitConvert()
{
while( !(ADCSRA & (1<<ADIF)) ){}; //adcData - верно
}
//Отключить ADC модуль
void ADC_OFF()
{
ADCSRA&=~(1<<ADEN);
}
int main(void)
{
init(); //port's init
sei(); // __enable_interrupt() sreg[i]=1
ADC_SingleStart(); //scan stab M#/S
ADC_WaitConvert(); //ждем преобразования уровня напряжения
ADC_OFF(); //отключаем в целях экономии
if(adcData[0]*VREF/1024 > VREF/2.0) //TTL level high 2.5V
{
...
}
else
{
...
}
UCSR0B = (1<<RXCIE0) | (1<<TXCIE0) | (0<<UDRIE0) | /*(1<<RXEN0) |*/ (1<<TXEN0)| (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
while (1)
{
DDRC|= (1<<DDC3);
PORTC|=(1<<3);
DDRD|= (1<<DDD7);
PORTD|=(1<<7);
}
}
#include <avrlibdefs.h> //sei()
#include <avrlibtypes.h>
#include "hall.h" //define F_CPU
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h> //memcpy()
#include "init.c"
static inline void ADC_SingleStart() __attribute__((always_inline));
static inline void ADC_WaitConvert() __attribute__((always_inline));
static inline void ADC_OFF() __attribute__((always_inline));
static inline void ResetTimers() __attribute__((always_inline));
u32 Timers[TIMERS_MAX];
// Declare your global variables here
//*******************************************
// T = 0.20ms
//*******************************************
ISR(TIMER0_OVF_vect)
{
static u08 entryCnt = 0;
entryCnt++;
//for(u08 i = 0; i < TIMERS_MAX; i++){
if(entryCnt==5){
Timers[SYS_TIMER_ID]++;
entryCnt = 0;
}
OCR0A = pwmLevels[PWM5_1];
OCR0B = pwmLevels[PWM5_2];
OCR1A = pwmLevels[PWM5_3];
OCR1B = pwmLevels[PWM5_4];
OCR2A = pwmLevels[PWM5_5];
OCR2B = pwmLevels[PWM5_6];
}//-----------------------------------------
#define FIRST_ADC_INPUT 7
#define LAST_ADC_INPUT 7
u16 adcData[LAST_ADC_INPUT - FIRST_ADC_INPUT + 1];
// ADC interrupt service routine
ISR(ADC_vect)
{
static u08 i = 0;
// Read the AD conversion result
adcData[i] = ADCW;
// Select next ADC input
if (++i > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
i = 0;
ADMUX = (ADC_VREF_TYPE|FIRST_ADC_INPUT)/*+i*/;
// Delay needed for the stabilization of the ADC input voltage
_delay_us(10);
}
// Single start the AD conversion
void ADC_SingleStart()
{
ADCSRA|=(1<<ADEN)|(1<<ADSC);
}
//ожидание ADC преобразования
void ADC_WaitConvert()
{
while( !(ADCSRA & (1<<ADIF)) ){}; //adcData - верно
}
//Отключить ADC модуль
void ADC_OFF()
{
ADCSRA&=~(1<<ADEN);
}
int main(void)
{
init(); //port's init
sei(); // __enable_interrupt() sreg[i]=1
ADC_SingleStart(); //scan stab M#/S
ADC_WaitConvert(); //ждем преобразования уровня напряжения
ADC_OFF(); //отключаем в целях экономии
if(adcData[0]*VREF/1024 > VREF/2.0) //TTL level high 2.5V
{
...
}
else
{
...
}
UCSR0B = (1<<RXCIE0) | (1<<TXCIE0) | (0<<UDRIE0) | /*(1<<RXEN0) |*/ (1<<TXEN0)| (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
while (1)
{
DDRC|= (1<<DDC3);
PORTC|=(1<<3);
DDRD|= (1<<DDD7);
PORTD|=(1<<7);
}
}
проблема в том, что я использую в проекте USART и вот что заметил: когда в строке для инициации UCSR0B раскомментирвоать (1<<RXEN0), то пин 3 порта С и пин 7 порта D не устанавливаются конструкциями из блока While. При комментировании этого бита, на обоих пинах выводится 1.
Не понял почему!!! заметил если ещё поставить после USR0B - запрет всех прерываний, то тогда единицы устанавливаются в обоих случаях(т.е и при расскоментированном бите RXEN0). Такое ощущение что где-то описан обработчик который принудительно сбрасывает мои биты С3/С7, но они у меня ещё не написаны? Подскажите в каком направлении рыть, запарился уже...Может чего-то недогоняю... Проверял 2 платы с этим кристаллом, обе ведут себя одинаково.