All pastes #2109670 Raw Edit

Miscellany

public text v1 · immutable
#2109670 ·published 2012-02-04 12:50 UTC
rendered paste body
	#define usart_baudrate		9600L
	#define usart_bauddivider	(F_CPU / (16*usart_baudrate) - 1)
	#define usart_HI(x)		((x)>>8)
	#define usart_LO(x)		((x)& 0xFF)
	
        void
	init_usart(void){

	UBRRL = usart_LO(usart_bauddivider);
	UBRRH = usart_HI(usart_bauddivider);
	UCSRA = 0;
	UCSRB = 1<<RXEN |1<<TXEN |1<<RXCIE|0<<TXCIE|0<<UDRIE;
	UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;
	}

	#define twi_baudrate		10000L
	#define twi_bauddivider		(F_CPU / twi_baudrate - 16) / 2
		
	#define twi_PORT	PORTC				// Порт TWI (С по умолчанию)
	#define twi_DDR		DDRC
	#define twi_SCL		0					// Биты соответствующих выводов
	#define twi_SDA		1					// тоже по умолчанию
	
	#define twi_ADC_Address		0b10010010

        void
	init_twi(void){
	//twi_PORT |=  1<<twi_SCL|1<<twi_SDA;				// Включим подтяжку на ноги
	//twi_DDR  &=~(1<<twi_SCL|1<<twi_SDA);
 
	TWBR = twi_bauddivider;       					// Настроим битрейт
	TWSR = 0x00;	

        ISR (USART_RXC_vect){
	switch (UDR){
	
		case 'r': TWCR = ( 1<<TWINT|
						   0<<TWEA |
						   1<<TWSTA|
						   0<<TWSTO|
						   0<<TWWC |
						   1<<TWEN |
						   1<<TWIE );
										break;
										
		case 'b': buffer_index=0;
				  UDR = buffer[0];
				  UCSRB|=(1<<UDRIE);
										break;								

		default : 
				 						break;	
		}
	}
		ISR (USART_TXC_vect){
	
	}
	
	ISR (USART_UDRE_vect){						//
	
		buffer_index ++;						// Увеличиваем индекс
 
			if(buffer_index == buffer_MAX){  	// Вывели весь буффер? 
	
				UCSRB &=~(1<<UDRIE);			// Запрещаем прерывание по опустошению - передача закончена
			}
			else{ 
	
			UDR = buffer[buffer_index];			// Берем данные из буффера. 
			}
	}
	
	//	TWI			////////////////////////////////////////////////////////////////////////
	
	ISR(TWI_vect){							// Прерывание TWI. 
	switch(TWSR & 0xF8){						// Отсекаем биты прескалера и агализируем TWSR 
		case TW_BUS_ERROR:									
			{
			      TWCR = 	0<<TWSTA|
					1<<TWSTO|
					1<<TWINT|
					1<<TWEN|
					1<<TWIE;  			// Go!
 
	
			break;
			}
 
		case TW_START:										
			{
			
			TWDR = (twi_ADC_Address & 0xFE);		//  Адрес слейва + запись
			TWCR = ( 1<<TWINT|
					 0<<TWEA |
					 0<<TWSTA|
					 0<<TWSTO|
					 0<<TWWC |
					 1<<TWEN |
					 1<<TWIE ); 			// Go!
			break;
			}
 
		case TW_REP_START:									
			{
 
			TWDR = (twi_ADC_Address | 0x01);		// Адрес слейва  - чтение слейва
			TWCR = ( 1<<TWINT|
					 0<<TWEA |
					 0<<TWSTA|
					 0<<TWSTO|
					 0<<TWWC |
					 1<<TWEN |
					 1<<TWIE );  			// Go!
			break;
			}
 
		case TW_MT_SLA_ACK:					// Был послан SLA+W получили ACK
			{		TWCR = (  1<<TWINT|
						  0<<TWEA |
						  1<<TWSTA|
						  0<<TWSTO|
						  0<<TWWC |
						  1<<TWEN |
						  1<<TWIE );		// Go! 
 			
			break;
			}
			
		
		
		case TW_MR_SLA_ACK:				// Послали SLA+R получили АСК.
			{
			TWCR = ( 1<<TWINT|
					 1<<TWEA |
					 0<<TWSTA|
					 0<<TWSTO|
					 0<<TWWC |
					 1<<TWEN |
					 1<<TWIE ); 	// примем байт и скажем потом ACK
			break;
			}												
 		

case TW_MR_DATA_ACK	:					// Приняли байт.
			{ 
			buffer[buffer_index] = TWDR;				// Забрали его из буфера
			buffer_index++;
 
			if (buffer_index <= 3)			// Если остался еще один байт из тех, что мы хотели считать
				{
				TWCR = 	0<<TWSTA|
						0<<TWSTO|
						1<<TWINT|
						1<<TWEA|
						1<<TWEN|
						1<<TWIE;		
				}
			else
				{
				TWCR = 	0<<TWSTA|
						1<<TWSTO|
						1<<TWINT|
						1<<TWEA|
						1<<TWEN|
						1<<TWIE;	//  следующий байт, а в ответ скажем АСК
				}
			break;
			}
 
		
	}
int
main(void)
{
init_io();
init_usart();
init_twi(); 
sei();

  while(1){

	
  }
  return 0;
}