Страница 1 из 1

Странный глюк в работе програмы на амеги16

Добавлено: Чт июн 21, 2012 08:47:30
CheerfulCalf
Всем здрасте. Срочно нужна помощь.
Собрана по схема как на картинке
https://docs.google.com/a/lauresta.com/ ... dit?pli=1#
Программа (заранее извиняюсь за простыню, но выкладываю полностью так как не знаю в чем причина глюка) в протеусе работает так как надо.
Сам же МК ровно каждые 1,5 сек постоянно в цикле посылает в КОМ порт "HTLLO" (почему - загадка)
Плюс, если я подключаю DS18B20 (как на картинке) - в порт либо вообще ничего не идёт, либо сыпется всякий мусор в виде иероглифов. Пробовал разные бауд_рейты, но порт так и не заработал с термометром.
Простыня полностью тут http://paste.org/50795:

Код: Выделить всё

#define F_CPU 8000000UL
#define USART_BAUDRATE 600   
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

#define THERM_PORT PORTA
#define THERM_DDR DDRA
#define THERM_PIN PINA
#define THERM_DQ PA7
volatile int visual_interval = 5;
#define uchar unsigned char
#define uint unsigned int
#define set_bit(x,PORT) (PORT) |= (1<<x)
#define clear_bit(x,PORT) (PORT) &= ~(1<<x)
#define pin(x,PIN) (PIN) & (1<<x)
#define THERM_INPUT_MODE() THERM_DDR &= ~(1<<THERM_DQ)
#define THERM_OUTPUT_MODE() THERM_DDR |= (1<<THERM_DQ)
#define THERM_LOW() THERM_PORT &= ~(1<<THERM_DQ)
#define THERM_HIGH() THERM_PORT |= (1<<THERM_DQ)
#define THERM_DECIMAL_STEPS_12BIT 625
#define HEATERON set_bit(6, PORTD);
#define HEATEROFF clear_bit(6, PORTD);
#define COOLERON set_bit(7, PORTD);
#define COOLEROFF clear_bit(7, PORTD);
#define _new_line "\r\n"
#define THERM_CMD_CONVERTTEMP 0x44
#define THERM_CMD_RSCRATCHPAD 0xbe
#define THERM_CMD_WSCRATCHPAD 0x4e
#define THERM_CMD_CPYSCRATCHPAD 0x48
#define THERM_CMD_RECEEPROM 0xb8
#define THERM_CMD_RPWRSUPPLY 0xb4
#define THERM_CMD_SEARCHROM 0xf0
#define THERM_CMD_READROM 0x33
#define THERM_CMD_MATCHROM 0x55
#define THERM_CMD_SKIPROM 0xcc
#define THERM_CMD_ALARMSEARCH 0xec
uchar turn1[] = {0x01, 0x02, 0x04, 0x08};
uchar turn2[] = {0x10, 0x20, 0x40, 0x80};
uchar turn3[] = {0x04, 0x08, 0x10, 0x20};
volatile int V1i;
volatile int V2i;
volatile int V3i;
int counter1;
int counter2;
int counter3;
volatile int Tcur = 0; //Current temerature
volatile int Tdes = 0; //Desired temperature
char mode;
volatile int RC=0;
volatile int i=0;
volatile char tmp[100];
int dimmtime;

void IO_init(void);
void TIMER_init(void);
void USART_Init(void);
void DS18B20_init(void);
void DS18B20_write_bit(uint8_t);
uint8_t DS18B20_read_bit(void);
uint8_t DS18B20_read_byte(void);
void DS18B20_write_byte(uint8_t);
void DS18B20_read_temperature(char*);
void USART_SendByte(uint8_t);
void USART_PutString(char*);
void extract(char*, char*, char*, int, int);
void main(void);

void IO_init(void)
{
	// Portas "C" veikia 
	//DDRC = 0xFF;
	//PORTC = 0x00;
	//DDRA = 0xFF;
	////PORTA = 0x00;
	//DDRB = 0xFF;
	//PORTB = 0x00;
	//DDRD = 0xFF;
	//PORTD = 0x00;
}

void TIMER_init(void)
{
	 TCCR0 |= (1<<CS01) | (1<<CS00);
	 TIMSK|=(1<<TOIE0);
	 TCNT0=0;
	 sei();
}
 
void USART_Init(void)
{
	UCSRB |= (1 << RXEN) | (1 << TXEN);
	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
	UBRRH = (BAUD_PRESCALE >> 8);
	UBRRL = BAUD_PRESCALE;
	UCSRB |= (1 << RXC);
}

void DS18B20_init(void)
{
	uint8_t i;
	
	THERM_LOW();
	THERM_OUTPUT_MODE();
	_delay_us(480);
	
	THERM_INPUT_MODE();
	_delay_us(60);//50	
	
	i = (THERM_PIN & (1 << THERM_DQ));
	_delay_us(420);
	
	return i;
 }
 
void DS18B20_write_bit(uint8_t bit)
{
	THERM_LOW();
	THERM_OUTPUT_MODE();
	_delay_us(1);
	
	if (bit) THERM_INPUT_MODE();
	
	_delay_us(60);
	THERM_INPUT_MODE();
}
 
uint8_t DS18B20_read_bit(void)
{
	uint8_t bit = 0;
	
	THERM_LOW();
	THERM_OUTPUT_MODE();
	_delay_us(1);
	
	THERM_INPUT_MODE();
	_delay_us(14);
	
	if (THERM_PIN & (1 << THERM_DQ)) bit=1;
	
	_delay_us(45);
	return bit;
}

uint8_t DS18B20_read_byte(void)
{
	uint8_t i=8, n=0;

	while(i--)
	{
		n >>= 1;
		n |= (DS18B20_read_bit() << 7);
	}
	
	return n;
}

void DS18B20_write_byte(uint8_t byte)
{	
	uint8_t i=8;
	
	while(i--)
	{
		DS18B20_write_bit(byte & 1);
		byte >>= 1;
	}		
}

void DS18B20_read_temperature(char *buffer)
{
	uint8_t temperature[2];
	int8_t digit;	
	uint16_t decimal;
	
	DS18B20_init();
	DS18B20_write_byte(THERM_CMD_SKIPROM);
	DS18B20_write_byte(THERM_CMD_CONVERTTEMP);

	while(!DS18B20_read_bit());
	
	DS18B20_init();
	DS18B20_write_byte(THERM_CMD_SKIPROM);
	DS18B20_write_byte(THERM_CMD_RSCRATCHPAD);
	
	temperature[0] = DS18B20_read_byte();
	temperature[1] = DS18B20_read_byte();
	DS18B20_init();
	
	digit = temperature[0] >> 4;
	digit |= (temperature[1] & 0x7) << 4;
	
	decimal = temperature[0] & 0xf;
	decimal *= THERM_DECIMAL_STEPS_12BIT;
	
	sprintf(buffer, "%d", digit);
}

void USART_SendByte(uint8_t u8Data)
{	
	while((UCSRA &(1<<UDRE)) == 0);
	UDR = u8Data;
}

void USART_PutString(char* StringPtr)
{
	while(*StringPtr != 0x00)
	{
		USART_SendByte(*StringPtr);		
		StringPtr++;
	}
}

void extract(char *s, char *t, char *d, int pos, int len)
{
	s = s + (pos - 1);
	
	t = s + len;
	
	while(s != t)
	{
		*d = *s;
		s++;
		d++;
	}
	
	*d = '\0';
}

void main(void)
{
	V1i = 0;
	V2i = 0;
	V3i = 0;
	
	USART_Init();
	//TIMER_init();
	//IO_init();
	
	USART_PutString("HELLO");
	_delay_ms(1500);
		
	char buffer [33];
	char t[50];
	char d[50];
	
	sei();
	
	while(1)
	{	
		if(RC==1) 
		{ 
			RC=0; 
			
			if (strcmp(tmp, "[KAB]") == 0)
			{
				USART_PutString("[R=HRIU]");
			}
			
			if (strncmp(tmp, "[T=", 3) == 0)
			{								
				extract(tmp, t, d, 4, strlen(tmp)-4);
				
				Tdes = atoi(d);
			}
			
			i = 0;
		} 
		
		DS18B20_read_temperature(buffer);
				
		Tcur = atoi(buffer);
		
		USART_PutString("[D=");
		USART_PutString(itoa(dimmtime,buffer,10));
		USART_PutString("]");
		
		USART_PutString("[T=");
		USART_PutString(itoa(Tcur,buffer,10));
		USART_PutString("]");
		
		USART_PutString(mode);
		
		_delay_ms(1000);
	}		
		
}

ISR(USART_RXC_vect) 
{	
	tmp[i]=UDR; 
		
	if(tmp[i++]=='\r') 
	{ 		
		RC=1; 
		tmp[i-1]=0; 
	} 
} 

Re: Странный глюк в работе програмы на амеги16

Добавлено: Сб июн 23, 2012 23:54:38
minakan
У меня вылезла подобная ерунда, когда скачал winavr из последних - WinAVR-20100110-install.exe . Какойто мусор в терминале, связанный именно с неправильно работающим уартом. Откат винавра решил вопрос. Скомпилил ваш исходник. hex в приложении. Может попустит.