|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,078
Репутация: 17
![]() |
Короче надоели все ампервольтметры, всех видов , На ЛСД, на семисегментной индикации, термометры, таймеры, тупая логика ! Решил изучить передачу данных между МК и ПК, ну или все варианты между всеми вариантами . И решил начать с программного UART для Attiny 26, между оной и гипертерминалом . В общем есть USB-UART две штуки , одна на ftdi232 и есть какая то дешёвая версия YP-01.... Запилил прогу по алгоритму на с++ по ссылке в следующем посте . Она стабильно выдаёт какие то коды, которые не соответствуют пересылаемым с ПК.
|
||
|
Оценка
|
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,078
Репутация: 17
![]() |
|
||
|
Оценка
|
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,078
Репутация: 17
![]() |
там правда на ассемблере .
Но вот на с++ такой код (это тестовая прога не судите строго) Код:
/*******************************************************
прога написана в code vision AVR
фьюзы биты внутренний генератор на 4 Мгц
B6-'это вывод-9 МК который INT0
Chip type : ATtiny26
AVR Core Clock frequency: 4,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*******************************************************/
#include <tiny26.h>
#include <alcd.h>
#include <delay.h>
unsigned char i,j, time,cod;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
i=1; //флаг внешнего прерывания (старт приёма байта)
}
/*interrupt [TIM0_OVF] void timer0_ovf_isr(void) // прерывание по таймеру пока не используем
{
}
*/
void print (void) // вывод принятого кода и символа через тире на LCD
{
lcd_clear();
lcd_putsf("-");
lcd_putchar((cod/100)+48); //старший разряд
lcd_putchar((cod%100)/10+48); //средний
lcd_putchar((cod%10)+48); //младший
lcd_putsf("-");
lcd_putchar (cod);
delay_ms(100); //задержка для пропуска стопового бита
}
void main(void)
{
// Port A initialization // тут стандартная настройка портов
// Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=P Bit5=T Bit4=T Bit3=T Bit2=P Bit1=P Bit0=P
PORTB=(0<<PORTB7) | (1<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
TCCR0=(0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00; // отключил его за ненадобностью после визарда
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: при переходе в ноль
// Interrupt on any change on pins PA3, PA6, PA7 and PB4-7: Off
// Interrupt on any change on pins PB0-3: Off
GIMSK=(1<<INT0) | (0<<PCIE1) | (0<<PCIE0);
MCUCR=(0<<ISC01) | (0<<ISC00);
GIFR=(1<<INTF0) | (0<<PCIF);
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 4
// RD - PORTB Bit 7
// EN - PORTA Bit 5
// D4 - PORTA Bit 0
// D5 - PORTA Bit 1
// D6 - PORTA Bit 2
// D7 - PORTA Bit 3
// Characters/line: 16
lcd_init(16);
#asm("sei")
while (1)
{
if(i==1) // стартовый бит от ПК был то:
{
GIMSK=(0<<INT0); // запретить внешнее прерывание на время приёма
i=0; // сбросить флаг
delay_us(220+55); //задержка длинна бита + 1/4
for( j=0;j<8;j++) // 8 бит-8 раз
{
if (PINB.6==0) cod|= (1 << 7); //считываем состояние приёмного порта устанавливаем 7й бит
//приёмной переменной если на порте 0 то бит в единицу
cod=cod>>1; //сдвигаем содержимое приёмной переменной в право
delay_us(220); //пауза равная длинне приёмного бита (4800 бод 1000000/4800=208,33) ставим слегка больше
}
print (); //вывод на ЛСД кода и символа
}
GIMSK=(1<<INT0); // разрешение на внешнее прерывание для приёма след. байта
cod=0; // обнуление раннее принятого значения
}
}
|
||
|
Оценка
|
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,078
Репутация: 17
![]() |
Там вроде как по его алгоритму то всё должно быть правильно , я про старты , стопы и направления ...Вот есть небольшое недопонимание под каой приём данных он имел ввиду ... у него какая то прога которая у меня не заработала на компе как надо . Может какой то свой теминал .... вот я то и спросил .
|
||
|
Оценка
|
|
Гуру
Регистрация: 28.06.2012
Сообщений: 5,166
Репутация: 1267
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Так вот это и плохо, что вы пользуетесь неизвестным терминалом. Вообще не используйте терминал автора, используйте стандартный ГиперТерминал или TeraTerm. В конце концов, даже в CodeVision есть свой терминал ...
|
||
|
Оценка
|
| Обратная связь РадиоЛоцман Вверх |