Проблема с UART

MDV
Offline
Зарегистрирован: 08.08.2013

Доброго дня всем.

Есть рабочий проект на Уно с GPRS модемом работающим по UART0 при переносе проекта на Мегу проект не работает. Есть подозрение что проблема в портах МК на К=Уно UART на порту D на Меге на порту E.

ниже кусочки библиотеки, вопрос куда рыть.

 

void UART0_rx_reset( void )
  {
   
  UCSR0B &= ~(1<<RXCIE0);
  rx_i = rx_wr_i = 0;
  rx_overflow = rx_ack = 0;
  rx_buffer[ rx_wr_i ] = '\0';
  }
   
   
   
  void UART0_rx_on( void )
  {
  UCSR0B |= ( 1 << RXCIE0 );
  }
   
   
  void UART0_rx_off( void )
  {
   
  UCSR0B &= ~( 1 << RXCIE0 );
  }
   
   
  void UART0_setSearchString( unsigned char Response )
  {
  UCSR0B &= ~( 1 << RXCIE0 );
  searchFor = (const char*)pgm_read_word(&searchStrings[Response]);
  searchStr = Response;
  rx_i = 0;
  }
   
  static u8 getchar( void )
  {
  while ( !(UCSR0A & (1<<RXC0)) )
  {
   
  }
  ;
  return UDR0;
  }

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А пример работает?

MDV
Offline
Зарегистрирован: 08.08.2013

это кусочек библа.

Могу выслать всю библиотеку, но думаю никто рыть её не будет.

нужно принципиальное понимание, что поправить что бы обрашение бело на нужный порт.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

MDV пишет:

это кусочек библа.

Могу выслать всю библиотеку, но думаю никто рыть её не будет.

нужно принципиальное понимание, что поправить что бы обрашение бело на нужный порт.

 


Руки?

MDV
Offline
Зарегистрирован: 08.08.2013

Дельный совет!

Другие мысли есть? или знаниев не хватает! хаить все могут, а вот дельный совет дать могут только единицы.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

жди лешака

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

jeka_tm пишет:

жди лешака


Гыыы. Думаеш лешак поймет какие там порты К и Е и остальной алфавит. А в хрустальном шаре увидит модель модуля который установили.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хз. но может ему будет не лень ковырятся

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

MDV
Offline
Зарегистрирован: 08.08.2013

Берем схемы УНО и Мега смотрим и видим порты. Как я понимаю большой разницы нет, что за девейс подключен к UART0 если он молчит то любой девайс работать не будет.

В моем случае это GPRS модем, залив скеч модем не обменивается данными с МК. подсоединил к UART УНО в качестве монитора, там тишина, проверил на остальных портах тоже тишина, заменил МК ситуация таже. 

MDV
Offline
Зарегистрирован: 08.08.2013

в теории должно работать НО.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты выложил код из библиотеки. и там не используются ардуиновские функции, а прописаны сразу регистры

и соответственно переехать на другой камень не поменяв регистры не получится

уно собрана на Atmega328. а мега на Atmega2560. это разные камны, регистры тоже разные

это если использовать ардуиновские функции можно легко переехать

MDV
Offline
Зарегистрирован: 08.08.2013
void loop() {         
107  if (GSM_TASK_flag) { // В обработчике Watchdog таймер установился флаг GSM-задания 
108   GSM_TASK_flag = 0; 
109   // Отключаем сторожевой таймер 
110   off_WDT();    
111   // инициализация GSM модема  
112   while (GSM.Init(PIN)<0);      
113   // Пoлучаем IMEI     
114   while (GSM.GetIMEI (IMEI) < 0); 
115   // Конверитруем в MAC     
116   Narodmon.SetDeviceMACbyIMEI(IMEI); 



Библиотека

s8 GSMClass::Init(const char* PIN)  
{ 
 DDRD |= (1<<PD7)|(1<<PD6);
 PORTD &= ~(1<<PD6);
 PORTD |= (1<<PD7);
 _delay_ms(500);
 PORTD &= ~(1<<PD7);
 _delay_ms(500);
 PORTD |= (1<<PD6);  
 _delay_ms(500);
 PORTD &= ~(1<<PD6); 
 _delay_ms(500); 
 
 UART0_init();
 GSM.WriteStr_P(PSTR("AT\r\n"));
// _delay_ms(100);
 GSM.WriteStr_P(PSTR("ATE0\r\n"));
 _delay_ms(500);
 GSM.WriteStr_P(PSTR("AT+IFC= 0,0\r\n"));
// _delay_ms(500);
 
// searchFor = (const char*)pgm_read_word(&searchStrings[1]);
//  GSM.WriteStr_P(searchFor);
 sei();
 do 
 {
  UART0_rx_reset( );
  UART0_setSearchString( OK_ );
//  _delay_ms(500);
  GSM.WriteStr_P(PSTR("AT\r\n"));
  UART0_rx_on( );
 } while( UART0_check_acknowledge( pause64 ) <= 0 );
 
 
    UART0_rx_reset( );
    UART0_setSearchString( OK_ );
// _delay_ms(500);
    GSM.WriteStr_P(PSTR("ATE0\r\n"));
 sei();
    UART0_rx_on( );
 if( UART0_check_acknowledge( pause64) > 0 )
 {  
  UART0_rx_reset( );
//  _delay_ms(500);
  UART0_setSearchString( CPIN_ );
  GSM.WriteStr_P(PSTR("AT+CPIN?\r\n"));
  UART0_rx_on( );
  if( UART0_check_acknowledge( pause256 ) > 0 )
  {
   //Пришел ответ "+CPIN:"
   UART0_setSearchString( OK_ );
   UART0_rx_on( );
   if( UART0_check_acknowledge( pause64 ) > 0 )
   {// Пришел ответ OK    
    if (strstr_P((char*)rx_buffer, PSTR("SIM PIN")))
    {
     // Необходимо ввести PIN CODE
     UART0_rx_reset( );
     //_delay_ms(500);
     UART0_setSearchString( OK_ );
     GSM.WriteStr_P(PSTR("AT+CPIN=\""));
     GSM.WriteStr_P(PIN);
     GSM.WriteStr_P(PSTR("\"\r\n"));    
     UART0_rx_on( );
     if( UART0_check_acknowledge(pause256 ) > 0) 
     {
      // Пин-код верный     
      goto L_INIT;
     }
     else return -3;
    }
    else if (strstr_P((char*)rx_buffer, PSTR("READY")))    
    {
     // Pin вводить не надо
     goto L_INIT;
    }
    else return -2;            
   }    
   else return -2;
  }
  else return -2;
 }
 else return -1;
L_INIT:
/*
 Патч: проверим, надо ли регистрироваться в сети?
*/
  if (CheckStatus() == 1) goto   L_INIT_01;
   UART0_setSearchString( OK_ );
   UART0_rx_reset( );
   //_delay_ms(500);  
   GSM.WriteStr_P(PSTR("AT+CGATT=1\r\n"));
   UART0_rx_on( );
   if( UART0_check_acknowledge( 3840 ) > 0 )
   {
    // Запрос СМС центра
 //   GSM.WriteStr_P(PSTR("AT+CSCA?\r\n"));
 //   _delay_ms(1000);    
    //Инициализируем текстовый режим СМС
L_INIT_01:   
     UART0_setSearchString( OK_ );
     UART0_rx_reset( );
     //_delay_ms(500);
    GSM.WriteStr_P(PSTR("AT+CMGF=1\r\n"));
    UART0_rx_on( );
    if( UART0_check_acknowledge( pause64 ) > 0 )
   {
    UART0_rx_reset( );
    //_delay_ms(500);
    GSM.WriteStr_P(PSTR("AT+CLIP=1\r\n")); 
    UART0_rx_on( );
    if( UART0_check_acknowledge( pause64 ) > 0 )          
    {
     return 1;
    }
   } else return -4;      
  }else return -3;  
}


void GSMClass::WaitCall(void)
{
 UART0_rx_reset( );
 UART0_setSearchString( RING_ );
 UART0_rx_on( );                     
}

s8 GSMClass::TerminateCall(void)
{
 UART0_rx_reset( );
    UART0_setSearchString( OK_ );
// _delay_ms(1000);
    GSM.WriteStr_P(PSTR("ATH0\r\n"));
    UART0_rx_on( );
 if( UART0_check_acknowledge( pause256 ) > 0 )
 {
  return 1;
 }
 else return -1; 
}

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

 

 

 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

MDV
Offline
Зарегистрирован: 08.08.2013
https://github.com/jt5/narodmon

Весь пример с библиотеками

 

 

MDV
Offline
Зарегистрирован: 08.08.2013

Я сам её готов переписать, мне бы путь указать :-), чую что unt то рядом но вот где????

step962
Offline
Зарегистрирован: 23.05.2011

А кто такой unt?

step962
Offline
Зарегистрирован: 23.05.2011

MDV пишет:

Я сам её готов переписать, мне бы путь указать :-),

У ATMega328 за работу с USART-портом отвечают регистры UDRn, UCSRnA, UCSRnB, UCSRnC, UCSRnL, UCSRnH.

У ATMega2560 - те же UDRn, UCSRnA, UCSRnB, UCSRnC, UCSRnL, UCSRnH.

n здесь - номер порта.

Похоже, что черт - который в деталях - сидит где-то в конкретных полях этих регистров.

Составьте табличку: слева - поля регистров в ATMega328, справа - соответствующие им по функциям поля регистров в ATMega2560. Если какую-то строчку не удастся заполнить, вот ее то для консилиума и выкладывайте. А так вы едва ли найдете энтузиаста, который за вас всю черновую работу сделает.

 

 

MDV
Offline
Зарегистрирован: 08.08.2013

Учитывая что в 328 один хард порт то все регистры будут с номером 0 и естественно должны работать на Меге на на UART0, но не работают.

step962
Offline
Зарегистрирован: 23.05.2011

MDV пишет:

[...] естественно должны работать на Меге на на UART0 [...]

Из чего следует естественность?

MDV
Offline
Зарегистрирован: 08.08.2013

из сопоставления регистров портов. я не обнаружил разницы для обоих камней в вашем посту если и вместо n поставить 0.

в любом случае спасибо за попытку помощи.

step962
Offline
Зарегистрирован: 23.05.2011

MDV пишет:

из сопоставления регистров портов. я не обнаружил разницы для обоих камней в вашем посту если и вместо n поставить 0.

Паралогизм детектед.

Кроме моего поста есть еще даташиты  на рассматриваемые камни - по 4-5 сотен страниц каждый.

А в каталоге <...\hardware\tools\avr\avr\include\avr> - сотни полторы заголовочных файлов, определяющих - в том числе - имена UCSRnX. И какой из этих заголовочных файлов подключается к вашему проекту - х.з.

 

MDV
Offline
Зарегистрирован: 08.08.2013

:-) эхххх пойду за большой лопатой, копать мне видимо долго придется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем было ардуинку менять если все работало на уно?

MDV
Offline
Зарегистрирован: 08.08.2013

необходимость расширения проекта, не хватает каналов для управления и контроля перефирии.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так может писать к самим людям которые поднимали этот проект. не все же на уно сидят. может уже переделывали под мегу

MDV
Offline
Зарегистрирован: 08.08.2013

написал, но они молчат.

плюсом я уже половину библиотеки переписал, так как у меня мопед на другом процессоре а он не все AT команды воспринимает.

MDV
Offline
Зарегистрирован: 08.08.2013

разработчики ответили, библа под уно на меге работать не будет, а то я сам не знаю. Дельных советов не дают.

MDV
Offline
Зарегистрирован: 08.08.2013

вопрос открытый,

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну кому надо переделывать. это же время. даташиты курить

а функционал можно расширить подцепив 2 ардуину например по i2c

MDV
Offline
Зарегистрирован: 08.08.2013

видимо придется так делать, но хочется то эстетики

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

MDV
Offline
Зарегистрирован: 08.08.2013
void UART0_init(void)
{
 DDRD |= (1 << 7);<br /> UCSR0B = 0x00;
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 25; //38400 low speed ( @ 16 MHz)
 UBRR0H = 0x00;
 UCSR0B = ( 1 << TXEN0 )|( 1 << RXEN0 ); <br /> UART0_rx_reset();
}

Братья есть мысль что проблема в UCSR0C

есть мысли