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