Перейти к содержанию
    

При разрешении USART, не выставляется бит в порту

Привет Всем! Срочно нужна помощь!!!

Работаю с атмегой 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 платы с этим кристаллом, обе ведут себя одинаково.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Понял в чем косяк... USART разрешил прерывания разрешил, а обработчики прерываний не задал. И при их возникновении прога постоянно уходила на их выполнение так и добравшись до основого цикла

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...