ATmega8 UART
- Сообщения: 3
- Зарегистрирован: Чт май 29, 2014 07:29:45
Здравствуйте. Нужна помощь. пытаюсь соединить пк и мегу8 по uart с терминала посылаются команды 0,1,2 для вкл. откл нагрузки и опрос датчиков температуры, вроде все работает но с одним условием, должен быть подключен ISP программатор stk-200 как только вытаскиваю шлейф то uart переходит в режим зеркала, c терминала отправляю 1 приходит 1 и ничего больше. Подключаю обратно шлейф начинает нормально работать, на команду 1 включает светодиод и присылает обратно в терминал текстовое сообщение о состоянии. Уже весь мозг сломал. кварц внутренний 8MHz, скорость передачи 9600. переходник USB-UART на FT232RL.
- Реклама
- Сообщения: 3
- Зарегистрирован: Чт май 29, 2014 07:29:45
код в CVAVR
#include <mega8.h>
#include <stdio.h>
#include <string.h>
#asm
.equ __lcd_port=0x18;
#endasm
#include <lcd.h>
#asm
.equ __w1_port=0x18;
.equ __w1_bit=3;
#endasm
#include <1wire.h>;
#include <ds18b20.h>
int i;
int lng=0;
char mystr[]="test test test\r\n";
char mystr1[]="Light\r\n";
char mystr2[]="Dark\r\n";
char rc;
float temper;
char textBuf[17];
char inputText[];
int itn=0;
char com2[];
unsigned char *ttt;
void writeUART(char text[])
{
//вывод информации через UART
lng=strlen(text);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=text;
}
}
void initTemper()
{
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);
}
void readTemper()
{
temper=ds18b20_temperature(0);
if(temper > 10)
{
PORTB.7=1;
}
sprintf(textBuf,"t=%.1fC\r\n",temper);
writeUART(textBuf);
}
void lampOFF()
{
lng=strlen(mystr2);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr2;
}
}
void lampON()
{
lng=strlen(mystr1);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr1;
}
}
void initUART()
{
UCSRB|=(1<<3)|(1<<4);
UBRRH=0x00;
UBRRL=0x33;
}
void print_lcds(char text[])
{
lng=strlen(text);
for(i=0; i<lng; i++)
{
lcd_gotoxy(i,1);
lcd_putchar(text);
}
}
//-----------------------------------------------------------
void main(void)
{
lcd_init(16);
lcd_putsf("hello");
initUART();
initTemper();
lng=strlen(mystr);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr;
}
while(1)
{
if((UCSRA & (1<<7)))
{
rc=UDR;
if(itn<2){
com2[itn]=rc;
itn++;
}
}
switch(rc)
{
case '3': rc=0x00; break;
case '2':readTemper(); rc=0x00; break;
case '1':lampON(); rc=0x00; break;
case '0':lampOFF(); rc=0x00; itn=0; break;
}
}
}
#include <mega8.h>
#include <stdio.h>
#include <string.h>
#asm
.equ __lcd_port=0x18;
#endasm
#include <lcd.h>
#asm
.equ __w1_port=0x18;
.equ __w1_bit=3;
#endasm
#include <1wire.h>;
#include <ds18b20.h>
int i;
int lng=0;
char mystr[]="test test test\r\n";
char mystr1[]="Light\r\n";
char mystr2[]="Dark\r\n";
char rc;
float temper;
char textBuf[17];
char inputText[];
int itn=0;
char com2[];
unsigned char *ttt;
void writeUART(char text[])
{
//вывод информации через UART
lng=strlen(text);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=text;
}
}
void initTemper()
{
w1_init();
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);
}
void readTemper()
{
temper=ds18b20_temperature(0);
if(temper > 10)
{
PORTB.7=1;
}
sprintf(textBuf,"t=%.1fC\r\n",temper);
writeUART(textBuf);
}
void lampOFF()
{
lng=strlen(mystr2);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr2;
}
}
void lampON()
{
lng=strlen(mystr1);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr1;
}
}
void initUART()
{
UCSRB|=(1<<3)|(1<<4);
UBRRH=0x00;
UBRRL=0x33;
}
void print_lcds(char text[])
{
lng=strlen(text);
for(i=0; i<lng; i++)
{
lcd_gotoxy(i,1);
lcd_putchar(text);
}
}
//-----------------------------------------------------------
void main(void)
{
lcd_init(16);
lcd_putsf("hello");
initUART();
initTemper();
lng=strlen(mystr);
for(i=0; i<lng; i++)
{
while(!(UCSRA & (1<<5)))
{ }
UDR=mystr;
}
while(1)
{
if((UCSRA & (1<<7)))
{
rc=UDR;
if(itn<2){
com2[itn]=rc;
itn++;
}
}
switch(rc)
{
case '3': rc=0x00; break;
case '2':readTemper(); rc=0x00; break;
case '1':lampON(); rc=0x00; break;
case '0':lampOFF(); rc=0x00; itn=0; break;
}
}
}
Я на Си не пишу, поэтому с ходу по программе не подскажу, а разбираться мне некогда. Но коли все якобы работает с подключенным STK, то причина, возможно, в схемотехнике.
Это вся схема, что-ли?
Блокировочные конденсаторы по питанию есть? AVCC почему не запитан? RESET почему к питанию не подтянут? Далее, Ваш "переходник USB-UART" понимает TTL-овские уровни сигнала?
Дайте нормальную схему, а не ублюдочную протеусовскую.
Это вся схема, что-ли?
Блокировочные конденсаторы по питанию есть? AVCC почему не запитан? RESET почему к питанию не подтянут? Далее, Ваш "переходник USB-UART" понимает TTL-овские уровни сигнала?
Дайте нормальную схему, а не ублюдочную протеусовскую.
Вообще странное поведение, конечно можно было бы подумать на не подтянутый RESET, но при сбросе ноги были бы в HI-Z, а это равносильно разрыву и с режимом "эха" никак не стыкуется. Ждем фото реального устройства...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- Реклама
Вот Протеусята возмутятсяAlkul писал(а):Дайте нормальную схему, а не ублюдочную протеусовскую.
По-моему, USB-UART по определению заточен на TTL-овские уровни. А вот насчет RESET -- категорически за . При этом прогнозировать как будет себя вести дивайс с болтающимся ресетом - неблагодарное занятие.RESET почему к питанию не подтянут? Далее, Ваш "переходник USB-UART" понимает TTL-овские уровни сигнала?
- Сообщения: 3
- Зарегистрирован: Чт май 29, 2014 07:29:45
Всем большое спасибо за советы, оказалось все очень банально. Забыл замли соединить мк и конвертора. 
Но RESET все же подтяните к питанию.Aria51 писал(а):Всем большое спасибо за советы, оказалось все очень банально.


