Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ВОПРОС
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
male
День добрый вот решил попробовать поработать с avr передача информации по rs-232 ( adm323 микросхема)
написал простую программу чтоб на каждое N нажатие кнопки по rs был сигнал
вод код проги
CODE
#include <mega8.h>
#include <delay.h>
#include <io.h>
#include <stdio.h>

void main()
{
PORTB=0x00;
DDRB=0x1F;
PORTC=0x03;
DDRC=0x01;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRA=0x00; //
UCSRB=0x08; //
UCSRC=0x86; //инициализация передатчика 8 1 нет
UBRRH=0x00; // асинхронный 192000
UBRRL=0x19; //
ACSR=0x80;
SFIOR=0x00;

while (1)

{
int c;
int l;
c=0;
l=7;


m1: // передача данных
PORTC.0=0;

delay_ms(500);
printf("нажатие клавиши ");
c=-1;
PORTC.0=1; // гасим индикатор
PORTB=c; // ОТЛАДКА
m2: // сканируем первый импульс

if (PINC.1==1)
{delay_us(10);
if (PINC.1==1)
{c=c+1;
PORTB=c; //ОТЛАДКА
goto m3;
}
else
{goto m2;
};

}
else
{goto m2;
};

m3:
if (c==l)
{goto m1;
}
else
{goto m4;
};

m4:
if (PINC.1==0)
{delay_us(10);
if (PINC.1==0)
{goto m2;
}
else
{goto m4;
};

}
else
{goto m4;
};


};
}



работает счет нажатия клавиши и индикаторы на порт B0-4
но передача не идет по rs (смотрел осциллографом)

подскажите что я не так делаю ?
mempfis_
Извините конечно, но у вас не программа а бред полный....
Особенно переходы по goto.

Хотите потренероваться в передаче данных по uart?
Так откройте документацию на мегу, найдите раздел посвященный uart, оформите функции инициализации и передачи байта - в доке на м8 приведён 100% работоспособный код!!!.
В основном цикле программы вставте функцию передачи символа и смотрите хоть осцилографом хоть в терминале что у вас там творится.

Кроме того тема uarta довольно часто подымалась на форуме - можно найти много тем с готовыми кодами.
GDI
А в УАРТ вы принтэфом посылаете? А с чего вы взяли что стандартный принтэф так будет работать, да еще и в основном цикле?
Смотрите даташит, как вам выше советовали.
mdmitry
Для ускорения размышлений возьмите avrlib. Посмотрите код (IMHO сильно избыточный и универсальный) модуля для USART и переделайте для себя.
Пересмотрите критически свой код программы на С.
male
ну вот сразу накинулось )) в данном направлени это у меня первый проект
понятно сто это тока сырец программы все потом будет переведено на ассемблер
а функцию взял из описание программы CodeVisionAVR V2.03.9
mempfis_
Цитата(male @ Oct 29 2009, 10:17) *
ну вот сразу накинулось )) в данном направлени это у меня первый проект
понятно сто это тока сырец программы все потом будет переведено на ассемблер


Никто не накинулся - просто оформление никакое и сама программа абсолютно непонятная.

Оформите программу как приведено ниже. Откройте документацию, дополните функциями инициализации и отправки символа.
Скачайте терминал (например v1.9b bray) и смотрите на компе что там получаете из вашего uarta.

Код
void uart_init(unsigned long int baud)
{
     //тут код инициализации из документации на м8
}

void send(unsigned char symbol)
{
     //тут код отправки символа из документации на м8
}

void main(void)
{
    uart_init(115200);
    
     for(;;)
     {
           uart_send('A');
           delay_ms(500);
     }
}


И какой смысл потом переводить на ассемблер если подобная программа на С будет довольно неплохо оптимизирована компилятором.
V_G
Программу не просматривал, но антидребезг кнопки сделали? А то каша по компорту пойдет!
male
да антидребезг есть и он работает
male
всем спасибо первая версия работает
проблемма была в винде ..
male
день добрый сваял схемку на atmega8 через max232 подключик к com порту ..
начал передовать данные ... вреде по терминальной програмке все идет красиво ...
подключаю к устройству на которое надо передовать данные .. не работает ..
Вопрос можно ли как то вклиниться в линию rs 232 между avr и устройством и посмотреть
что на самом деле твориться между ними ??
Duhas
ну берете еще один макс и и на его RX подаете сигнал с 1 или другого провода мк... хотя по идее иона прям портом смотреть после макса.. который в устройстве... главное только входом смотреть и не пытаться выход туда же прилепить...
male
вы предлогаете праспаралелить выход с мк на 2 max ( у него на самом деле 2 канала )
и послать один канал на устройство а другой на комп
я правильно понял ??

или в линию связи включить max и после него на вход компа ...?
stells
Цитата(male @ Nov 13 2009, 19:16) *
можно ли как то вклиниться в линию rs 232 между avr и устройством и посмотреть
что на самом деле твориться между ними ??

можно... осциллографом
male
Цитата(stells @ Nov 13 2009, 21:45) *
можно... осциллографом

нету осциллографа с памятью под рукой ..
stells
Цитата(male @ Nov 13 2009, 19:54) *
нету осциллографа с памятью под рукой ..

зачем с памятью? обычным... зациклить обмен одним байтом и посмотреть
birden
Цитата(male @ Nov 13 2009, 22:16) *
подключаю к устройству на которое надо передовать данные .. не работает ..

Если терминал на ПК видит, а другое устройство нет - то м.б. дело в этом устройстве?
Еще, как вариант, проверьте ноги RX и TX (их часто путают).
Вообще, Вам правильно советуют - посмотрите осциллографом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.