Fynjisx 0 24 августа, 2017 Опубликовано 24 августа, 2017 · Жалоба Привет Всем! Срочно нужна помощь!!! Работаю с атмегой 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); } } проблема в том, что я использую в проекте USART и вот что заметил: когда в строке для инициации UCSR0B раскомментирвоать (1<<RXEN0), то пин 3 порта С и пин 7 порта D не устанавливаются конструкциями из блока While. При комментировании этого бита, на обоих пинах выводится 1. Не понял почему!!! заметил если ещё поставить после USR0B - запрет всех прерываний, то тогда единицы устанавливаются в обоих случаях(т.е и при расскоментированном бите RXEN0). Такое ощущение что где-то описан обработчик который принудительно сбрасывает мои биты С3/С7, но они у меня ещё не написаны? Подскажите в каком направлении рыть, запарился уже...Может чего-то недогоняю... Проверял 2 платы с этим кристаллом, обе ведут себя одинаково. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Fynjisx 0 25 августа, 2017 Опубликовано 25 августа, 2017 · Жалоба Понял в чем косяк... USART разрешил прерывания разрешил, а обработчики прерываний не задал. И при их возникновении прога постоянно уходила на их выполнение так и добравшись до основого цикла Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться