реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> программирование атмега16
zeonix
сообщение May 18 2011, 09:11
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



хочу с ком порта передать на на мк 8, код 56. И если он его примет то PORTB=0x01;

Но возникли вопросы по функции приема данных USART_Receive.
Брал с книги конечно , но неправильная она вроде

Код
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.1b Evaluation
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 18.05.2011
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type               : ATmega16A
Program type            : Application
AVR Core Clock frequency: 1,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16a.h>

// Declare your global variables here

unsigned int USART_Receive(void)
{
unsigned char status,resh,resl;
while (!(UCSRA &(1<<RXC))){
status=UCSRA;
resh=UCSRB;
resl=UDR;
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
resh=(resh>>1)&0x01;
return((resh<<8)|resl);    
}
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x01;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 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;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

if (USART_Receive()==56)  
         PORTB=0x01;
         else  
          PORTB=0x04;


while (1)
      {
      // Place your code here

      }
}


Go to the top of the page
 
+Quote Post
yashok
сообщение May 18 2011, 09:36
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Немешало бы для начала настроить сам USART.

В функции приема, если нужно 9 бит, я бы написал так

Код
return(((int)resh<<8)|resl);
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 18 2011, 09:44
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



Код
unsigned int USART_Receive(void)
{
unsigned char status,resh,resl;
while (!(UCSRA &(1<<RXC))){
status=UCSRA;
resh=UCSRB;
resl=UDR;
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
resh=(resh>>1)&0x01;
return(((int)resh<<8)|resl);
}
}


так то есть?
Код
if (USART_Receive()==56)  
         PORTB=0x01;
         else  
          PORTB=USART_Receive();


чет вот тестирую он мне 11111 на порту выводит во всех случаях

то есть я полагаю
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
срабатывает
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 18 2011, 09:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(zeonix @ May 18 2011, 13:44) *
чет вот тестирую он мне 11111 на порту выводит во всех случаях ...то есть я полагаю if (status & (1<<FE)|(1<<DOR)|(1<<UPE)) срабатывает
Судя по:
Код
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x01;
DDRB=0xFF;
Ваша программа даже не запускается
Go to the top of the page
 
+Quote Post
yashok
сообщение May 18 2011, 09:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



USART не настроен.

На какой частоте работает проц и на какой скорости передает ваш com???
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 18 2011, 09:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



объясните пожалуйста. Просто я реально новичок в этом. толь собрал свою 1 схему
Go to the top of the page
 
+Quote Post
yashok
сообщение May 18 2011, 10:05
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Глядя на код хочется взглянуть еще и на схему.
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 18 2011, 10:07
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



схему пока показать не могу, нет возможности пока что.
настройка усарта
Код
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

так? 4800 бод сделал вроде

Сообщение отредактировал zeonix - May 18 2011, 10:07
Go to the top of the page
 
+Quote Post
yashok
сообщение May 18 2011, 10:17
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Если у вас проц на частоте 1 МГц работает, то все верно.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 18 2011, 12:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



1. Следует разобраться: почему у Вас при старте программы на порту все единицы? В начале работы Ваша программа заносит в порт В значение 0х01, поэтому до приёма некоего символа - на порту должна быть единица только в младшем разряде порта, в остальных - 0.

2. Ваш МК тактируется от внутреннего генератора или от кварца? Если - первое, то для USART - это не есть хорошо.

P.S. Оператор if хорошо бы переместить внутрь бесконечного цикла:
Код
while (1)
{
   if (USART_Receive()==56)  
         PORTB=0x01;
         else  
          PORTB=USART_Receive();
}
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 19 2011, 05:16
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



то есть кварц поставить?

Я кстати в авр студии 4.8 отлаживал. Дык из-за того что там UCSRA= 0 регистр, то цикл вечный получается на приеме данных. так и должно быть?
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 19 2011, 08:43
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



чето с
Код
unsigned char status,resh,resl;

unsigned int USART_Receive(void)
{
while (!(UCSRA &(1<<RXC))){
status=UCSRA;
resh=UCSRB;
resl=UDR;
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
resh=(resh>>1)&0x01;
return((resh<<8)|resl); }
//return resl;  
}

не правильная видимо.

переделал так:
Код
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.1b Evaluation
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 18.05.2011
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type               : ATmega16A
Program type            : Application
AVR Core Clock frequency: 1,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
#define RXCIE 7  
#define RXEN  4
#define TXEN  3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1

#include <mega16a.h>
#include <delay.h>

//однобайтный буфер
volatile unsigned char usartRxBuf = 0;



//инициализация usart`a
void USART_Init(void)
{
  UBRRH = 0;
  UBRRL = 51; //скорость обмена 9600 бод
  UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //разр. прерыв при приеме, разр приема, разр передачи.
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
}

#define UDRE 5
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
  while(!(UCSRA & (1<<UDRE)));
  UDR = sym;
}

//чтение буфера
unsigned char USART_GetChar(void)
{
  unsigned char tmp;
  unsigned char saveState = SREG;
  #asm("cli");
  tmp = usartRxBuf;
  usartRxBuf = 0;
  SREG = saveState;
  return tmp;  
}

//прием символа по usart`у в буфер
interrupt [USART_RXC] void usart_rxc_my(void)
{
  usartRxBuf = UDR;
}



// Declare your global variables here
/*
unsigned char status,resh,resl;

unsigned int USART_Receive(void)
{
while (!(UCSRA &(1<<RXC))){
status=UCSRA;
resh=UCSRB;
resl=UDR;
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
resh=(resh>>1)&0x01;
return((resh<<8)|resl); }
//return resl;  
}
   */  
  
   unsigned char sym;
  
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x01;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 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;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled

UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

   /*   if (USART_Receive()==56)  
         PORTB=0x02;
         else  
         PORTB=USART_Receive();
       */
      
      

  
  USART_Init();
//  LCD_Init();
  #asm("sei");
//  LCD_SendStringFlash("uart:");
  
  while(1){
    sym = USART_GetChar(); //читаем буфер
    if (sym){             //если что-то приняли, то
//      LCD_Goto(6,0);
//      LCD_WriteData(sym); //отображаем на lcd принятый символ
      USART_SendChar('O'); //отвечаем компу "Ok "
      USART_SendChar('k');  
      USART_SendChar(' ');  
    }
  }  
    
/*
while (1)
      {    
      // Place your code here  
       PORTB=0x01;
       delay_ms(1000);  
       PORTB=0x00;
       delay_ms(1000);  
      
  
      }  */

}

как http://www.chipenable.ru/index.php/program...usart-uart.html

все равно такой же эффект

Сообщение отредактировал zeonix - May 19 2011, 08:44
Go to the top of the page
 
+Quote Post
yashok
сообщение May 19 2011, 13:52
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Какой эффект?
Вы в прерывания попадаете??
Go to the top of the page
 
+Quote Post
zeonix
сообщение May 19 2011, 14:50
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-04-11
Пользователь №: 64 612



можете пояснить что происходит когда на МК на TxD (RxD ) подаешь сигнал?

То есть, вот есть переходник usb-com. Дальше с TxD и RxD ком порта идут на соответствующие порты ds232а(14 и 7(для 16 портового)). Затем с 11 и 10 заводим уже на атмегу.

Потом с ком порта передаем че нить(не важно че)
Сделать если PORTB= принятый байт , то чето да должно менятся же.

Дык вот... как сам процесс происходит?
Ну то есть прокомментируйте этот код:
Код
unsigned char status,resh,resl;

unsigned int USART_Receive(void)
{
while (!(UCSRA &(1<<RXC))){
status=UCSRA;
resh=UCSRB;
resl=UDR;
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
resh=(resh>>1)&0x01;
return((resh<<8)|resl); }
}


Если записать в вечный цикл PORTB= USART_Receive();
то все будут 11111 на порте Б. Так как он вылетит
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;

ну то есть касяк где то видимо. Если на ds232a замкнуть тупо TxD и RxD , то обратно значение вернется. Значит на порты МК норм передаваться должно + Мк работает, то есть проводил опыт без ком порта, светодиод подрубал - моргал.

То есть либо в функции этой че то не так.

Есть где почитать что происходит с Мк когда ему передают таким образом данные? то есть что с регистрами должно происходить7

Сообщение отредактировал zeonix - May 19 2011, 14:50
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 20 2011, 04:53
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(zeonix @ May 19 2011, 18:50) *
Если записать в вечный цикл PORTB= USART_Receive();
то все будут 11111 на порте Б. Так как он вылетит
if (status & (1<<FE)|(1<<DOR)|(1<<UPE))
return -1;
Само-сабой разумеется, т.к. условие всегда не ноль (см. приоритеты операций). Нужно записать: if (status & ( (1<<FE)|(1<<DOR)|(1<<UPE) ) )
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.03224 секунд с 7
ELECTRONIX ©2004-2016