Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 16.12.2008, 00:44  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию

К сожелению я и сам не знаю с чем это может быть связано, по идее разницы в коде касаемо второго порта нет.Попробуйте посмотреть какой код компилирует компилятор в дизассемблере при отладке, может причина в этом. Другие мысли не приходят.
Реклама:
DrunyaRuma вне форума  
Непрочитано 22.12.2008, 12:05  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

Не могу разобраться с переходом с МЕГЕ8 на Мегу88
Есть некая процедура обмена или работы инфрокрасника
То что приведено ниже процедура mode_infrared это не столь важно дело в том что все заканчивается уже на строке
if (!read_IR()) т.е. сразу перебрасывает на оператор else…
если я правильно понял проблемы в процедуре read_IR() ее код

unsigned char read_IR(void) // возращает ошибки приема ИК порта. =0 - no error. =1 - timeout. =2 - не соотв. длительность импульса. Принятый байт - ByteIR
{
unsigned char read_byte, i;
unsigned int time_out, time_imp;

// инициализация портов компаратора
DDRD.6=0; // порт на вход
PORTD.6=0; // pull-up disable
DDRD.7=0; // порт на вход
PORTD.7=0; // pull-up disable

// Analog Comparator initialization
// Analog Comparator: On
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x00;
SFIOR=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00; // останов таймера
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

read_byte=0;
ByteIR=0;
// Старший бит принимается первым
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit
TCNT1=0x0000; // обнуление регистра счетчика
//if (IR_TIME_OUT›3250)
// time_out=65000;
// else
// time_out=IR_TIME_OUT*20; // IR_TIME_OUT=1600 -› 10 сек таймаут ожидания первого импульса
time_out=65000;
while((--time_out)&&(!ACSR.5)); // Wait for first impulse
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
{
TCCR1B=0x00; // останов таймера
return 1; // ошибка - timeout
};
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((--time_out)&&(ACSR.5));
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
time_imp=TCNT1;
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
read_byte=0;
else
{
if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
read_byte=1;
else
return 2; // ошибка - не соотв. длительность импульса
}
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit

for(i=0;i‹7;i++) // читаем оставшиеся 7 бит
{
time_out=IR_TIME_OUT;
TCNT1=0x0000; // обнуление регистра счетчика
while((--time_out)&&(!ACSR.5)); // Wait for next impulse or timeout
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
{
TCCR1B=0x00; // останов таймера
return 1; // ошибка - timeout
};
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((--time_out)&&(ACSR.5));
TCCR1B=0x00; // останов таймера
if (!time_out)
return 1; // ошибка - timeout
time_imp=TCNT1;
read_byte‹‹=1;
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
{
read_byte+=0;
}
else
{
if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
{
read_byte+=1;
}
else
return 2; // ошибка - не соотв. длительность импульса
}
}
ByteIR = read_byte;
return 0; // успех
}
Как корректно ее изменить
mode_infrared: // режим обмена данными по ИК-интерфейсу
// подаем питание на фототранзистор
DDRB.2=1; // порт на выход
PORTB.2=1; // устанавливаем "1"
sym_init();
sym_out('L');
while(1)
{
if (!read_IR())
{
transmit_IR(ByteIR); // эхо
switch (ByteIR)
{
case 'L': // запись программы рецепта 0x4c
if (IR_Write_Recept())
goto IR_error;
break;
default: // неизвестная команда
goto IR_error;
}
}
else
goto IR_error;
}
IR_error:
update_cellsok(); // обновляем количество записанных препаратов
// выключаем питание фототранзистора
DDRB.2=0; // Set ports as input
PORTB.2=0; // pull-up disable
sym_out('E');
read_buttons();
sym_deinit();
goto mode_sleep;
}
FedorChek вне форума  
Непрочитано 22.12.2008, 12:31  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

КАК же ее изменить под Мегу88 повторюсь под мегу8 все работало
FedorChek вне форума  
Непрочитано 22.12.2008, 12:42  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

КАК же ее изменить под Мегу88 повторюсь под мегу8 все работало
FedorChek вне форума  
Непрочитано 22.12.2008, 21:02  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию

Добрый вечер.По умолчанию в Mega88 запрограммирован
фуз бит CKDIV8 (значение 0),что приводит к делению
тактовой частоты на 8.Может все дело в этом?
DrunyaRuma вне форума  
Непрочитано 23.12.2008, 10:25  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

Вчера просидел всю ночь но так и не разобрался, еще больше стало вопросов. Вобщем методом «тыка» с горем пополам выяснил на какой строчке меня выкидывает в ошибку
Прошу направить на путь «истинный»
1. строка while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
Было под Мегу 8 while((--time_out)&&(!ACSR.5)); // Wait for first impulse
Тут вроде работает…
Далее дошел до строк
2. time_imp=TCNT1H; // Здесь заведомо не правильно
time_imp=TCNT1L; // Здесь заведомо не правильно
//Под Мегу8 было time_imp=TCNT1 но такой вариант у меня не прокатывает в CodeAVR
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX)) где (#define T0_MAX 428
#define T0_MIN 22 отсюда меня «посылают очень далеко»
На данный момент ни фига не понял как работает счетчик, что он пишет в time_imp вобщем я думаю если разобраться с этой строчкой должно хоть что-то заработать.
Но оно меня достало?
Код:
unsigned char read_IR(void) // возращает ошибки приема ИК порта. =0 - no error. =1 - timeout. =2 - не соотв. длительность импульса. Принятый байт - ByteIR
{
unsigned char read_byte, i;
unsigned int time_out, time_imp;
// инициализация портов компаратора
DDRD.6=0; // порт на вход
PORTD.6=0; // pull-up disable
DDRD.7=0; // порт на вход
PORTD.7=0; // pull-up disable

// Analog Comparator initialization
// Analog Comparator: On
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x00;
GTCCR = 0;
ADCSRB = 0;
MCUCR = 0;
//SFIOR=0x00; //Это то что было под Мегу8

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00; // останов таймера
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

read_byte=0;
ByteIR=0;
// Старший бит принимается первым
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit
TCNT1H=0x0000; // обнуление регистра счетчика
TCNT1L=0x0000; // обнуление регистра счетчика
//if (IR_TIME_OUT›3250)
//   time_out=65000;
//   else
//   time_out=IR_TIME_OUT*20; // IR_TIME_OUT=1600 -› 10 сек таймаут ожидания первого импульса
time_out=65000;
Вот тут изменил
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x01; // запуск таймера f=32768/1 Гц
if (!time_out)
   {
   TCCR1B=0x00; // останов таймера
   return 1; // ошибка - timeout
   };
// ждем окончания импульса или таймаута
time_out=IR_TIME_OUT;
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
TCCR1B=0x00; // останов таймера
if (!time_out)
   return 1; // ошибка - timeout
1 с этого места начинаются Проблемы
time_imp=TCNT1H;
time_imp=TCNT1L;
// анализ длительности
if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
   read_byte=0;
   else
   {
   if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
      read_byte=1;
      else
      return 2; // ошибка - не соотв. длительность импульса
   }
//7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit 7 bit

for(i=0;i‹7;i++) // читаем оставшиеся 7 бит
   {
   time_out=IR_TIME_OUT;

   TCNT1H = 0;
   TCNT1L = 0; 

   //TCNT1=0x0000; // обнуление регистра счетчика
   while((--time_out)&&((ACSR & 0x20)==0)); // Wait for next impulse or timeout
   TCCR1B=0x01; // запуск таймера f=32768/1 Гц
   if (!time_out)
      {
      TCCR1B=0x00; // останов таймера
      return 1; // ошибка - timeout
      };
   // ждем окончания импульса или таймаута
   time_out=IR_TIME_OUT;
while((time_out›0) and (ACSR & 0x20)==0))-- time_out; // Wait for first impulse
   TCCR1B=0x00; // останов таймера
   if (!time_out)
      return 1; // ошибка - timeout
   time_imp=TCNT1H;
   time_imp=TCNT1L;
   read_byte‹‹=1;
   // анализ длительности
   if ((time_imp›T0_MIN)&&(time_imp‹T0_MAX))
      {
      read_byte+=0;
      }
      else
      {
      if ((time_imp›T1_MIN)&&(time_imp‹T1_MAX))
         {
         read_byte+=1;
         }
         else
         return 2; // ошибка - не соотв. длительность импульса
      }
   }
ByteIR = read_byte;
return 0; // успех
}
FedorChek вне форума  
Непрочитано 24.12.2008, 02:12  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию

Добрый вечер.

#define TCNT1 (*(volatile unsigned int *)0x84)

это для того, чтобы компилятор понимал 16р регистры,
0х84 - это адрес младшего байта регистра TCNT1,у меня так в "include".h, может компилятор поймет.

Что-то прояснилось с кодом,но я спешил мог и нахомутать.

Прикрепленный файл: 1890678.rar
DrunyaRuma вне форума  
Непрочитано 24.12.2008, 02:23  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию

Там у меня ошибка, здесь исправил:

Прикрепленный файл: 3802363.rar
DrunyaRuma вне форума  
Непрочитано 24.12.2008, 11:15  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

Огромнейшее Вам упс… тебе спасибо за неоценимую помощь просто я в этом деле новичок. Мне очень помогли твои комментарии. То что я поместил малую часть кода из основной программы (просто я не могу выложить весь код в инет меня порвут на лоскуты если увидят). Пытаюсь отладить программу по «шагам» при возникновении проблем, вот обращаюсь к вам. В ней много еще, что осталось. Сейчас пытаюсь разобраться с тем как через инфрокрасник передается версия прошивки прибора и т.п. Там потом через тот же инфрокрасник пишутся некие данные в «епромт». Брыыыы.. пока все, а то еще дезинформирую тебя. Еще раз огромное спасибо.
FedorChek вне форума  
Непрочитано 29.12.2008, 10:33  
FedorChek
Прописка
 
Регистрация: 24.07.2008
Сообщений: 151
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
FedorChek на пути к лучшему
По умолчанию

Добрый день. Исправил код по Вашему совету, блин ну вот не задача первая часть работает, до цикла (for(i=0;i‹7;i++) // читаем оставшиеся 7 бит) далее меня выкидывает в условие что (ошибка - не соотв. длительность импульса) т.е. я не могу понять как так получается обнулили таймер подождали импульса запустили таймер следующий импульс остановили таймер (до этого все путем т.к. проверял с помощью встроенных процедур которые просто выводили на индикатор некие символы на этом все закончилось… Если бы не было импульсов то компаратор наверное не сработал бы, а он сработал.
Говорили мне учись, а я…
FedorChek вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход с НЧ на ВЧ retcom Электроника - это просто 8 28.03.2008 12:19
Переход на подпрограмму в CodeVisionAVR Andrewg Proteus, KiCAD и другие ECAD 9 17.07.2007 15:51
вычисляемый переход PIC16f877a ctefan Микроконтроллеры, АЦП, память и т.д 2 22.06.2007 21:09
Переход с 90S2313 на tiny2313 y256 Микроконтроллеры, АЦП, память и т.д 2 08.06.2007 11:06
Переход с PIC16F84 на PIC16F87 init_sub Микроконтроллеры, АЦП, память и т.д 4 21.03.2005 13:53


Часовой пояс GMT +4, время: 04:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot