Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
Короче надоели все ампервольтметры, всех видов , На ЛСД, на семисегментной индикации, термометры, таймеры, тупая логика ! Решил изучить передачу данных между МК и ПК, ну или все варианты между всеми вариантами . И решил начать с программного UART для Attiny 26, между оной и гипертерминалом . В общем есть USB-UART две штуки , одна на ftdi232 и есть какая то дешёвая версия YP-01.... Запилил прогу по алгоритму на с++ по ссылке в следующем посте . Она стабильно выдаёт какие то коды, которые не соответствуют пересылаемым с ПК.
|
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
|
||
Оценка
|
Новичок
Регистрация: 17.03.2018
Адрес: Курган РОССИЯ
Сообщений: 1,079
Репутация: 16
|
там правда на ассемблере .
Но вот на с++ такой код (это тестовая прога не судите строго) Код:
/******************************************************* прога написана в 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,079
Репутация: 16
|
Там вроде как по его алгоритму то всё должно быть правильно , я про старты , стопы и направления ...Вот есть небольшое недопонимание под каой приём данных он имел ввиду ... у него какая то прога которая у меня не заработала на компе как надо . Может какой то свой теминал .... вот я то и спросил .
|
||
Оценка
|
Гуру
Регистрация: 28.06.2012
Сообщений: 4,868
Репутация: 1170
|
Так вот это и плохо, что вы пользуетесь неизвестным терминалом. Вообще не используйте терминал автора, используйте стандартный ГиперТерминал или TeraTerm. В конце концов, даже в CodeVision есть свой терминал ...
|
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |