Easyelectronics.ru

Электроника для всех
Текущее время: 25 фев 2018, 10:43

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 00:02 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
Еще одна тема в стиле в протеусе работает в железе нет.В общем есть ATmega64, которая в данный момент принимает 2 байта с пк эквивалентные некоторому напряжению по ним определяет идеальное показание АЦП и передает байты по I2C на mcp19111, который в свою очередь является упр. ист. питания и соответственно устанавливает напряжение на выходе и после установки давит на ногу атмеге(INT2). У атмеги происходит прерывание от INT2 в котором уст. флаг, после установки флага в основном коде происходит считывание показаний АЦП и проверка их соответствия заданным,если они не равны происходит корректировка тех 2 регистров и они отпр. повторно, после чего цикл повторятся заново .Так происходит, пока напряжение на АЦП не попадет в заданный диапазон. Типо корректировка обратной связью получается.Но,вот почему то Атмега в процессе корректировки зависает.Я подумал,что не выходит из цикла,но если поснимать напряжение с ацп то там не такая большая погрешность к тому же я в самом конце включал порт Б(сейчас убрал) и на выходе напряжение появлялось, но проблема была в том, что повторно это все дело не работало.Когда я поставил задержку в функцию ADCget() стало ясно ,что она выполняется как минимум в 10 раз дольше чем должна.И также без режима шумоподавления было все хорошо,если не считать просто ужасную для данных целей точность ацп.Может кто то знает в чем может быть проблема, почему мк с просони все еле еле делает или может, что упустил.

И еще вопрос как можно повысить точность ацп, чтобы сотые вольта точно считывать.

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 02:02 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1075
Откуда: Курск
Вангую фьюз бит деления тактовой частоты на 8


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 02:30 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
Не,такого не вижу,если про SCKDIV8.


Вложения:
Безымянный.png
Безымянный.png [ 23.23 Кб | Просмотров: 596 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 09:12 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4715
Откуда: Усинск, республика Коми
meykj писал(а):
Не,такого не вижу,если про SCKDIV8.

Даже если не видно это не значит что его там нет. Это значит, что он установлен :)

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 12:46 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
Уже ,второй контроллер( раньше была атмега 16) у которого возникают баги при любой записи в mcucr.Вообще не пользоваться этим регистром чтоль(.До записи в mcucr никакой проблемы с фьюзами не было,даже в той же программе все нормально было в самом начале,пока контроллер в сон не ушел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 14:57 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
Поменял вот это
MCUCR=(1<<SE)|(1<<SM0);
MCUCR=0;
на вот это
MCUCR|=(1<<SE)|(1<<SM0);
MCUCR&=~(1<<SE)|(1<<SM0);
И все заработало.Выходит дело в том,что нельзя обнулять зарезервированные биты.
С чем это связано?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 15 янв 2018, 16:15 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1075
Откуда: Курск
meykj писал(а):
Поменял вот это
MCUCR=(1<<SE)|(1<<SM0);
MCUCR=0;
на вот это
MCUCR|=(1<<SE)|(1<<SM0);
MCUCR&=~(1<<SE)|(1<<SM0);
И все заработало.Выходит дело в том,что нельзя обнулять зарезервированные биты.
С чем это связано?


Если я правильно понимаю, то:
значение до -> действие -> значение после
xxxxxxxx -> MCUCR=(1<<SE)|(1<<SM0) -> 00101000
xxxxxxxx -> MCUCR=0 -> 00000000
xxxxxxxx -> MCUCR|=(1<<SE)|(1<<SM0) -> xx1x1xxx
xxxxxxxx -> MCUCR&=~(1<<SE)|(1<<SM0) -> xx0xxxxx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 16 янв 2018, 18:05 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
В общем, что меня удивляет,если контроллер попадает в 1 цикл то идет краш вылетают нулевые показания ацп переодически и программа начинает медленно выполнятся,а потом вообще зависает или зависает сразу.А ,если контроллер попал во второй цикл то все нормально.В протеусе все идеально.Вот сложилась мысль,что часть памяти программ битая.Кто нибуть знает как проверить?

Код:
/*
* I2CMasterATmega64.c
*
* Created: 18.10.2017 12:22:17
* Author : ПК
*/
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "UART.h"

#define CalibrationCountDEF 40

volatile uint8_t flag=0,OVCDEF=0,OVFDEF=0,ADCflag=0,CalibrationCount=0;
volatile uint16_t ADCDEF=0,ADCresult=0;



void I2C_MasterInit(void)
{
   DDRD&=~3;
   PORTD&=3;
   TWBR = 3;
   TWSR = (1<<TWPS0);
}

void I2C_Start(void){
   TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
   while(!(TWCR&(1<<TWINT)));
}

void I2C_Stop(void){
   TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

void I2C_SendByte(uint8_t c)
{
   TWDR=c;
   TWCR =(1<<TWINT)|(1<<TWEN);
   while(!(TWCR&(1<<TWINT)));
}

uint8_t I2C_ReceiveByte(uint8_t ANCK){
   
   if(ANCK){
      
      TWCR =(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
   }else
   {
      TWCR =(1<<TWINT)|(1<<TWEN);
   }
   
   while(!(TWCR&(1<<TWINT)));
   
   return TWDR;
}

void ADCget(){


ADCresult=0;

for(int i=0;i<16;i++){
   MCUCR|=(1<<SE)|(1<<SM0);
   asm("sleep");
//   _delay_ms(100);
}

ADCresult=ADCresult>>4;
SendByte(ADCresult>>8);
_delay_ms(100);
SendByte(ADCresult&255);
_delay_ms(100);
}


int main(void)
{
   _delay_ms(1000);

   I2C_MasterInit();
   UARTInit();
   TCCR1B = (1<<CS12)|(1<<CS10);   
   EICRA=(1<<ISC20)|(1<<ISC21);
   EIMSK=(1<<INT2);

   ADMUX =(1<<REFS0);//Опорное напряжение с AVCC
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIE);//АЦП включить,запустить стартовое преобразование,делитель частоты 64
   while(ADCSRA&(1<<ADSC));//Ожидаем окончания преоразования АЦП
   ADCSRA&=~(1<<ADIF);

  // DDRA=255;
  // DDRB=255;


   sei();

   
    while (1)
    {

   if(flag){

   flag=0;
   ADCflag=0;
   CalibrationCount=0;
   

   I2C_Start();

   I2C_SendByte(0xE);
   I2C_SendByte(OVCDEF);
   I2C_SendByte(OVFDEF);
   
   I2C_Stop();

   ////////////////////////////////////////////
   while(!ADCflag);
   ADCget();
   

   
      if(ADCresult>(ADCDEF+1)){

      while((ADCresult>(ADCDEF+1))&&(CalibrationCount<CalibrationCountDEF)){

      ADCflag=0;
      if(OVCDEF) OVCDEF--;
      I2C_Start();

      I2C_SendByte(0xE);
      I2C_SendByte(OVCDEF);
      I2C_SendByte(OVFDEF);
      
      I2C_Stop();

      while(!ADCflag);
      ADCget();
      CalibrationCount++;
      if(!OVCDEF) break;
      }

      }else if (ADCresult<ADCDEF){

      

      while((ADCresult<ADCDEF)&&(CalibrationCount<CalibrationCountDEF)){

         ADCflag=0;
         if(OVCDEF<255) OVCDEF++;
         I2C_Start();

         I2C_SendByte(0xE);
         I2C_SendByte(OVCDEF);
         I2C_SendByte(OVFDEF);
         
         I2C_Stop();

         while(!ADCflag);
         ADCget();
         CalibrationCount++;
         if(OVCDEF==255) break;

      }
      
      
      }

      if((ADCresult<ADCDEF)||(ADCresult>(ADCDEF+1))){

      if(ADCresult>ADCDEF) {OVCDEF--;ADCresult=0;}

      while((ADCresult<ADCDEF)&&(CalibrationCount<CalibrationCountDEF)){

         ADCflag=0;
         if(OVFDEF==255) break;
         OVFDEF++;
         I2C_Start();

         I2C_SendByte(0xE);
         I2C_SendByte(OVCDEF);
         I2C_SendByte(OVFDEF);
         
         I2C_Stop();

         while(!ADCflag);
         ADCget();
         CalibrationCount++;

      }
      }


      
   ///////////////////////////////////////////

   //PORTA=OVCDEF;
   //PORTB=OVFDEF;
   //UDR0;

   

    }
}
}

ISR(USART0_RX_vect){

   OVCDEF=receiveByte(10);
   OVFDEF=receiveByte(10);
   ADCDEF=receiveByte(10);
   ADCDEF=ADCDEF+256*receiveByte(10);
   OVFDEF=128;
   flag=1;

}

ISR(INT2_vect ){

ADCflag=1;      

}

ISR(ADC_vect){
   MCUCR&=~(1<<SE)|(1<<SM0);
   ADCresult=ADCresult+ADCL+ADCH*256;

}




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ATmega64 очень долго выполняются команды.
СообщениеДобавлено: 17 янв 2018, 21:25 
Заглядывает иногда

Зарегистрирован: 29 апр 2017, 21:52
Сообщения: 32
Проблема решена.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB