Jump to content
Duhas

Примеры Кода Для Avr

Recommended Posts

Здесь будут помещаться различные примеры кода и прочего обсуждаемого в других темах. Также скидывайте сюда любую полезную информацию по AVR микроконтроллерам

Он-лайн книга: "Книга по программированию микроконтроллеров AVR (ассемблер)"

Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers: Atmel AVR4027 (Оптимизация кода от Atmel).pdf

Edited by admin
Добавил PDF

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

Share this post


Link to post
Share on other sites

Вот вам один кодок, для начала. Он 100% рабочий :)

Это пример работы USART на МК Atmega16 при частоте кварца 11,059000

#include <mega16.h> //обычный хидер
#include <m8_128.h> //хидер для битов
#include <delay.h>

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// Буфер - USART Receiver buffer
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index]=data;
 rx_wr_index ++; // инкремент индекса
 if (rx_wr_index == RX_BUFFER_SIZE)
  { 
 rx_wr_index=0;
  };

 ++rx_counter;
  if (rx_counter == RX_BUFFER_SIZE)
  {
  rx_counter=0;
  rx_buffer_overflow=1;
  };
  };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
// взять символ из созданного буфера USART
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Глобальные переменные

void main(void)
{
// Локальные переменные

PORTD=0x00;
DDRD=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;


// Global enable interrupts
#asm("sei")

delay_ms(100);//пауза
printf("Hello world\r\n"); //отправляем строчку и переходим на новую строчку, и возвращаем калитку.
delay_ms(100);//пауза
printf("-=gga=-\r\n");	
}

Теперь то я надеюсь флуд будет удалён :) Да и это :

Народ, по активнее будьте, не жалейте коды!!!!!

PS Так чтоли ?


Я был механик, я есть механик, я буду механик

Share this post


Link to post
Share on other sites

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


«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

Share this post


Link to post
Share on other sites

Импульсный источник питания - расчет за 10 минут в eDesignSuite

Как ориентироваться в огромном количестве существующих вариантов, чтобы выбрать наиболее подходящий для конкретного случая. «Ручной» перебор всех вариантов может оказаться весьма трудоемким процессом, а полученный результат – далеко не оптимальным. Специализированное программное обеспечение, позволяет уменьшить количество рутинных операций при проектировании.

Подробнее

не знаю, будет ли вам это полезно, просто у меня была недавно задача прошить ATmega16-16PU, и сделал я это с помощью программатора на 5 поводков, который присутствует вот по етой ссылки, и еще много полезного для начинающих: http://www.123avr.com/07.htm

Share this post


Link to post
Share on other sites
                     

Как упростить выбор ИП для промышленного применения?

Компания Mean Well выпускает широкий перечень встраиваемых источников питания с креплением на шасси, имеющих, на первый взгляд, схожие характеристики. Статья расскажет о ключевых особенностях выпускаемых семейств и упростит выбор источника питания для промышленного применения.

Подробнее

Этот программатор уже не раз обсуждался на этом форуме :)


Я был механик, я есть механик, я буду механик

Share this post


Link to post
Share on other sites
                     

Преимущества новых высоковольтных SOI-драйверов Infineon

При производстве драйверов силовых транзисторов компания Infineon использует различные технологии: JI, SOI, CT. Драйверы, выполненные с применением технологии SOI, имеют целый ряд преимуществ по сравнению с классическими JI-драйверами. В статье рассматриваются эти преимущества на примере новых семейств драйверов 650 В 2ED210x и 2ED218x.

Подробнее


Здравствуйте. :rolleyes: Вот код написал для управления матрйчным-LCD(Программа реализована на CodeVisionAVR).

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

#include <mega32.h>
#include <delay.h>
#include <mem.h>
#include <stdlib.h>
//--------------------------------------------------------------------------------------
unsigned char l_display_array[4][122];
unsigned char l_mask_array[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*struct IMG_DEF 
{ 
unsigned char width_in_pixels;	  
  	unsigned char height_in_pixels;	 
  	unsigned char *char_table; 
}; */
//--------------------------------------------------------------------------------------
void intn()
{									
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x07;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;

ACSR=0x80;
SFIOR=0x00;
}
//--------------------------------------------------------------------------------------
void lcd_strobe_e(unsigned char ncontr)
{ 
delay_us(2);
  	if ( ncontr & 0x01 ) 
PORTB.1 &= 0;
  	if ( ncontr & 0x02 ) 
PORTB.2 &= 0;
  	delay_us(2);
  	PORTB.1 |= 1;
PORTB.2 |= 1;
}
//--------------------------------------------------------------------------------------
void lcd_out_ctl(unsigned char cmd, unsigned char ncontr)
{ 
PORTB.0 &= 0;
  	PORTA = cmd;
  	lcd_strobe_e(ncontr);
}
//--------------------------------------------------------------------------------------
void lcd_out_dat(unsigned char dat, unsigned char ncontr)
{ 
PORTB.0 |= 1;
PORTA = dat;
lcd_strobe_e(ncontr);
}
//-----------------------------------------------------------------
void lcd_init1(void)
{   
lcd_out_ctl(0,3);
lcd_out_ctl(0xE2,3);
delay_ms(100);   
lcd_out_ctl(0xAF,3);
  	lcd_out_ctl(0xA1,3); 
  	lcd_out_ctl(0xC0,3);
  	lcd_out_ctl(0xB8,3);
  	lcd_out_ctl(0x00+19,3);
} 
//--------------------------------------------------------------------------------------
void lcd_update(unsigned char top, unsigned char bottom)
{ 
unsigned char x, y, yt, yb, *colptr;   	
  	yb=bottom>>3;									
  	yt=top>>3;		

  	for(y=yt;y<=yb;y++)
	{ 
		lcd_out_ctl(0xB8+y,3);
//	 lcd_out_ctl(LCD_SET_COL+LCD_STARTCOL_REVERSE,3);
 		lcd_out_ctl(0x00+0,3);
		  colptr=&(l_display_array[y][0]);
		  for (x=0;x<122;x++)
   			{ 
   				if (x<61) 
				lcd_out_dat(*colptr++,1);
	 			else 
				lcd_out_dat(*colptr++,2);
   			}
	}
}
//--------------------------------------------------------------------------------------
void lcd_update_all(void)
{ 
lcd_update(0,31);
}
//--------------------------------------------------------------------------------------
void lcd_fill(unsigned char pattern)
{ 
unsigned char page, col;

  	for (page=0; page<4; page++) 
	{ 
		for (col=0; col<122; col++) 
	 	l_display_array

[col]=pattern;
	}
  	lcd_update_all();
}
//--------------------------------------------------------------------------------------
void lcd_erase(void)
{ 
lcd_fill(0x00);
  	lcd_update_all();
}
//--------------------------------------------------------------------------------------
void lcd_dot(unsigned char x, unsigned char y, unsigned char mode) 
{ 
unsigned char bitnum, bitmask, yByte;
  	unsigned char *pBuffer;
  	if ( ( x > 121 ) || ( y > 31 ) ) return;
  	yByte   = y >> 3; 
  	bitnum  = y & 0x07;
  	bitmask = l_mask_array[bitnum]; 
  	pBuffer = &(l_display_array[yByte][x]);
  	switch (mode) 
	{ 
		case 1:
	 	*pBuffer |= bitmask;
	 	break;
		  case 0:
	 	*pBuffer &= ~bitmask;
	 	break;
		  case 2:
	 	*pBuffer ^= bitmask;
	 	break;
		  default: break;
	}
}
//--------------------------------------------------------------------------------------
/*void lcd_line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, unsigned int mode ) 
{ 
unsigned int length, xTmp, yTmp, i, y, yAlt;
  	int m;

  	if(x1 == x2) 
	{ 


		  if(y1 > y2) 
   			{ 
   				xTmp = x1;
	 			yTmp = y1;
	 			x1 = x2;
	 			y1 = y2;
	 			x2 = xTmp;
	 			y2 = yTmp;
   			}
		  length = y2-y1;
		  for(i=0; i<=length; i++) 
	 	lcd_dot(x1, y1+i, mode);
	} 
  	else 
  	if(y1 == y2) 
  		{ 
		  if(x1 > x2) 
   			{ 
   				xTmp = x1;
	 			yTmp = y1;
	 			x1 = x2;
	 			y1 = y2;
	 			x2 = xTmp;
	 			y2 = yTmp;
   			}

		  length = x2-x1;
		  for(i=0; i<=length; i++) 
	 	lcd_dot(x1+i, y1, mode);	   
	} 
 else 
	{ 

		  if(x1 > x2) 
   			{ 
   				xTmp = x1;
	 			yTmp = y1;
	 			x1 = x2;
	 			y1 = y2;
	 			x2 = xTmp;
	 			y2 = yTmp;
   			}		
		  if((y2-y1) >= (x2-x1) || (y1-y2) >= (x2-x1)) 
   			{ 

	 			length = x2-x1;							
	 			m = ((y2-y1)*200)/length;
	 			yAlt = y1;
	 			for(i=0; i<=length; i++) 
					  { 
						  y = ((m*i)/200)+y1;
						if((m*i)%200 >= 100)
		   				y++;
						else if((m*i)%200 <= -100)
		   				y--;

						lcd_line(x1+i, yAlt, x1+i, y, mode );
						if(length<=(y2-y1) && y1 < y2)
		   				yAlt = y+1;
						else if(length<=(y1-y2) && y1 > y2)
		   				yAlt = y-1;
						else
		   				yAlt = y;
					  }
   			} 
	   	else
   			{						
	 			if(y1 > y2)
					  { 
						  xTmp = x1;
						yTmp = y1;
						x1 = x2;
						y1 = y2;
						x2 = xTmp;
						y2 = yTmp;
					  }
	 			length = y2-y1;
	 			m = ((x2-x1)*200)/length;
	 			yAlt = x1;
	 		   	for(i=0; i<=length; i++)
					  { 
						  y = ((m*i)/200)+x1;

						if((m*i)%200 >= 100)
		   				y++;
						else if((m*i)%200 <= -100)
		   				y--;

						lcd_line(yAlt, y1+i, y, y1+i, mode);
						if(length<=(x2-x1) && x1 < x2)
		   				yAlt = y+1;
						else if(length<=(x1-x2) && x1 > x2)
		   				yAlt = y-1;
						else
		   				yAlt = y;
					  }
   			}
	}  
}*/	
//--------------------------------------------------------------------------------------
void lcd_circle(unsigned int xCenter, unsigned int yCenter, unsigned int radius, unsigned int mode) 
{ 
int tSwitch, y, x = 0;
unsigned int d;

  	d = yCenter - xCenter;
  	y = radius;
  	tSwitch = 3 - 2 * radius;

  	while (x <= y) 
	{ 
		lcd_dot(xCenter + x, yCenter + y, mode);
		  lcd_dot(xCenter + x, yCenter - y, mode);

		  lcd_dot(xCenter - x, yCenter + y, mode);
		  lcd_dot(xCenter - x, yCenter - y, mode);

		  lcd_dot(yCenter + y - d, yCenter + x, mode);
		  lcd_dot(yCenter + y - d, yCenter - x, mode);

		  lcd_dot(yCenter - y - d, yCenter + x, mode);
		  lcd_dot(yCenter - y - d, yCenter - x, mode);

		  if (tSwitch < 0) 
		tSwitch += (4 * x + 6);
		  else 
   			{ 
   				tSwitch += (4 * (x - y) + 10);
	 			y--;
   			}
		  x++;
	}
}
//--------------------------------------------------------------------------------------
/*void lcd_bitmap(unsigned int left, unsigned int top, struct IMG_DEF *img_ptr, unsigned int mode)
{ 
	unsigned int width, heigth, h, w, pattern, mask;
  	unsigned int* ptable;

  	width  = peekb(&(img_ptr->width_in_pixels));
  	heigth = peekb(&(img_ptr->height_in_pixels));
  	ptable  = (unsigned int*) peekw(&(img_ptr->char_table)); 

  	for ( h=0; h<heigth; h++ ) 
	{ 
		mask = 0x80;
		  pattern = peekb( ptable ); 
		  ptable++;
		  for ( w=0; w<width; w++ ) 
   			{
   				if ( pattern & mask ) 
				lcd_dot(w+left, h+top, mode);

	 			mask >>= 1;
	 			if ( mask == 0 ) 
					  { 
						  mask = 0x80;
						pattern = peekb( ptable );
						ptable++;
					  }	
   			}
	}
} */
//--------------------------------------------------------------------------------------
/*void lcd_glyph(unsigned int left, unsigned int top, unsigned int width, unsigned int height, unsigned int *glyph_ptr, unsigned int store_width)
{ 
	unsigned int bit_pos;
  	unsigned int byte_offset;
  	unsigned int y_bits;
  	unsigned int remaining_bits;
  	unsigned int mask;
  	unsigned int char_mask;
  	unsigned int x;
  	unsigned int *glyph_scan;
  	unsigned int glyph_offset;

  	bit_pos = top & 0x07;		
  	glyph_offset = 0;			 
  	char_mask = 0x80;			

  	for (x = left; x < (left + width); x++)
	{ 
		byte_offset = top >> 3;			
		  y_bits = height;		
		  remaining_bits = 8 - bit_pos;	
		  mask = l_mask_array[bit_pos];	
		  glyph_scan = glyph_ptr + glyph_offset;	 							  
		  while((y_bits) && (byte_offset < 4))  
   			{						 

	 			if(peekb(glyph_scan) & char_mask)
				l_display_array[byte_offset][x] |= mask;	
	 			else
				l_display_array[byte_offset][x] &= ~mask;	

	 			if(l_mask_array[0] & 0x80)
				mask >>= 1;
	 			else
				mask <<= 1;

	 			y_bits--;
	 			remaining_bits--;
	 			if(remaining_bits == 0)
					  {							  
						remaining_bits = 8;
						byte_offset++;
						mask = l_mask_array[0];
					  }		 			 
	 			glyph_scan += store_width;
   			}		  
		  char_mask >>= 1;
		  if(char_mask == 0)				
   			{ 
   				char_mask = 0x80;
	 			glyph_offset++;
   			}
	}   
}*/
//--------------------------------------------------------------------------------------
/*void lcd_box(unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int mode) 
{
unsigned int i;
  	if (!width) return;
  	width--;	
  	for (i=y;i<y+height;i++) 
lcd_line(x, i, x+width, i, mode);
}*/
//--------------------------------------------------------------------------------------
/*void lcd_text_intern(unsigned int left, unsigned int top, unsigned int font, char *str, unsigned int inprogmem)
{ 
	unsigned int x = left;
  	unsigned int glyph;
  	unsigned int width;
  	unsigned int height, defaultheight;
  	unsigned int store_width;
  	unsigned int *glyph_ptr;
  	unsigned int *width_table_ptr;
  	unsigned int *glyph_table_ptr;
  	unsigned int glyph_beg, glyph_end;
  	unsigned int fixedwidth;

  	defaultheight = peekb ( &(fonts[font].glyph_height) );
  	store_width = peekb ( &(fonts[font].store_width) );
  	width_table_ptr = (unsigned int*) pgm_read_word( &(fonts[font].width_table) );
  	glyph_table_ptr = (unsigned int*) pgm_read_word( &(fonts[font].glyph_table) );
  	glyph_beg  = peekb( &(fonts[font].glyph_beg) );
  	glyph_end  = peekb( &(fonts[font].glyph_end) );
  	fixedwidth = peekb( &(fonts[font].fixed_width) );

  	if (inprogmem) 
glyph = peekb(str);

  	else 
glyph = (unsigned int)*str;

  	while(glyph != 0x00) // while(*str != 0x00)
	{	 		
		  if((glyph < glyph_beg) || (glyph > glyph_end))
	 	glyph = peekb( &(fonts[font].glyph_def) );


		  glyph -= glyph_beg;
		  if(fixedwidth == 0)
		// width=fonts[font].width_table[glyph];	
	 	width=peekb(width_table_ptr+glyph);
		  else 
	 	width = fixedwidth;

		  height = defaultheight;
		  //glyph_ptr = fonts[font].glyph_table + ((unsigned int)glyph * (unsigned int)store_width * (unsigned int)height);
		  glyph_ptr = glyph_table_ptr + ((unsigned int)glyph * (unsigned int)store_width * (unsigned int)height);

		  if(x > 121)
	 	x = 121;

		  if((x + width) > 121+1)
	 	width = 121 - x + 1;

		  if(top > 31)
	 	top = 31;

		  if((top + height) > 31+1)
	 	height = 31 - top + 1;

		  lcd_glyph(x,top,width,height,glyph_ptr,store_width);  

		  x += width;		
		  str++;			
		  if (inprogmem) 
	 	glyph = peekb(str);
		  else 
	 	glyph = (unsigned int)*str;	   
	}
}
//--------------------------------------------------------------------------------------
void lcd_text(unsigned int left, unsigned int top, unsigned int font, const char *str)
{
lcd_text_intern(left, top, font, str, 0);
}
//--------------------------------------------------------------------------------------
void lcd_text_p(unsigned int left, unsigned int top, unsigned int font, const char *str)
{ 
	lcd_text_intern(left, top, font, str, 1);
}*/
//--------------------------------------------------------------------------------------
void main(void)
{
intn();
lcd_init1();
while (1)
{		
	lcd_erase();	   

   /*	lcd_line(121,31,1,31,1);
	  lcd_line(121,1,1,1,1);
	  lcd_line(121,1,121,31,1);
	  lcd_line(1,1,1,31,1);
	  lcd_line(119,29,3,29,1);
	  lcd_line(119,3,3,3,1);
	  lcd_line(119,3,119,29,1);
	  lcd_line(3,3,3,29,1);*/				
	  lcd_circle(90,20,15,1);
	  lcd_circle(20,10,5,1);
	  lcd_update_all();
	  delay_ms(2000);		  

 /* 
	  lcd_text(5,4,FONT_SIX_DOT,"#abcdefghijkl");		  
	  lcd_text(5,20,FONT_SEVEN_DOT,"mnopqrstuwxyvz");*/		  


   /*	lcd_box(2,2,118,28,2);		  


  /*	lcd_erase();
	  lcd_text(4,7,FONT_EIGHTEEN_DOT,"12:34:56");*/		  


   /*	lcd_erase();
	  lcd_text(5,0,FONT_NINE_DOT,"EW12A03GLY");
	  lcd_text(5,16,FONT_SEVEN_DOT,"Proteus VSM");		  
	  lcd_box(0,0,121+1,31+1,LCD_MODE_XOR);	  
	  lcd_box(0,0,121+1,31+1,LCD_MODE_XOR);*/


   /*	lcd_bitmap(90, 1, &frame_bmp, 1);		  
	  lcd_erase();  */		

  /*
	  lcd_text_p(6,3,FONT_NINE_DOT,PSTR("Labcenter")); 
	  lcd_text_P(6,15,FONT_SEVEN_DOT,"Electronics");*/
  }; 
}

Share this post


Link to post
Share on other sites

А для какого это дисплея ? Есл можно, скажите название :)


Я был механик, я есть механик, я буду механик

Share this post


Link to post
Share on other sites

Конечно скажу эта программа написана под дисплей SED1520. Но переписать эту программу под любой другой дисплей не составляет ни какой сложности. И вот ещё что эта программа находится в разработке, и если кто хочет помочь в написании программы очень буду рад.

Share this post


Link to post
Share on other sites

Начинаю изучать AVR микроконтроллеры. Скажите какой купить для экспериментов? Скачал книжку "AVR микроконтроллеры. Вводный курс", пока читаю возник лишь один вопрос, а главное понятно написано. Там на AT90S2313 но их уже не производят. Возник вопрос: что такое подтяжка? Зачем она используется?

Share this post


Link to post
Share on other sites

Да какой угодно :) Я купил atmega128 и на днях возьму atmega16. Только платформу для испытаний осталось собрать. Будем изучать вместе :)

Подтяжка - резистор, который подключается к выходу микроконтроллера. Так выход представляет из себя, грубо говоря, открытый сток, который торчит наружу. Включение подтяжки позволяет подключить к нему внутри микроконтроллера резистор (вторым концом наверх - +Vdd).


* Origin: I live... somewhere in time!

Share this post


Link to post
Share on other sites

Всеравно насчет подтяжки не понял. Подтяжка-резистор одним концом на ногу вторым на +?

Что такое открытый сток (извините если вопрос выглядит глупым)? Собственно для чего?

Share this post


Link to post
Share on other sites

Внутри АВР-ок есть встроенные резисторы подтяжки. Их можно програмно включать или отключать.

post-31916-1191585080_thumb.jpg

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

Нет, никакой там не открытый сток, а полноценный выход. Подтяжка полезна когда нога контроллера включена как вход.

Share this post


Link to post
Share on other sites

Почему она полезна когда нога как вход? Как это влияет? Как я понял на ногу подается некоторое (малое)положительное напряжение.

Кстати Юра а ты с каких AVRок начинал?

Share this post


Link to post
Share on other sites

С 90S2313 начинал.. Вру! - с Z80 начинал (Spectrum)

Когда нога сконфигурирована как вход (регистр DDRx за это отвечает), то его входное сопротивление очень велико и нога как-бы болтается в воздухе, ловя всякие наводки. Включив подтяжку мы "поднимаем" потенциал на ноге к VCC (т.е. к +) через резистор. Теперь к примеру кнопку можно зацепить между входом МК и нулём. Нажал кнопку - на входе 0, отпустил - на входе +5 через внутренний резистор.

Share this post


Link to post
Share on other sites

Спасибо! Теперь понял. Подтяжка обязательно нужна когда вывод является входом иначе МК не сможет определить когда будет 0 или будет ложно срабатывать при ловле случайной помехи. Этот вопрос закрыт. Теперь следующий, по работе таймера TCNTO:Таймер постоянно считает- напимер в любой момент времени считать с него и там будет какоето число от 0 до 255, или только при обращении к нему он будет считать- например обратился к нему, считал 0, обратился к нему во второй раз считал 1 и т.д. . Просто не пойму как работает кусочек программы которая формирует секундную задержку(частота 2400Гц):

Idi r17,30 ; Начальное значение счетчика 30

Idi r18,80 ; Начальное значение маркера 80

TimeLoop:

out TSNTO,r16 ; сохраняем содержимое таймера в r16

cp r16,r18; сравниваем r16 и r18

brne TimeLoop;Есни не равны то переходим к началу цикла

subi r18,-80;прибавляем 80 к r18

dec r17,30; уменьшаем r17 на 1

brne TimeLoop; К началу цикла

Вопрос таков если таймер постоянно работает то не может ли в начале цикла таймер сразу быть равным 80 и не отсчитает 80 циклов или если например 79 то отсчитает 1 вместо 80?

Прошу помощи разьеснить мне, а то эту страницу в книге уже раз 7 перечитывал - не пойму.

Share this post


Link to post
Share on other sites

Здраствуйте. Помогите разобраться. Пользуюсь CVAVR. Приобрёл недавно программатор AVRISP mkII - In-System Programmer. Первое что сделал - воткнул его в USB. Комп обнаружил новое устройство, но драйвер я найти на него не смог. Хотя с программатором в упаковке был диск. Может и не нужно устанавливать ничего?

Share this post


Link to post
Share on other sites

для Geiby

Честно говоря, для начинающих это какой-то неудачный пример. Хоть и несколько строчек, но как-то всё хитро завёрнуто :huh:

Ну, во-первых опечатки:

out TSNTO,r16 ; сохраняем содержимое таймера в r16
должно быть: in r16,TCNT0

Дальше по делу. Таймер считает постоянно, как только ты разрешил его работу. В этом его и прелесть. Если тебе важно с какого значения он начнет считать, просто загрузи это значение в TSNT0 перед началом цикла. Если надо с нуля, грузи туда ноль.

В данном примере даже если не обнулять TSNT0 перед началом цикла, ошибка может быть только при первом проходе цикла. Из внутреннего цикла выходим когда счетчик сравняется с маркером r18, и потом сразу же этот маркер увеличивается на 80, т.е. по-любому счётчику опять придётся тикнуть именно 80 раз.

ИМХО, пример какой-то идиотский :wacko: К чему весь этот гемморой не понятно, возможно просто он вырван из контекста какой-то задачи, где это оправдано...

Edited by YurkaM

Share this post


Link to post
Share on other sites
Здраствуйте. Помогите разобраться. Пользуюсь CVAVR. Приобрёл недавно программатор AVRISP mkII - In-System Programmer.... но драйвер я найти на него не смог. Хотя с программатором в упаковке был диск. Может и не нужно устанавливать ничего?

AVR studio имеет свои дрова на него.

Кстати, на диске, думаю есть инсталяшка AVR Studio. В процессе установки там можно установить галку чтобы поставились дрова для твоего девайса.

"Start the AVR Studio installation. During this installation the dialog box in the figure below will be presented to the user"

Если АВР Студио уже установлен, делай так:

Install USB driver after AVR Studio is installed

The USB driver can be installed even after AVR Studio have been installed by following these steps:

1. Open "Control Panel" on the PC (Windows 95 and Windows NT does not support USB)

2. Select "Add or Remove Programs"

3. Select "AVRStudio4" in the list of programs

4. Click on the "Change" button

5. Select "Modify"

6. Select "Install/upgrade USB Driver"

The USB driver is now properly installed on the PC

Но, по-моему, этот программатор/отладчик без АВР Студио работать вообще не может.

Edited by YurkaM

Share this post


Link to post
Share on other sites

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

Не, это просто пример. Акак ты посоветуешь сделать задержку на 2400 циклов?

Кстати ты на ассемблере пишешь?

Share this post


Link to post
Share on other sites

Помогите найти документацию на ATmega8515 желательно на руском!

Share this post


Link to post
Share on other sites

Скачивал большую книжку "Микроконтроллеры AVR семейства Mega А.В.Евстифеев 2007" с natahaus.ru. Там про все мега. Весит больше 10 метров, качество отличное. Если сам не найдёшь, могу залить на какой-нить файлообменник.

ps: А всё ж лучше иметь это в бумажном виде!

Вот живые ссылки (проверял):

http://rapidshare.com/files/30768468/Mikro...MEGA._2007_.rar

http://natahaus.ifolder.ru/1907153

Вообще на натахауз заходишь, регишся, потом вбиваешь в поиск по сайту "микроконтроллер AVR" или просто "AVR" и будет тебе счастье!

Edited by YurkaM

Share this post


Link to post
Share on other sites

помогите разобраться с VMLAB .

как в VMLAB на вход мк подать импульсный сигнал 40 импульсов в секунду

Share this post


Link to post
Share on other sites

Я бы посоветовал тебе поставить протеус, там функций больше, да и визуально с ним работать проще.


Я был механик, я есть механик, я буду механик

Share this post


Link to post
Share on other sites
Я бы посоветовал тебе поставить протеус, там функций больше, да и визуально с ним работать проще.

А я бы рекомендовал купить или спаять опытную модель. Так как в протеусе много известных проблем. Да и вообще что может быть лучше чем живое устройство?:)

В протеусе, например, нельзя подключить отладчик к JTAG.

Share this post


Link to post
Share on other sites

Протеус симулирует ход действий МК а аналогувую часть надо подбирать самому. оверьте мне для начинающих в микроконтроллерах протеус самый лучший инструмент ну и компилятор тоже :) Я сам начинающий и по этому знаю что говорю :)

А спаять устройство не всегда возможно...


Я был механик, я есть механик, я буду механик

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Четыре с половиной года зрел! С марта 2016 года!...... Денежку копил наверное....
    • конденсаторы не причем ,это к предыдущему коменту .А вопрос про выход отдельно.
    • Уровень техники 70-х годов прошлого века: Шесть подряд абсолютно успешных полётов на Луну и обратно сразу с людьми, без предварительных натурных беспилотных испытаний, с многочисленными перестыковками, взлётами с Луны, посадкой абсолютно здоровых, великолепно себя чувствующих астронавтов, взрыв кислородного баллона на полпути к Луне не приводит к отклонению от орбиты ... Да, да, всё правда. Такая вот абсолютно надёжная американская техника была.
    • По 300 рублей я бы с руками такую оторвал)) У нас в Ангарске за такую на авито не меньше 1500 просят! v1ct0r сегодня замерял. Напряжение на мосту 212 -230 42В При включении к7 падает с 42 до 16 вольт. А на трансформаторе с 24 вольт до 21. Диоды все целые. Тот мост что 3х фазный не работает большую часть времени а включается только при торможении. 218 212 не звонятся. Что вчера насоветовали всё сегодня проверил. Всё исправно.  Slavka да там нет конденсаторов сглаживающих вообще.Пусть хоть 240 строго. Всё равно выход моста больше амплитудного. На землю ничего нигде не звонится. Единственное перепутаны + с -, то есть на общий идет на все потребители 212 а комутируется 230. 
    • Здравствуйте. Имеется: 1. НЧ динамики: 25 ГДН-1Л-4  (4 Ом) от колонок 35 АС-248 «Корвет» 2. Фильтры от колонок 35 АС-248 «Корвет» 3. Твитеры из Китая NE 80 Характеристики (китайские): Максимальная мощность 30 Вт Номинальная мощность 15 Вт Номинальное сопротивление 6 Ом Сопротивление постоянного тока 5.1 Ом Чувствительность 91дб Резонансная частота 960 Гц Рекомендуемый кроссовер> = 2800 Гц Частотный диапазон F0-40k Гц Подскажите пожалуйста, как можно (если можно) из этих динамиков, используя детали фильтров от 35 АС-248 «Корвет», собрать двухполосную акустику.       
    • И причём тут эти конденсаторы?
  • Similar Content

    • By Rad TV
      Скетч простой и кислий. Сделан автором RadTV канал:https://www.youtube.com/channel/UC1k5elIKErFnmwTzIsRgQrA?view_as=subscriber
      Буду рад рокомендациях и помощи!Сделал сам проект должен бить простим и  что би влезло в ATtini85!
      Есть защита акб и просто парения (!!!Кнопка на розмикания!!!)
      Обновления будут!!!!
       
       
      RadMOD ver1.0.txt
    • By Prozac
      Здравствуйте, уважаемые форумчане! Вообще говоря, не имею такой привычки - донимать людей вопросами, и до всего стараюсь доходить самостоятельно. Но в данном случае без "помощи зала" совсем никак: перепробовал уже все, что только смог придумать - а "воз и ныне там! Поэтому и обращаюсь сюда - возможно, кто-то уже сталкивался с чем-то подобным, и сумел найти решение...
      Суть проблемы в следующем: решил построить ШИМ-контроллер для автомобильного вентилятора охлаждения ("карлсона"), но никак не могу заставить его работать - как только открываются VT2 и VT3, подключая нагрузку, МК уходит в резет или виснет (чаше - первое)!.. Сбросившись, опять пытается подключить нагрузку, и опять резетится, и так - без конца! Причем, изначально решил испытать схему не на индуктивной нагрузке (электромоторе), а на вполне себе пассивной 60Вт (около 3A по току) лампочке из фары - и та же фигня: МК пытается запуститься, сбрасывается, лампа моргает, дергается... Даже не ШИМ, а обычное мигание лампой с частотой 1Гц через несколько вспышек или вешает МК, или резетит его (что видно по сбою ритма моргания). При этом без нагрузки - по осциллографу, подключенному к ноге 5 МК или к нижнему (по схеме) выводу R7 - все отлично: наблюдается ровный и чистенький ШИМ-сигнал, изменяющийся согласно тестовой программе! Однако, стоит подать нагрузку, как осциллограмма начинает прыгать: появляются ШИМ-импульсы, затем ровная линия, затем снова импульсы с тем заполнением, которое должно быть в самом начале программы... Собственно, это наблюдение и позволило сделать вывод о том, что МК перезагружается.
      Естественно, первая мысль - слабый лабораторник (он у меня импульсный, самодельный, где-то на 3А - действительно слабый; но та же петрушка наблюдалась и при попытках питать устройство от трансформаторного ЗУ на 10А). Ну, пригнал машину, снял с нее аккум (100% свежий и не дающий просадок!), запитал от него - однако проблема повторилась... Значит, дело не в питании!.. Пробовал много различных танцев с бубном: отключал внешнюю цепочку сброса R2-C2 (результат - ноль), включал BOD микроконтроллера (стало еще хуже), подвешивал вместо C4 и C6 электролиты большей емкости (не помогло)... Думал, что, возможно, кондеи C4 и C6 разряжаются через R7 - экспериментировал с его сопротивлением (от 100 до 960 Ом), перекидывал его верхний вывод на анод VD1 (чтобы отсечь резистор от фильтрующих C4 и C6) - тщетно... Грешил даже на то, что какие-то проблемы вносит емкость затворов VT2 и VT3 - уменьшал сопротивление R10 и R12, дабы затвор быстрее "разряжался" - безрезультатно...
      Игрался с частотой МК и ШИМ - перебрал частоты ШИМ от 18 до 4687 Гц; пытался запускать нагрузку с разным заполнением ШИМ, от 10 до 40% - как глючило, так и глючит... Т.е., перелопатил, практически, всю схему!
      Удалось заставить устройство нормально работать на лампу, и даже на пару спаралеленных электродвигателей МЭ218 (от "печки") следующим образом: R8 был исключен (вместо него - перемычка), а C7 (изначально - К73-17В всего на 0,47мкФ) был заменен на пару электролитов по 1500мкФ, включенных плюс к плюсу последовательно (для устранения полярности кондеев). Нагрузка стала нормально подключаться, отрабатывать как на повышение, так и на убывание заполнения ШИМ. Двигатели отлично работали как при ступенчатом изменении ШИМ-заполнения, так и при плавном. Единственное, что при попытке подать на двигатели ШИМ с заполнением менее 20%, МК опять начинал дергаться и резетить, а так же резетил при резком отключении движков: если раскрутить их до 100%, а потом снять сигнал, то МК перезагружался; однако, если после 100% плавно понижать обороты где-то до 40%, и лишь потом снимать сигнал, то схема работала нормально. Плюс, очень сильно нагревались электролиты C7...
      Однако, когда принес схему в машину - для отладки непосредственно в "боевых условиях", и подключил мощный двигатель вентилятора, началась старая песня с резетами...
      Сейчас, вроде бы, "осенило" - поменял VD2 на Шоттки 1N5822 - лампочка запустилась на "ура" даже без С7; так же отлично и мягко стартовала спарка из МЭ218 - радостный побежал к машине... Но с "карлсоном" - опять мимо: МК вновь ушел в перезагрузку... Все: я не знаю, что тут делать - каждую деталь уже перелопатил, и кучу вариантов испробовал!!! Но ничего не понятно(( Вот и прошу помочь: может быть, кто-то уже был в такой ситуации, и как-то решил подобную проблему?
      VT2 и VT3 стоят "фирменные", IR-овские (не Китай) - из "Чип и Дипа". ATtiny13 - с Алиэкспресс; чтобы исключить возможность брака конкретной микросхемы, пробовал ставить в схему несколько разных экземпляров МК (из одной посылки). DS18B20 пока еще не подключал (нужно разобраться с ШИМ!). IRF3205 каскадированны для уменьшения нагрева (хотя его и так практически нет), и для дополнительной надежности (чтобы в случае выхода из строя одного транзистора не перегреть машину). Тестовую программу специально написал "китайским стилем", без циклов и т.п. - чтобы она была максимально простой, наглядной и линейной - для уверенности, что не в ней дело.
      Подскажите пожалуйста - откуда эти резеты, и как с ними бороться? Как заставить схему отрабатывать на мощную нагрузку? Заранее благодарю!!!
       
       
      ;*************ТЕСТОВАЯ ПРОГРАММА************* ;============ДИРЕКТИВЫ ТРАНСЛЯТОРУ=========== .device ATtiny13 .include "tn13def.inc" .list ;Обзывательство регистров .def Temp = R16 .cseg .org 0x00 ;=========ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ======== rjmp Begin //Начальный сброс reti //Внешнее прерывание INT0 reti //Изменение состояния любой линии reti //Переполнение T0 reti //Готовность EEPROM reti //Срабатывание компаратора reti //Совпадение в канале A таймера T0 reti //Совпадение в канале B таймера T0 reti //Переполнение сторожевого таймера reti //Завершение преобразования в АЦП ;============МОДУЛЬ ИНИЦИАЛИЗАЦИИ============ Begin: ;-----Инициализация стека ldi Temp, RAMEND out SPL, Temp ;-----Отключение компаратора ldi Temp, 0x80 out ACSR, Temp ;-----Настройка портов ldi Temp, 0b00000111 out DDRB, Temp //PB0 - на вывод ;-----Настройка ШИМ ldi Temp, 0b11000001 out TCCR0A, Temp //Режим - быстрый ШИМ с инверсией ldi Temp, 0b00000010 out TCCR0B, Temp //Делим тактирование таймера на 8 rjmp Start //При старте пропускаем 5-секундную задержку ;===============ТЕСТОВЫЙ ЦИКЛ================ PWM: ldi Temp, 0b00000000 out OCR0A, Temp //ШИМ=0% rcall Delay5sec //Ждем 5 сек ;-----Повышаем скорость Start: ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 255 out OCR0A, Temp //ШИМ=100% rcall Delay2sec ;-----Понижаем скорость ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec rjmp PWM //Возвращаемся, и начинаем с 5 сек "молчания" ;===========ПОДПРОГРАММЫ ЗАДЕРЖКИ============ ;-----Задержка в 2 секунды Delay2sec: ldi R17, 253 ldi R18, 75 ldi R19, 29 L1: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L1 nop ret ;-----Задержка в 5 секунд Delay5sec: ldi R17, 253 ldi R18, 61 ldi R19, 73 L2: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L2 nop ret  

    • By Дмитрий Чуков
      Необходимо составить программу, которая формирует сигнал с частотой 1 кГц и скважностью 4 при помощи таймера. В CodeVision AVR написать программу и после в протеусе проверить, целый день уже бьюсь, не могу разобраться с таймерами. Вроде задача не трудная, если бы увидел, как это должно выглядеть в коде... Как настроить таймер для ATMega8A и решить эту задачу?
    • By Стас73
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
×
×
  • Create New...