Форум программистов, компьютерный форум, киберфорум
Измерительная техника
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
1

OpenSource аналог АЛС КОП 814 на микроконтроллере

30.05.2019, 23:37. Просмотров 2674. Ответов 45
Метки нет (Все метки)

У кого есть схема и прошивка OpenSource DIY-аналога анализатора логических состояний КОП (GPIB) 814 на микроконтроллере PIC18F4550 + буферные элементы с открытым коллектором стандарта КОП (GPIB )? Поместится ли программа в PIC16F877A или ATMEGA16A...ATMEGA48A (DIP)? Внедрить анлгоязычное обозначение , как в GPIB . (For education only ).
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
Изображения
 
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2019, 23:37
Ответы с готовыми решениями:

Эмулятор прибора для проверки КОП 814 в Labview
Как на Labview (>=8.5) написать эмулятор прибора 814 для работы с GPIB (NI488.1 / NI488.2/ IEC625/...

В кассовом аппарате есть восемь 25-копеечных монет, 10 - стоимостью по 50 коп. и 12 - по 5 коп
В кассовом аппарате есть восемь 25-копеечных монет, 10 - стоимостью по 50 коп. и 12 - по 5 коп....

В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп.
В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп. Составить программу, ...

Товар стоит "a" руб. "b" коп. За него заплатили "c" руб. "d" коп. Сколько сдачи требуется получить?
Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить?...

45
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
31.05.2019, 08:56  [ТС] 21
http://kepstr.eltech.ru/tor/pt... Interf.pdf

Добавлено через 18 минут
Уточнить формулу и функции переключателей и светодиодов компар. и четн., особенность работы с битом ЛД7 (для контроля четности ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
31.05.2019, 09:22  [ТС] 22
Из книги Кузнецова В.А. ,1987 г про четн. и компар. :
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  

OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  

Вложения
Тип файла: zip p0498.zip (709.7 Кб, 0 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
31.05.2019, 09:36  [ТС] 23
На данные ЛД0-ЛД7 (ЛД7 для контроля четности ) и УП,КП,ЗО потребуется область ОЗУ 11бит*n(n=32,64,128 , выбрать для нашего случая) . Можно использовать еще один байт (до 128 раз по 2 байта : 1 байт данных , 1 байт для УП,КП, ЗО ). DAV, NRFD,NDAC ,IFC, REN индицировать светодиодами с помощью токовых ключей , подключенных к шине (отрицательная логика низкому уровню соответствует лог 1, включенный светодиод, по умолчанию линии шины подключены к 5В через подтягивающие резисторы (по правилам для шины КОП) ). Предусмотреть индикацию состояния УП (ATN),КП(EOI), ЗО (SRQ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
01.06.2019, 14:18  [ТС] 24
Пример схемы (недостаточно эффективный, из Кузнецова, Строителева , 1993 г.) модели акцептора для абстрактного мышления на тему функционирования акцепторов и и контроллера на шине GPIB(КОП).Названия минтермов можно перевести на англоязычные обозначения-прототипы .
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  

OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  

OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  

OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
01.06.2019, 17:43  [ТС] 25
В шинном формирователе можно использовать SN75160, SN75161,SN75162 (аналогично рекомендациям из даташита на TMS9914A) , SN74ALS245.

Добавлено через 29 минут
http://e.lib.vlsu.ru/bitstream... %D0%AF.pdf


Поздняков, А. Д. Приборно-модульные системы контроля, испытаний и мониторинга радиоаппаратуры: учеб. пособие / А. Д. Поздняков; Владим. гос. унт. – Владимир: Ред.-издат. комплекс ВлГУ, 2005. – 118 с.

Альтернативная "декоммунизированная" информация про некоторые функции (в том числе З1, СИ,СП, информация из американских источников про формирование временных интервалов для некоторых микросхем может отличаться от некоторого упрощенного представления ). У нас NI488.1 -образная схема. Можно и дополнительные NI488.2 -возможности предусмотреть .

Добавлено через 1 час 19 минут
http://www3.fi.mdp.edu.ar/medi... 488_78.pdf

ANSI/IEEE Standard 488.1-1987. IEEE Standard Digital Interface for
Programmable Instrumentation.

Добавлено через 8 минут
https://www.researchgate.net/p... bus_tester

Добавлено через 31 секунду
http://www.ni.com/pdf/manuals/320418

Добавлено через 26 минут
Некоторые способы и прототипы схем включения МК:

http://www.interfacebus.com/De... _GPIB.html

https://www.mikrocontroller.net/topic/256475

https://www.mikrocontroller.ne... nittstelle


http://scasagrande.blogspot.co... -sale.html

Добавлено через 48 секунд
https://linux-gpib.sourceforge... tocol.html

Добавлено через 8 минут
https://github.com/Galvant
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
03.06.2019, 18:13  [ТС] 26
Для контроля четности может использоваться SN74180 или ее программный аналог

http://kazus.ru/datasheets/pdf... 74180.html
https://ru.wikipedia.org/wiki/... BB%D1%8E_2

http://hyperphysics.phy-astr.g... c/xor.html

http://hyperphysics.phy-astr.g... c/xor.html
https://eax.me/ic74xx/
http://phg.su/basis2/X67.HTM
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
03.06.2019, 21:03  [ТС] 27
74180_ttable.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include  <stdio.h>
#include  <stdlib.h>
#include <iostream>
#include <math.h>
 
using namespace std;
   
typedef unsigned char uint8_t;
 
int main ()
{
 
char  I0, I1, I2, I3, I4, I5, I6, I7 ,  PO__IN, PE__IN;
bool D0,D1,D2,D3,D4,D5,D6,D7 , PO_IN,PE_IN;
  
 // cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \n"; 
 
for(int jpe=0 ; jpe<2; jpe++){
cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \n";     
//see   jpe=1  
for(int jpo=0 ; jpo<2; jpo++){  
cout<<"\n";
 
 
 
 
for(int j7=0 ; j7<2; j7++){
for(int j6=0 ; j6<2; j6++){
for(int j5=0 ; j5<2; j5++){
for(int j4=0 ; j4<2; j4++){
for(int j3=0 ; j3<2; j3++){
for(int j2=0 ; j2<2; j2++){ 
for(int j1=0 ; j1<2; j1++){
for(int j0=0 ; j0<2; j0++){
 
 
    
if (j0==1 ) {D0=1;   I0= '1'; } else  {D0=0; I0= '0' ;} 
if (j1== 1 ) {D1=1;  I1= '1';} else  {D1=0;  I1= '0' ;}  
if (j2== 1 ) {D2=1;  I2= '1';} else  {D2=0; I2= '0'; } 
if (j3== 1 ) {D3=1;  I3= '1';} else  {D3=0; I3= '0' ;} 
if (j4==1) {D4=1;    I4= '1';} else  {D4=0; I4= '0' ;} 
if (j5==1) {D5=1;    I5= '1';} else  {D5=0; I5= '0'; } 
if (j6==1) {D6=1;    I6=  '1';} else  {D6=0; I6= '0' ;} 
if (j7==1) {D7=1;    I7= '1';} else  {D7=0; I7= '0' ;} 
if (jpo==1) {PO_IN=1;    PO__IN= '1';} else  {PO_IN=0;    PO__IN= '0'; } 
if (jpe==1) {PE_IN=1;    PE__IN= '1';} else  {PE_IN=0;    PE__IN= '0' ;} 
 
 
 
 //cout<<" I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN \n";
// cout<<" "<< I0 <<"\t "<< I1<<"\t "<< I2<< "\t "<< I3<<"\t "<<I4<<"\t "<<I5<<"\t " <<I6 <<"\t " <<I7 <<"\t "<<PO__IN<<"\t "<<PE__IN<<"\t "<<" \n";
 
 
 
 
 
uint8_t  y1= !(D0^D1);
uint8_t  y2= !(D2^D3);
uint8_t  y3=!(D4^D5);
uint8_t  y4=!(D6^D7);
 
 
 
uint8_t  Yout=!((y1^y2)^(y3^y4));
 
 
uint8_t  PE_OUT=(!(Yout&PO_IN))&(!((!Yout)&PE_IN));
uint8_t  PO_OUT=(!(Yout&PE_IN))&(!((!Yout)&PO_IN));
 
 char  PE,  PO;
  
if (PE_OUT) {PE='1';} else  {PE='0';} 
if (PO_OUT) {PO='1';} else  {PO='0';} 
  
 // cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \n";
  cout<<" "<< I0 <<"\t "<< I1<<"\t "<< I2<< "\t "<< I3<<"\t "<<I4<<"\t "<<I5<<"\t " <<I6 <<"\t " <<I7 <<"\t "<<PO_IN<<"\t "<<PE_IN<<"     || \t "<<PO << " \t " << PE <<  " \n";
 
  }}}}}}}}}}
  
cin.get();
 
return 0;
}
Добавлено через 1 минуту
См. PE_IN=1,PO_IN=1; (Even check , PE_OUT)

Добавлено через 23 минуты
Если с исключающим или , то для программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include  <stdio.h>
#include  <stdlib.h>
#include <iostream>
#include <math.h>
 
using namespace std;
   
typedef unsigned char uint8_t;
 
int main ()
{
 
char  I0, I1, I2, I3, I4, I5, I6, I7 ,  PO__IN, PE__IN;
bool D0,D1,D2,D3,D4,D5,D6,D7 , PO_IN,PE_IN;
  
 // cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \n"; 
 
for(int jpe=0 ; jpe<2; jpe++){
cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \n";     
//see   jpe=1  
for(int jpo=0 ; jpo<2; jpo++){  
cout<<"\n";
 
 
 
 
for(int j7=0 ; j7<2; j7++){
for(int j6=0 ; j6<2; j6++){
for(int j5=0 ; j5<2; j5++){
for(int j4=0 ; j4<2; j4++){
for(int j3=0 ; j3<2; j3++){
for(int j2=0 ; j2<2; j2++){ 
for(int j1=0 ; j1<2; j1++){
for(int j0=0 ; j0<2; j0++){
 
 
    
if (j0==1 ) {D0=1;   I0= '1'; } else  {D0=0; I0= '0' ;} 
if (j1== 1 ) {D1=1;  I1= '1';} else  {D1=0;  I1= '0' ;}  
if (j2== 1 ) {D2=1;  I2= '1';} else  {D2=0; I2= '0'; } 
if (j3== 1 ) {D3=1;  I3= '1';} else  {D3=0; I3= '0' ;} 
if (j4==1) {D4=1;    I4= '1';} else  {D4=0; I4= '0' ;} 
if (j5==1) {D5=1;    I5= '1';} else  {D5=0; I5= '0'; } 
if (j6==1) {D6=1;    I6=  '1';} else  {D6=0; I6= '0' ;} 
if (j7==1) {D7=1;    I7= '1';} else  {D7=0; I7= '0' ;} 
if (jpo==1) {PO_IN=1;    PO__IN= '1';} else  {PO_IN=0;    PO__IN= '0'; } 
if (jpe==1) {PE_IN=1;    PE__IN= '1';} else  {PE_IN=0;    PE__IN= '0' ;} 
 
 
 
 //cout<<" I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN \n";
// cout<<" "<< I0 <<"\t "<< I1<<"\t "<< I2<< "\t "<< I3<<"\t "<<I4<<"\t "<<I5<<"\t " <<I6 <<"\t " <<I7 <<"\t "<<PO__IN<<"\t "<<PE__IN<<"\t "<<" \n";
 
 
 
//for SN74180 emulation 
 
uint8_t  y1= !(D0^D1);
uint8_t  y2= !(D2^D3);
uint8_t  y3=!(D4^D5);
uint8_t  y4=!(D6^D7);
uint8_t  Yout=!((y1^y2)^(y3^y4));
uint8_t  PE_OUT=(!(Yout&PO_IN))&(!((!Yout)&PE_IN));
uint8_t  PO_OUT=(!(Yout&PE_IN))&(!((!Yout)&PO_IN));
 
char  PE,  PO,Y,Ytmp1;
  
if (PE_OUT) {PE='1';} else  {PE='0';} 
if (PO_OUT) {PO='1';} else  {PO='0';} 
if (Yout) {Y='1';} else  {Y='0';}   
 
 
 
uint8_t  Ytmp;
 
 
//for program
Ytmp=1;  //1 for even , 0 for odd 
Ytmp^=D0;
Ytmp^=D1;
Ytmp^=D2;
Ytmp^=D3;
Ytmp^=D4;
Ytmp^=D5;
Ytmp^=D6;
Ytmp^=D7;  //for program
 
 
if (Ytmp) {Ytmp1='1';} else  {Ytmp1='0';}   //for type mismatch fix ( for cout only )
 
 // cout<<"I0 \t I1\t I2 \t I3 \t I4 \t I5 \t I6 \t I7 \t PO_IN \t PE_IN || \t PO_OUT\t PE_OUT \t Y\n";
  cout<<" "<< I0 <<"\t "<< I1<<"\t "<< I2<< "\t "<< I3<<"\t "<<I4<<"\t "<<I5<<"\t " <<I6 <<"\t " <<I7 <<"\t "<<PO_IN<<"\t "<<PE_IN<<"     || \t "<<PO << " \t " << PE << "\t"<<Y<< "\t"<<Ytmp1<< " \n";
 
  }}}}}}}}}}
  
cin.get();
 
return 0;
}
Добавлено через 1 минуту
Код
I0       I1      I2      I3      I4      I5      I6      I7      PO_IN   PE_IN ||        PO_OUT  PE_OUT  Yout  Ytmp

 0       0       0       0       0       0       0       0       0       1     ||        0       1      1       1
 1       0       0       0       0       0       0       0       0       1     ||        1       0      0       0
 0       1       0       0       0       0       0       0       0       1     ||        1       0      0       0
 1       1       0       0       0       0       0       0       0       1     ||        0       1      1       1
 0       0       1       0       0       0       0       0       0       1     ||        1       0      0       0
 1       0       1       0       0       0       0       0       0       1     ||        0       1      1       1
 0       1       1       0       0       0       0       0       0       1     ||        0       1      1       1
 1       1       1       0       0       0       0       0       0       1     ||        1       0      0       0
 0       0       0       1       0       0       0       0       0       1     ||        1       0      0       0
 1       0       0       1       0       0       0       0       0       1     ||        0       1      1       1
 0       1       0       1       0       0       0       0       0       1     ||        0       1      1       1
 1       1       0       1       0       0       0       0       0       1     ||        1       0      0       0
 0       0       1       1       0       0       0       0       0       1     ||        0       1      1       1
 1       0       1       1       0       0       0       0       0       1     ||        1       0      0       0
 0       1       1       1       0       0       0       0       0       1     ||        1       0      0       0
 1       1       1       1       0       0       0       0       0       1     ||        0       1      1       1
 0       0       0       0       1       0       0       0       0       1     ||        1       0      0       0
 1       0       0       0       1       0       0       0       0       1     ||        0       1      1       1
 0       1       0       0       1       0       0       0       0       1     ||        0       1      1       1
 1       1       0       0       1       0       0       0       0       1     ||        1       0      0       0
 0       0       1       0       1       0       0       0       0       1     ||        0       1      1       1
 1       0       1       0       1       0       0       0       0       1     ||        1       0      0       0
 0       1       1       0       1       0       0       0       0       1     ||        1       0      0       0
 1       1       1       0       1       0       0       0       0       1     ||        0       1      1       1
 0       0       0       1       1       0       0       0       0       1     ||        0       1      1       1
 1       0       0       1       1       0       0       0       0       1     ||        1       0      0       0
 0       1       0       1       1       0       0       0       0       1     ||        1       0      0       0
 1       1       0       1       1       0       0       0       0       1     ||        0       1      1       1
 0       0       1       1       1       0       0       0       0       1     ||        1       0      0       0
 1       0       1       1       1       0       0       0       0       1     ||        0       1      1       1
 0       1       1       1       1       0       0       0       0       1     ||        0       1      1       1
 1       1       1       1       1       0       0       0       0       1     ||        1       0      0       0
 0       0       0       0       0       1       0       0       0       1     ||        1       0      0       0
 1       0       0       0       0       1       0       0       0       1     ||        0       1      1       1
 0       1       0       0       0       1       0       0       0       1     ||        0       1      1       1
 1       1       0       0       0       1       0       0       0       1     ||        1       0      0       0
 0       0       1       0       0       1       0       0       0       1     ||        0       1      1       1
 1       0       1       0       0       1       0       0       0       1     ||        1       0      0       0
 0       1       1       0       0       1       0       0       0       1     ||        1       0      0       0
 1       1       1       0       0       1       0       0       0       1     ||        0       1      1       1
 0       0       0       1       0       1       0       0       0       1     ||        0       1      1       1
 1       0       0       1       0       1       0       0       0       1     ||        1       0      0       0
 0       1       0       1       0       1       0       0       0       1     ||        1       0      0       0
 1       1       0       1       0       1       0       0       0       1     ||        0       1      1       1
 0       0       1       1       0       1       0       0       0       1     ||        1       0      0       0
 1       0       1       1       0       1       0       0       0       1     ||        0       1      1       1
 0       1       1       1       0       1       0       0       0       1     ||        0       1      1       1
 1       1       1       1       0       1       0       0       0       1     ||        1       0      0       0
 0       0       0       0       1       1       0       0       0       1     ||        0       1      1       1
 1       0       0       0       1       1       0       0       0       1     ||        1       0      0       0
 0       1       0       0       1       1       0       0       0       1     ||        1       0      0       0
 1       1       0       0       1       1       0       0       0       1     ||        0       1      1       1
 0       0       1       0       1       1       0       0       0       1     ||        1       0      0       0
 1       0       1       0       1       1       0       0       0       1     ||        0       1      1       1
 0       1       1       0       1       1       0       0       0       1     ||        0       1      1       1
 1       1       1       0       1       1       0       0       0       1     ||        1       0      0       0
 0       0       0       1       1       1       0       0       0       1     ||        1       0      0       0
 1       0       0       1       1       1       0       0       0       1     ||        0       1      1       1
 0       1       0       1       1       1       0       0       0       1     ||        0       1      1       1
 1       1       0       1       1       1       0       0       0       1     ||        1       0      0       0
 0       0       1       1       1       1       0       0       0       1     ||        0       1      1       1
 1       0       1       1       1       1       0       0       0       1     ||        1       0      0       0
 0       1       1       1       1       1       0       0       0       1     ||        1       0      0       0
 1       1       1       1       1       1       0       0       0       1     ||        0       1      1       1
 0       0       0       0       0       0       1       0       0       1     ||        1       0      0       0
 1       0       0       0       0       0       1       0       0       1     ||        0       1      1       1
 0       1       0       0       0       0       1       0       0       1     ||        0       1      1       1
 1       1       0       0       0       0       1       0       0       1     ||        1       0      0       0
 0       0       1       0       0       0       1       0       0       1     ||        0       1      1       1
 1       0       1       0       0       0       1       0       0       1     ||        1       0      0       0
 0       1       1       0       0       0       1       0       0       1     ||        1       0      0       0
 1       1       1       0       0       0       1       0       0       1     ||        0       1      1       1
 0       0       0       1       0       0       1       0       0       1     ||        0       1      1       1
 1       0       0       1       0       0       1       0       0       1     ||        1       0      0       0
 0       1       0       1       0       0       1       0       0       1     ||        1       0      0       0
 1       1       0       1       0       0       1       0       0       1     ||        0       1      1       1
 0       0       1       1       0       0       1       0       0       1     ||        1       0      0       0
 1       0       1       1       0       0       1       0       0       1     ||        0       1      1       1
 0       1       1       1       0       0       1       0       0       1     ||        0       1      1       1
 1       1       1       1       0       0       1       0       0       1     ||        1       0      0       0
 0       0       0       0       1       0       1       0       0       1     ||        0       1      1       1
 1       0       0       0       1       0       1       0       0       1     ||        1       0      0       0
 0       1       0       0       1       0       1       0       0       1     ||        1       0      0       0
 1       1       0       0       1       0       1       0       0       1     ||        0       1      1       1
 0       0       1       0       1       0       1       0       0       1     ||        1       0      0       0
 1       0       1       0       1       0       1       0       0       1     ||        0       1      1       1
 0       1       1       0       1       0       1       0       0       1     ||        0       1      1       1
 1       1       1       0       1       0       1       0       0       1     ||        1       0      0       0
 0       0       0       1       1       0       1       0       0       1     ||        1       0      0       0
 1       0       0       1       1       0       1       0       0       1     ||        0       1      1       1
 0       1       0       1       1       0       1       0       0       1     ||        0       1      1       1
 1       1       0       1       1       0       1       0       0       1     ||        1       0      0       0
 0       0       1       1       1       0       1       0       0       1     ||        0       1      1       1
 1       0       1       1       1       0       1       0       0       1     ||        1       0      0       0
 0       1       1       1       1       0       1       0       0       1     ||        1       0      0       0
 1       1       1       1       1       0       1       0       0       1     ||        0       1      1       1
 0       0       0       0       0       1       1       0       0       1     ||        0       1      1       1
 1       0       0       0       0       1       1       0       0       1     ||        1       0      0       0
 0       1       0       0       0       1       1       0       0       1     ||        1       0      0       0
 1       1       0       0       0       1       1       0       0       1     ||        0       1      1       1
 0       0       1       0       0       1       1       0       0       1     ||        1       0      0       0
 1       0       1       0       0       1       1       0       0       1     ||        0       1      1       1
 0       1       1       0       0       1       1       0       0       1     ||        0       1      1       1
 1       1       1       0       0       1       1       0       0       1     ||        1       0      0       0
 0       0       0       1       0       1       1       0       0       1     ||        1       0      0       0
 1       0       0       1       0       1       1       0       0       1     ||        0       1      1       1
 0       1       0       1       0       1       1       0       0       1     ||        0       1      1       1
 1       1       0       1       0       1       1       0       0       1     ||        1       0      0       0
 0       0       1       1       0       1       1       0       0       1     ||        0       1      1       1
 1       0       1       1       0       1       1       0       0       1     ||        1       0      0       0
 0       1       1       1       0       1       1       0       0       1     ||        1       0      0       0
 1       1       1       1       0       1       1       0       0       1     ||        0       1      1       1
 0       0       0       0       1       1       1       0       0       1     ||        1       0      0       0
 1       0       0       0       1       1       1       0       0       1     ||        0       1      1       1
 0       1       0       0       1       1       1       0       0       1     ||        0       1      1       1
 1       1       0       0       1       1       1       0       0       1     ||        1       0      0       0
 0       0       1       0       1       1       1       0       0       1     ||        0       1      1       1
 1       0       1       0       1       1       1       0       0       1     ||        1       0      0       0
 0       1       1       0       1       1       1       0       0       1     ||        1       0      0       0
 1       1       1       0       1       1       1       0       0       1     ||        0       1      1       1
 0       0       0       1       1       1       1       0       0       1     ||        0       1      1       1
 1       0       0       1       1       1       1       0       0       1     ||        1       0      0       0
 0       1       0       1       1       1       1       0       0       1     ||        1       0      0       0
 1       1       0       1       1       1       1       0       0       1     ||        0       1      1       1
 0       0       1       1       1       1       1       0       0       1     ||        1       0      0       0
 1       0       1       1       1       1       1       0       0       1     ||        0       1      1       1
 0       1       1       1       1       1       1       0       0       1     ||        0       1      1       1
 1       1       1       1       1       1       1       0       0       1     ||        1       0      0       0
 0       0       0       0       0       0       0       1       0       1     ||        1       0      0       0
 1       0       0       0       0       0       0       1       0       1     ||        0       1      1       1
 0       1       0       0       0       0       0       1       0       1     ||        0       1      1       1
 1       1       0       0       0       0       0       1       0       1     ||        1       0      0       0
 0       0       1       0       0       0       0       1       0       1     ||        0       1      1       1
 1       0       1       0       0       0       0       1       0       1     ||        1       0      0       0
 0       1       1       0       0       0       0       1       0       1     ||        1       0      0       0
 1       1       1       0       0       0       0       1       0       1     ||        0       1      1       1
 0       0       0       1       0       0       0       1       0       1     ||        0       1      1       1
 1       0       0       1       0       0       0       1       0       1     ||        1       0      0       0
 0       1       0       1       0       0       0       1       0       1     ||        1       0      0       0
 1       1       0       1       0       0       0       1       0       1     ||        0       1      1       1
 0       0       1       1       0       0       0       1       0       1     ||        1       0      0       0
 1       0       1       1       0       0       0       1       0       1     ||        0       1      1       1
 0       1       1       1       0       0       0       1       0       1     ||        0       1      1       1
 1       1       1       1       0       0       0       1       0       1     ||        1       0      0       0
 0       0       0       0       1       0       0       1       0       1     ||        0       1      1       1
 1       0       0       0       1       0       0       1       0       1     ||        1       0      0       0
 0       1       0       0       1       0       0       1       0       1     ||        1       0      0       0
 1       1       0       0       1       0       0       1       0       1     ||        0       1      1       1
 0       0       1       0       1       0       0       1       0       1     ||        1       0      0       0
 1       0       1       0       1       0       0       1       0       1     ||        0       1      1       1
 0       1       1       0       1       0       0       1       0       1     ||        0       1      1       1
 1       1       1       0       1       0       0       1       0       1     ||        1       0      0       0
 0       0       0       1       1       0       0       1       0       1     ||        1       0      0       0
 1       0       0       1       1       0       0       1       0       1     ||        0       1      1       1
 0       1       0       1       1       0       0       1       0       1     ||        0       1      1       1
 1       1       0       1       1       0       0       1       0       1     ||        1       0      0       0
 ...
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
09.07.2019, 14:46  [ТС] 28
В статье М. Терентьева по КОП в Радио №1/2010 ,кажется , опечатки и неточности в кодах (первый байт 0x12С0 , -> С0 12 нужно ли 0x1AC0 , с перемещением .org 0x0012 rjmp Label_1 с 0x0a1 в оптимизированное место с меткой label0001

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  .cseg        ;данная директива означает, что дальше идет код программы
                                     .org 0x000                   ; Reset Handler
                                                            // C0 12    
                                                        //   rjmp Init      //my version
000000 c012                                               rjmp    label0001    //By M. Terentyev 
                                 
                                     .org 0x0012             ; USART Rx Complete
                                                              //C0 A1 
000012 c0a1                                     rjmp Label_1 
                                 
                                 label0001:
                                    
                                 
                                 
                                    .org 0x013  ;real begin of code segment
                                  
                                   // .org 0x01A  ;real begin of code segment
)?

Правда ли , что фьюзы перепутаны ?
Кажется , для ATMEGA48-20PU , external 8.0 - 16.0 MHz Crystall osc. , nReset on pin

Код
 extended - 0xFF,
 high  - 0xDE, 
 low    - 0xDF.
 lock 3F
?
Можно и на другой кварц переделать (например , 7.3728MHz)
Код
					  //115200 baud 8-N-1
					  //fosc =14.7456 MHz 
					 //UCSR0A 0x02
					 //UCSR0B 0x98
					 //UCSR0C 0x06
					 //UBRR0H 0x00
					 //UBRR0L 0x0F


UCSR0A:  RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0
UCSR0B:  RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80
UCSR0C: UMSEL01 UMSEL00 UPM01 UPM00 USBS0 (UCSZ01 /UDORD0) (UCSZ00 / UCPHA0) UCPOL0

BAUD=fOSC/(8*(UBRRn + 1)) for U2X0=1
BAUD=fOSC/(16*(UBRRn + 1)) for U2X0=0
UBRRn=(fOSC/(8*BAUD))– 1  for U2X0=1
UBRRn=(fOSC/(16*BAUD))– 1  for U2X0=0

 115200*(8*(15+1))=115200*128=14745600
 
UCSR0A=(1<<U2X0) ; double speed, async
UCSR0B =(1 <<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)
UCSR0C =(1 << UCSZ01) | (1 << UCSZ00);     
( USBS0=0 1stop bit, 8 data bit UCSZ2...0= 011,
  no parity UPM01...00=00 ,Asynchronous USART UMSEL01...0=00 )
UBRR=15 
UBRR0H = (unsigned char) (ubrr >> 8);
UBRR0L = (unsigned char) ubrr;
UBRR=103  U2X0=1   for 12MHz ,  fix delay subs 
UBRR=3    U2X0=0   for  7.3728MHz,  fix delay subs
, изменив подпрограммы задержки.

Можно даже на Атмега8А-16PU (PU) переделать , изменив программу инициализации USART (там другие регистры ) и некоторых регистров, поменяв параметры задержки, переделав на 7.3728MHz . Бодность там 115200 бод ()
на другую программы нет).
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
Вложения
Тип файла: zip AssemblerApplication2.zip (13.10 Мб, 2 просмотров)
Тип файла: zip disassembler.zip (45.9 Кб, 2 просмотров)
Тип файла: pdf ATMegaX8.pdf (4.63 Мб, 2 просмотров)
Тип файла: zip GPIB-UART.zip (1.96 Мб, 2 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
09.07.2019, 16:13  [ТС] 29
Обычно

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
 .cseg       
 .org 0x0000                   ; Reset Handler , далее непереместимая таблица векторов прерываний
                        rjmp Label_0 ;              
               
 .org 0x0012             ; USART Rx Complete
                   
                        rjmp Label_1 ;  там далеко в тексте, прерывание обрабатывает, у него с 0x0a1 начинается
 
.org 0x001A
    Label_0:
                  инициализация стека, портов, UART
                      
                 ...
Добавлено через 1 час 19 минут
Плохо,что в нем не буферированы REN, IFC; EOI,ATN, SRQ, NRFD,NDAC,DAV. В TQFP-исполнении моет и возможно подключить буферы. К REN, IFC можно и эмиттерные повторители приделать , с другими желательно буфер со стробом . Еще одного (двух выводов) для строба направления не хватает . Или отказаться от некоторых функций . Буфер должен быть ТТЛ/ТТЛШ (74ACTxxx ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 13:14  [ТС] 30
Вариант для схемы из статьи Терентьева на ATMEGA8A -PU, fosc =14.7456 MHz , 115200 baud 8-N-1 , буфер только на шину данных (только для теоретических исследований и абстрактного мышления ).

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
;
; mega8agpib.asm
;
; Created: 10.07.2019 11:46:08
; Author : USERPC01  
; using  modified  M.Terentjev's  algorithm  compatible codes (from Radio #1 /2010)
;
 
 
 
 
 
/*
for ATMeg8a
 
; ***** INTERRUPT VECTORS ************************************************
.equ    INT0addr    = 0x0001    ; External Interrupt Request 0
.equ    INT1addr    = 0x0002    ; External Interrupt Request 1
.equ    OC2addr = 0x0003    ; Timer/Counter2 Compare Match
.equ    OVF2addr    = 0x0004    ; Timer/Counter2 Overflow
.equ    ICP1addr    = 0x0005    ; Timer/Counter1 Capture Event
.equ    OC1Aaddr    = 0x0006    ; Timer/Counter1 Compare Match A
.equ    OC1Baddr    = 0x0007    ; Timer/Counter1 Compare Match B
.equ    OVF1addr    = 0x0008    ; Timer/Counter1 Overflow
.equ    OVF0addr    = 0x0009    ; Timer/Counter0 Overflow
.equ    SPIaddr = 0x000a    ; Serial Transfer Complete
.equ    URXCaddr    = 0x000b    ; USART, Rx Complete
.equ    UDREaddr    = 0x000c    ; USART Data Register Empty
.equ    UTXCaddr    = 0x000d    ; USART, Tx Complete
.equ    ADCCaddr    = 0x000e    ; ADC Conversion Complete
.equ    ERDYaddr    = 0x000f    ; EEPROM Ready
.equ    ACIaddr = 0x0010    ; Analog Comparator
.equ    TWIaddr = 0x0011    ; 2-wire Serial Interface
.equ    SPMRaddr    = 0x0012    ; Store Program Memory Ready
 
.equ    INT_VECTORS_SIZE    = 19    ; size in words
 
 */
 
/*
ATMEGA8A-PU
 
fuses
 
LOW=$FE           ?fix
HIGH=$D9  ( or C9 )         ?fix
LOCK=$3F  //select for no protect , default 
 
CKSEL3...1=111   // 1- 16 MHz 
CKSEL0=0  
SUT1...0=11  //65 ms +  16 ck
BODEN=1
BODLEVEL=1
 
BOOTRST=1
BOOTSZ0=0
BOOTSZ1=0
EESAVE=1
CKOPT=1 (may be 0 )
SPIEN=0 (default)
WDTON=1 (or default )
RSTDISBL=1 ( not programmed, nReset on the pin )
 
 
 
 
OSC 14.7456 MHz , no div by 8  //fix
 
PB0  D0 (  log.1  low )
PB1  D1 (  log.1  low )
PB2  D2 (  log.1  low )
PB3  D3 (  log.1  low )
PB4  D4 (  log.1  low )
PB5  D5 (  log.1  low )
PC0  D6 (  log.1  low )
PC1  D7 (  log.1  low )
 
PC2  IFC (  log.1  low )
PC3  SRQ (  log.1  low )
PC4  ATN (  log.1  low )
PC5  REN (  log.1  low )
 
PD0 RXD MCU TTL
PD1 TXD MCU TTL
PD2  EOI (  log.1  low )
PD3 LED HL1 out
PD4 RW out for SN74ALS245A control (1 A->B, 0 B->A )
PD5 NDAC (  log.1  low )
PD6 NRFD (  log.1  low )
PD7  DAV (  log.1  low )
Pin1 - nReset 
 
$0 REN=0 (set REN high )
$1 REN=1 (set REN low )
$2 ATN=0 (set REN high )
$3 ATN=1 (set REN low )
$4 IFC=1 pulse (pulse IFC  low 13.2 ms )
$5 IDY=0 ,turn off parallel poll   (EOI  in , ATN high)
$6 IDY=1 ,turn on parallel poll   (EOI  out , ATN and EOI low)
$7 Read Data bus  (transmit via RS232    DIO1-DIO8  statement  byte (status))
$8 Receive byte via GPIB HS (receive  bytte from GPIB with handshake  and send to UART or  send error 0x01 )
$9 Read control lines (send  byte with EOI,REN,ATN,SRQ,1,IDY, 0,0 statement)
#x Send ASCII -code via GPIB HS (Transmit byte x using handshake and send report to UART :0x03 success , 0x02 error)
 
 */
 
 
 
 
 
 
 
//init USART
.equ    UCSRA_value =0x02   ;  0x00      ; bit 2 =1 
.equ           UCSRB_value=0x98    ;       ; UCSRB =0x98  0b10011000
.equ           UCSRC_value=0x06    ; UCSRC =0x06  0b00000110
.equ           UBRRH_value=0x00   ; 0x00       ; UBRRH =0x00  0b00000000
.equ           UBRRL_value=0x0f     ; 0x03      ; UBRRH=0x0F   0b00001111
 
 
                      //115200 baud 8-N-1
                      //fosc =14.7456 MHz 
                     //UCSRA 0x02
                     //UCSRB 0x98
                     //UCSRC 0x06
                     //UBRRH 0x00
                     //UBRRL 0x0F
/*
 
UCSRA:  RXC TXC UDRE FE DOR UPE U2X MPCM
UCSRB:  RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
UCSRC: UMSEL1 UMSEL0 UPM1 UPM0 USBS  UCSZ1   UCSZ0  UCPOL 
 
 
#define ubrr (FOSC/(BAUDRATE<<3))-1 U2X=1
#define ubrr (FOSC/(BAUDRATE<<4))-1 U2X=0
 
BAUD=fOSC/(8*(UBRRn + 1)) for U2X0=1
BAUD=fOSC/(16*(UBRRn + 1)) for U2X0=0
UBRR=(fOSC/(8*BAUD))1  for U2X0=1
UBRR=(fOSC/(16*BAUD))1  for U2X0=0
 
 115200*(8*(15+1))=115200*128=14745600
 
UCSRA=(1<<U2X) ; double speed, async
UCSRB =(1 <<RXCIE)|(1<<RXEN)|(1<<TXEN)
UCSRC =(1 << UCSZ1) | (1 << UCSZ0);     
( USBS=0 1stop bit, 8 data bit UCSZ2...0= 011,
  no parity UPM1...0=00 ,Asynchronous USART UMSEL1...0=00 )
UBRR=15  U2X=1 , 14,745600 MHz
UBRRH = (unsigned char) (ubrr >> 8);
UBRRL = (unsigned char) ubrr;
UBRR=103  U2X=1   for 12MHz ,  fix delay subs 
UBRR=3  (0x00, 0x03 )      U2X=0   for  7.3728MHz,  fix delay subs 
 
*/
 
                     
 
 
.equ           MainProg_Start_addr = 0x0013
 
 
           .device atmega8a
           .nolist                  
 
          .include  "m8Adef.inc"    
           
          .list                
 
 
 
 
 
 
    .cseg                    ;данная директива означает, что дальше идет код программы
    .org 0x0000                   ; Reset Handler
                              
                          
                         rjmp    Label_0  
 
    .org  URXCaddr            ; USART Rx Complete
                             
               rjmp Label_1 
 
 
   
 
 
   .org MainProg_Start_addr ; real begin of code segment
 
  
 
 Label_0:
 
 
                  ; stack  initializing 
                   
 
                     ldi r16 , high(RAMEND)  ;  main program start
                     out SPH, r16                     ;  set stack pointer to top of RAM 
                     ldi r16,   low(RAMEND)  ;
                     out SPL, r16    
   
                     ser r16     
                     out DDRB, r16     ; DDRB=0b11111111    PB0-PB5   out ; PB6,PB7 osc
                  
                      ldi r16, 0x37      ;                        
                     out DDRC, r16      ;  DDRC= 0b00110111  ; PC0 out, PC1 out , PC2 out,  PC3 in , PC4 out, PC5 out ,PC6 nReset,PC7 not used
                    
                     ldi r16, 0x98      ;     
                     out DDRD, r16       ; DDRD=0b10011000   ;PD0-PD2 in , PD3,PD4 out , PD5 ,PD6 in, PD7 out
 
                     ser r16             
                     out PORTB, r16     ;  PORTB=0b11111111  ; set pull-up on PB0-PB7
 
                     ldi r16, 0x3F 
                     out PORTC, r16     ;  PORTC=0b00111111  ; set pull-up on  PB0-PB5
 
                     ldi r16, 0xF4     
                     out PORTD, r16     ;  PORTD=0b11110100 ;   PD7-PD4  high (pull-up), PD3 low , PD2 high, PD1,PD0 low 
 
 
 
 
 //init usart 
 
                     ldi r17, UBRRH_value 
                     ldi r16, UBRRL_value 
                     out UBRRH, r17                     
                     out UBRRL, r16         
 
                     ;ldi r16, UCSRA_value  
                     ldi r16, (1<<U2X)  
                     out UCSRA, r16  ;  
                     //ldi r16, UCSRB_value 
                      ldi r16, (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
                     out UCSRB, r16   
                     ; ldi r16, UCSRC_value 
                     ldi r16, (1 << UCSZ1) | (1 << UCSZ0 ) ; 
                     out UCSRC, r16
  
                
 
                     eor r18, r18 
                     sei              ; enable interrupts
//  loop forever, if no interrupts
Label_2:             rjmp Label_2 
 
 
//for '#'              
Label_24:       //ser r16= ldi r16, 0xFF
                     sbi DDRD, DDD3  
                     sbi PORTD, PD3  ; turn on  LED HL1
                     ser r16         ; all PB out
                     out DDRB, r16   ; PB=0xFF
                     sbi DDRC, DDC1  ; PC1 out
                     sbi DDRC, DDC0  ; PC0 out
                     sbi DDRD, DDD4  ; PD4 out 
                     sbi PORTD, PD4  ; set PD4 high ,RW=1
                     cbi DDRD, DDD5  ; PD5 input, NDAC
                     sbi PORTD, PD5  ; set NDAC high
                     cbi DDRD, DDD6  ; set PD6 input
                     sbi PORTD, PD6  ; set PD6  NRFD high (pull-up)
                     sbi DDRD, DDD7  ; set PD7 out 
                     sbi PORTD, PD7  ; set PD7 DAV high   (pull-up)
 
 
                     ser r22  //delay
                     ser r23 
 
 
Label_5:      
                     dec r23 
                     cpi r23, 0x00 
                     brne Label_3 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 
 
Label_3:      sbic PIND, PIND5 ; skip next line if PD5  (NDAC) low  ( 1 )
 
                     rjmp Label_5 
                     ser r22    //delay init
                     ser r23 
Label_7:       
                     dec r23   // delay
                     cpi r23, 0x00 
                     brne Label_6 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 
 
Label_6:             
                     sbis PIND, PIND6  ; skip next line if PD6 (NRFD)  high (0)
 
                     rjmp Label_7 
                     com r25           
                     out PORTB, r25  ; PB=0x00 TTL
                     adc r25, r25    ; shift  
                     adc r25, r25 
                     adc r25, r25 
                     andi r25, 0x03 ; r25&=0b00000011
                     in r16, PINC  ; input from PC to r16
                     andi r16, 0xFC ; mask 0b11111100
                     or r16, r25    ; r16 |=r25
                     out PORTC, r16 ;r16->PC
                     rcall Label_8 
 
                     cbi PORTD, PD7  ; set PD7 (DAV) low
 
                     ser r22  //delay init
                     ser r23 
Label_10:            
                     dec r23 //delay 
                     cpi r23, 0x00 
                     brne Label_9 
                     ser r23  
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 
 
Label_9:             
                     sbis PIND, PIND5 ; skip next line if PD5  (NDAC) high  ( 0 )
                     rjmp Label_10 
                     sbi PORTD, PD7   ; set PD7 (DAV) high
 
                     ldi r25, 0x03  ; send 0x03  to UART
                     rcall Label_11 
                     rjmp Label_12 
 
Label_4:             
                     ldi r25, 0x02 
                     rcall Label_11 ; send 0x02 to UART
 
Label_12:            
                     sbi DDRD, DDD3 ; PD3 out 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=0 
                     ret 
 
//Receive byte via GPIB HS
Label_37:           
                     sbi DDRD, DDD3 ; PD3 out 
                     sbi PORTD, PD3 ; turn on LED HL1 PD3=1 
                     eor r16, r16  
                     out DDRB, r16  ; PB input 
                     ser r16        
                     out PORTB, r16 ; PB pull-up   
                     cbi DDRC, DDC1 ; PC1 input  
                     sbi PORTC, PC1 ; PC1 pull-up 
                     cbi DDRC, DDC0 ; PC0 input
                     sbi PORTC, PC0 ; PC0 pull-up
                     sbi DDRD, DDD4 ; PD4 output
                     cbi PORTD, PD4 ; set PD4 low RW  =0 ,input 
                     sbi DDRD, DDD5 ; PD5 output 
                     cbi PORTD, PD5 ; set PD5 low (NDAC low) 
                     sbi DDRD, DDD6 ; PD6 output 
                     sbi PORTD, PD6 ; set PD6 high (NRFD high )
                     cbi DDRD, DDD7 ; PD7 input 
                     sbi PORTD, PD7 ; PD7 pull-up (DAV)
 
                     ser r22 //delay init
                     ser r23 
Label_15:          
                      dec r23 //delay
                     cpi r23, 0x00 
                     brne Label_13 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 
 
Label_13:            
                     sbic PIND, PIND7 ; skip next line if PD7  (DAV ) low
                     rjmp Label_15 
                     in r25, PINB ; read PB 
                     andi r16, 0x3F 
                     in r16, PINC ; read DB6, DB7 
                     ror r16          ; shift, append
                     ror r16 
                     ror r16 
                     andi r16, 0xC0 
                     or r25, r16 
                     sbi PORTD, PD5 ;  set  NDAC high 
                     cbi PORTD, PD6 ;  set  NRFD low 
 
                     ser r22  //delay  init
                     ser r23 
Label_17:            
                     dec r23 //delay
                     cpi r23, 0x00 
                     brne Label_16 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 
 
Label_16:           
                     sbis PIND, PIND7 ; skip next line if PD7  (DAV ) high
                     rjmp Label_17 
                     rjmp Label_18 
 
//send 0x01
Label_14:           
                    ldi r25, 0x01 
                     rcall Label_11 
                     rjmp Label_19 
//send 0x00
Label_18:            
                      com r25 
                      rcall Label_11 
 
Label_19:            
                     sbi DDRD, DDD3 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=1 
                     ret 
 
//ISR(USART_Rx_Complete)
Label_1:             
                      cli 
                      lds r25, UDR  ; loar byte from UARt to r25 
                     
                      cpi r18, 0x23  ; if  '#'
                      breq Label_20 
                      cpi r18, 0x24  ; if  '$'
                      breq Label_21 
                      cpi r18, 0x00  ; '\0x00'
                      breq Label_22 
                      rjmp Label_23  ; exit 
//if '#'
Label_20:         
                     rcall Label_24 
                     rjmp Label_23 
//if '$'
Label_21:            
                     cpi r25, 0x30 ; '0'    
                     breq Label_25 
                     cpi r25, 0x31 ; '1'
                     breq Label_26 
                     cpi r25, 0x32 ; '2'
                     breq Label_27 
                     cpi r25, 0x33 ; '3'
                     breq Label_28 
                     cpi r25, 0x34 ; '4'
                     breq Label_29 
                     cpi r25, 0x35 ; '5'
                     breq Label_30 
                     cpi r25, 0x36 ; '6'
                     breq Label_31 
                     cpi r25, 0x37 ; '7'
                     breq Label_32 
                     cpi r25, 0x38 ; '8'
                     breq Label_33 
                     cpi r25, 0x39 ; '9'
                     breq Label_34 
                     rjmp Label_23 
//if $0
Label_25:            
                     sbi PORTC, PC5 ; set REN low (1)
                     rjmp Label_23 
//if $1
Label_26:            
                     cbi PORTC, PC5 ; set REN high (0)
                     rjmp Label_23 
//if $2
Label_27:            
                     sbi PORTC, PC4 ; set ATN high (0)
                     rjmp Label_23 
//if $3
Label_28:            
                     cbi PORTC, PC4 ; set ATN  low (1)
                     rjmp Label_23 
//if $4
Label_29:            
                     cbi PORTC, PC2 ; set IFC low (1)
                     rcall Label_35 
 
                     sbi PORTC, PC2 ; set IFC high (0)
                     rjmp Label_23 
//if $5
Label_30:            
                     cbi DDRD, DDD2 ; set EOI PD2 as input
                     sbi PORTD, PD2 ; set PD2 (EOI) pull-up
                     sbi PORTC, PC4 ; PC4 ATN high 
                     rjmp Label_23 
//if $6
Label_31:            
                     sbi DDRD, DDD2 ; set EOI PD2 as output
                     cbi PORTD, PD2 ; set EOI low (1)
                     cbi PORTC, PC4 ; set ATN low (1)
                     rjmp Label_23 
//if $7
Label_32:            
                     rcall Label_36 
                     rjmp Label_23 
//if $8
Label_33:            
                     rcall Label_37 
                     rjmp Label_23 
//if $9
Label_34:            
                      rcall Label_38 
                     rjmp Label_23 
//if '\0x00'
Label_22:            
                     cpi r25, 0x23 ; if '#'
                     breq Label_39 
                     cpi r25, 0x24 ; if '$'
                     breq Label_39 
                     rjmp Label_40 
 
//if '$' or '#' after 0x00
Label_39:            
                     mov r18, r25 
                     rjmp Label_40 
//default
Label_23:            eor r18, r18 
 
//exit
Label_40:           
                      sei 
                     reti 
 
//   Read control lines
Label_38:            
                     eor r25, r25 
                     sbic PIND, PIND2 ; read EOI
                     sbr r25, 0x80     
                     sbic PINC, PINC5 ; read REN
                     sbr r25, 0x40 
                     sbic PINC, PINC4 ; read ATN
                     sbr r25, 0x20 
                     sbic PINC, PINC3 ; read SRQ
                     sbr r25, 0x10 
                     sbic PINC, PINC2 ; read IFC
                     sbr r25, 0x08 
                     sbis DDRD, DDD2    
                     sbr r25, 0x04 
                     rcall Label_11  ; send 
                     ret 
 
//Read Data bus
Label_36:            
                     eor r16, r16 
                     out DDRB, r16 
                     ser r16 
                     out PORTB, r16 
                     cbi DDRC, DDC1    ; DB7 in 
                     sbi PORTC, PC1     ;  DB7 pull- up
                     cbi DDRC, DDC0    ;  DB6 in 
                     sbi PORTC, PC0     ;  DB6 pull- up
                     sbi DDRD, DDD4   ; PD4 out  
                     cbi PORTD, PD4    ; RW =0 ,  buiffer     for input 
                     in r25, PINB          ; read DB
                     andi r16, 0x3F 
                     in r16, PINC         ;    read DB6,DB7  ,shift, append byte
                     ror r16                  ;    shift, append byte
                     ror r16 
                     ror r16 
                     andi r16, 0xC0 
                     or r25, r16 
                     com r25 
                     rcall Label_11    ; send byte to UART
                     ret 
 
//uart_send
Label_11:            
                     lds r17, UCSRA 
                     sbrs r17, 5 
                     rjmp Label_11 
                     out UDR, r25 
                     ret 
 
//for IFC=1 pulse (pulse IFC  low 13.2 ms ) delay sub
Label_35:            ser r20 //delay  init
Label_42:            ser r21 
Label_41:            dec r21 //delay loop
                     brne Label_41 
                     dec r20 
                     brne Label_42 
                     ret 
 
 
Label_8:              ldi r21, 0x4C //delay
Label_43:            dec r21 
                     brne Label_43 
                     ret
0
Вложения
Тип файла: zip m8a.zip (2.93 Мб, 3 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 16:43  [ТС] 31
Для 7.3728MHz , 115200 бод
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
 
//init USART for  7.3728MHz  , 115200  бод 
.equ           UCSRA_value =0x00         ; bit 2 =0 
.equ           UCSRB_value=0x98        ; UCSRB =0x98  0b10011000
.equ           UCSRC_value=0x06    ; UCSRC =0x06  0b00000110
.equ           UBRRH_value=0x00        ; UBRRH =0x00  0b00000000
.equ           UBRRL_value=0x03          ; UBRRH=0x03   0b00000011
 
                     ldi r17, UBRRH_value 
                     ldi r16, UBRRL_value 
                     out UBRRH, r17                     
                     out UBRRL, r16 
                     ;ldi r16, UCSRA_value  
                     ldi r16, (0<<U2X)  
                     out UCSRA, r16  ;  
                     //ldi r16, UCSRB_value 
                      ldi r16, (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
                     out UCSRB, r16   
                     ; ldi r16, UCSRC_value 
                     ldi r16, (1 << UCSZ1) | (1 << UCSZ0 ) ; 
                     out UCSRC, r16
изменить параметры подпрограмм задержки

Добавлено через 2 часа 26 минут
В нем ,кажется , есть неточности (см. алгоритм "рукопожатия" метки 24-10).

Добавлено через 44 минуты
В подпрограмме label6 после
Assembler
1
rcall Label_8
проверить ,правильная ли проверка на высокое NRFD после вывода байта , задержки и перед DAV:=1

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 ser r22    //delay init
                     ser r23 
Label_7:       
                     dec r23   // delay
                     cpi r23, 0x00 
                     brne Label_6 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 
 
Label_6:             
                     sbis PIND, PIND6  ; skip next line if PD6 (NRFD)  high (0)
 
                     rjmp Label_7 
                     com r25           //inverse data ,fix
                     out PORTB, r25  ; //out DB
                     adc r25, r25    ; shift  
                     adc r25, r25 
                     adc r25, r25 
                     andi r25, 0x03 ; r25&=0b00000011
                     in r16, PINC  ; input from PC to r16
                     andi r16, 0xFC ; mask 0b11111100
                     or r16, r25    ; r16 |=r25
                     out PORTC, r16 ;r16->PC //out data
                     rcall Label_8 //delay sub 
 
 //-> insert "NRFD high?  if yes then skip" check loop
//checkNRFD_Loop: 
//sbis PIND, PIND6 ; skip next line if PD6 (NRFD)  high (0)
//rjmp checkNRFD_Loop
 
 
                     cbi PORTD, PD7  ; set PD7 (DAV) low
 
                     ser r22  //delay init
                     ser r23 
Label_10:            
                     dec r23 //delay 
                     cpi r23, 0x00 
                     brne Label_9 
                     ser r23  
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 
 
Label_9:             
                     sbis PIND, PIND5 ; skip next line if PD5  (NDAC) high  ( 0 )
                     rjmp Label_10 
                     sbi PORTD, PD7   ; set PD7 (DAV) high
 
                     ldi r25, 0x03  ; send 0x03  to UART
                     rcall Label_11 
                     rjmp Label_12 
 
Label_4:             
                     ldi r25, 0x02 
                     rcall Label_11 ; send 0x02 to UART
 
Label_12:            
                     sbi DDRD, DDD3 ; PD3 out 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=0 
                     ret
Добавлено через 7 минут
Там еще какие-то баги по "хендшейку" (проишивка из статьи могла их содержать , с одним прибором у них "с пивом" проходило , там быстро завершались переходные процессы , но там с багами, если из архива ). Лучше напрямую по алгоритму рукопожатия доработать , задержки на устновившися процесс длительно одновременно NRFD=0 ОЛ и NDAC=0 ОЛ , после которых выдается ошибка после таймаута оставить .

Добавлено через 6 минут
Assembler
1
2
3
4
5
6
7
8
9
Label_4:             
                     ldi r25, 0x02 
                     rcall Label_11 ; send 0x02 to UART
 
Label_12:       
                      sbi PORTD, PD7   ; set PD7 (DAV) high   добавить     
                     sbi DDRD, DDD3 ; PD3 out 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=0 
                     ret
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 17:22  [ТС] 32
Основные этапы "рукопожатия " .



Label_37 тоже проверить (в начале с проверкой NRFD,NDAC пофиксать ).
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 21:28  [ТС] 33
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//for '#'              
Label_24: 
//Init ports
                      //ser r16= ldi r16, 0xFF
                     sbi DDRD, DDD3  
                     sbi PORTD, PD3  ; turn on  LED HL1
                     ser r16         ; all PB out
                     out DDRB, r16   ; PB=0xFF
                     sbi DDRC, DDC1  ; PC1 out
                     sbi DDRC, DDC0  ; PC0 out
                     sbi DDRD, DDD4  ; PD4 out 
                     sbi PORTD, PD4  ; set PD4 high ,RW=1
                     cbi DDRD, DDD5  ; PD5 input, NDAC
                     sbi PORTD, PD5  ; set NDAC pull-up
                     cbi DDRD, DDD6  ; set PD6 input
                     sbi PORTD, PD6  ; set PD6  NRFD pull-up
 
//Block1_Source, DAV=0
 
                     sbi DDRD, DDD7  ; set PD7 out 
                     sbi PORTD, PD7  ; set PD7 DAV high
 
//Block2_Source If  NRFD=0 (high) and  NDAC=0 (high)   both , then error  
       
                     ser r22  //delay
                     ser r23 
 
 
Label_5:      
                     dec r23 
                     cpi r23, 0x00 
                     brne Label_3 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4   //to Block3_Source
 
Label_3:     
                     sbic PIND, PIND5 ; skip next line if PD5  (NDAC) low  ( 1 )
                     rjmp Label_5 
//delay 
                     ser r22    
                     ser r23 
Label_7:       
                     dec r23   // delay
                     cpi r23, 0x00 
                     brne Label_6 //terminate loop
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 // send  error statement, to Block3_Source
 
Label_6:             
                     sbis PIND, PIND6  ; skip next line if PD6 (NRFD)  high (0)
 
                     rjmp Label_7 
 
//Block4_Source OUT DB
                     com r25           
                     out PORTB, r25  ; PB=0x00 TTL
                     adc r25, r25    ; shift  
                     adc r25, r25 
                     adc r25, r25 
                     andi r25, 0x03 ; r25&=0b00000011
                     in r16, PINC  ; input from PC to r16
                     andi r16, 0xFC ; mask 0b11111100
                     or r16, r25    ; r16 |=r25
                     out PORTC, r16 ;r16->PC
 
//Block5_Source Delay
 
                     rcall Label_8
 
//Block6_Source NRFD=0 (high)? 
//If yes -> next sub, else - > loop
 
checkNRFD_Loop: 
                      sbis PIND, PIND6 ; skip next line if PD6 (NRFD)  high (0)
                      rjmp checkNRFD_Loop
 
 
//Block7_Source  Set DAV=1( low)
 
                     cbi PORTD, PD7  ; set PD7 (DAV) low
 
 
                     ser r22  //delay init
                     ser r23 
Label_10:            
                     dec r23 //delay 
                     cpi r23, 0x00 
                     brne Label_9   //
                     ser r23  
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 // to Block3_Source
 
//Block8_Source  NDAC=0 (high)? If yes -> next
 
Label_9:             
                     sbis PIND, PIND5 ; skip next line if PD5  (NDAC) high  ( 0 )
                     rjmp Label_10 
 
//Block9_1_Source_if_error 
                     sbi PORTD, PD7   ; set PD7 (DAV) high
 
                     ldi r25, 0x03  ; send 0x03  to UART
                     rcall Label_11 
                     rjmp Label_12 
 
//Block3_Source
Label_4:             
                     ldi r25, 0x02 
                     rcall Label_11 ; send 0x02 to UART
 
Label_12:   
//Block9_Source   
                     sbi PORTD, PD7  ; set PD7 (DAV=0, high)
       
                     sbi DDRD, DDD3 ; PD3 out 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=0 
                     ret
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//Receive byte via GPIB HS
Label_37:   
//LED  on        
                     sbi DDRD, DDD3 ; PD3 out 
                     sbi PORTD, PD3 ; turn on LED HL1 PD3=1 
 
// init ports
                     eor r16, r16  
                     out DDRB, r16  ; PB input 
                     ser r16        
                     out PORTB, r16 ; PB pull-up   
                     cbi DDRC, DDC1 ; PC1 input  
                     sbi PORTC, PC1 ; PC1 pull-up 
                     cbi DDRC, DDC0 ; PC0 input
                     sbi PORTC, PC0 ; PC0 pull-up
                     sbi DDRD, DDD4 ; PD4 output
                     cbi PORTD, PD4 ; set PD4 low RW  =0 ,input 
 
//Block1_Acceptor  or after Block2.2_Acceptor
 
                     sbi DDRD, DDD5 ; PD5 output 
                     cbi PORTD, PD5 ; set PD5 low (NDAC =1, low) 
//for Block1_Acceptor
                 //      sbi DDRD, DDD6 ; PD6 output 
                 //      cbi PORTD, PD6 ; set PD6 high (NRFD=1, low ) 
 
// may be Block2_Acceptor
 
 
//Block3_Acceptor 
                     sbi DDRD, DDD6 ; PD6 output 
                     sbi PORTD, PD6 ; set PD6 high (NRFD=0, high )
 
//Block4_Acceptor
 
                     cbi DDRD, DDD7 ; PD7 (DAV) input 
                     sbi PORTD, PD7 ; PD7 pull-up (DAV)
 
 //delay , timeout check
                     ser r22  
                     ser r23 
Label_15:          
                      dec r23 //delay
                     cpi r23, 0x00 
                     brne Label_13 // check DAV=1 or timeout  and error 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 //out error  
 
Label_13:  
 
//Block4_1_Acceptor  DAV=1(1ow) ?
         
                     sbic PIND, PIND7 ; skip next line if PD7  (DAV ) low
                     rjmp Label_15 
 
//Block5_Acceptor ,   NRFD=1 (low)  ; add 
                     cbi PORTD, PD6 ;  set  NRFD=1,  low 
 
//Block6_Acceptor Input DB from data bus
 
                     in r25, PINB ; read PB 
                     andi r16, 0x3F 
                     in r16, PINC ; read DB6, DB7 
                     ror r16          ; shift 
                     ror r16 
                     ror r16 
                     andi r16, 0xC0 
                     or r25, r16    ; append
 
 
//Block7_Acceptor NDAC=0( high)
                     sbi PORTD, PD5 ;  set  NDAC high 
/*
 
//Block5_Acceptor, fix
                     cbi PORTD, PD6 ;  set  NRFD low 
*/
 
//Block8_Acceptor
//delay for timeout check
                     ser r22 
                     ser r23 
Label_17:            
                     dec r23
                     cpi r23, 0x00 
                     brne Label_16  //check DAV=0  (high) or timeout 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 
 
//Block8_1_Acceptor
Label_16:           
                     sbis PIND, PIND7 ; skip next line if PD7  (DAV ) high
                     rjmp Label_17 
                     rjmp Label_18 
 
//send AH error message 
Label_14:           
                     ldi r25, 0x01 //send error 
                     rcall Label_11 
                     rjmp Label_19 
 
 //send data 
Label_18:            
                      com r25  //decode inverse logic DB -> TTL
                      rcall Label_11 
 
 
 
Label_19:      
//Block9_Acceptor
                     cbi PORTD, PD5 ;  set  NDAC=1  (  low )
 //LED sub 
                     sbi DDRD, DDD3 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=1 
                     ret
Добавлено через 11 минут
Assembler
1
2
3
//Block4_Source OUT DB
                     com r25           
                     out PORTB, r25  ; PB=! DB
Добавлено через 42 минуты
Управление направлением буферов DAV а также NRFD,NDAC (наоборот направление ) можно и привязать к RW .

На REN, IFC, ATN можно просто поставить буфер , для $5 и $6 на EOI , кажется, нужен отдельный выход управления направлением буфера .

С SRQ еще посмотреть документацию (нужно ли вводить режим иммитации акцептора).

https://www.edn.com/design/tes... controller
http://itt-ltd.com/reference/ref_ieee488.html
https://life-prog.ru/2_76365_i... aniya.html

Добавлено через 2 минуты
http://www.ti.com/lit/ds/symlink/sn75160b.pdf

Добавлено через 49 секунд
http://cdn-reichelt.de/documen... AN-NAT.pdf

Добавлено через 55 секунд
см. про выводы TE ,DC,PE

Добавлено через 46 минут
C TMS9914, SN75160,SN75161 ,SN75162 очевиднее (TE,DC nCONTROL ) http://bitsavers.trailing-edge... _Dec82.pdf

Добавлено через 29 минут
см. 75162 в режиме +5В на SC (1), выводы TE , DC, SC.

Добавлено через 1 час 2 минуты
Правильно ли используются Label_36: Label_37: ? Одна без "рукопожатия" (тупо контроль текущего состояния шины данных ), другая с рукопожатием

Assembler
1
2
3
4
5
6
7
8
                     cpi r25, 0x37 ; '7'
                     breq Label_32    //Read byte from GPIB 
 
                     cpi r25, 0x38 ; '8'
                     breq Label_33    //Read control lines from GPIB 
 
                     cpi r25, 0x39 ; '9'
                     breq Label_34   //Send ASCII KOI-7 char  to GPIB
ссылаются на



Assembler
1
2
3
4
5
6
7
8
9
10
11
12
//if $7
Label_32:            //Read byte from GPIB 
                     rcall Label_36 //Read byte from GPIB
                     rjmp Label_23 
//if $8
Label_33:            //Read control lines from GPIB 
                     rcall Label_37 //Read byte from GPIB HS 
                     rjmp Label_23 
//if $9
Label_34:            
                      rcall Label_38 
                     rjmp Label_23
это
Assembler
1
2
//Receive byte via GPIB HS,  Listener mode 
Label_37:
с хендшейком, а
Assembler
1
2
//Read Data bus
Label_36:
нет.
Нам же , кажется, надо считывать при $7 через Label_37: ?

Добавлено через 14 секунд
А в программе как ?

Добавлено через 10 минут
А,там

Assembler
1
2
3
4
5
6
7
            cpi r25, 0x37 ; '7'
                     breq Label_32    //Read DB statement from  GPIB 
                     cpi r25, 0x38 ; '8'
                     breq Label_33    //Get  byte    from GPIB  (using handshake )
                     cpi r25, 0x39 ; '9'
                     breq Label_34   //Read control lines from GPIB 
                     rjmp Label_23
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 22:49  [ТС] 34
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
;
; mega8agpib.asm
;
; Created: 10.07.2019 11:46:08
; Author : USERPC01  
; using  modified  M.Terentjev's  algorithm  compatible codes (from Radio #1/2010)
;
 
 
 
 
 
/*
for ATMeg8a
 
; ***** INTERRUPT VECTORS ************************************************
.equ    INT0addr    = 0x0001    ; External Interrupt Request 0
.equ    INT1addr    = 0x0002    ; External Interrupt Request 1
.equ    OC2addr = 0x0003    ; Timer/Counter2 Compare Match
.equ    OVF2addr    = 0x0004    ; Timer/Counter2 Overflow
.equ    ICP1addr    = 0x0005    ; Timer/Counter1 Capture Event
.equ    OC1Aaddr    = 0x0006    ; Timer/Counter1 Compare Match A
.equ    OC1Baddr    = 0x0007    ; Timer/Counter1 Compare Match B
.equ    OVF1addr    = 0x0008    ; Timer/Counter1 Overflow
.equ    OVF0addr    = 0x0009    ; Timer/Counter0 Overflow
.equ    SPIaddr = 0x000a    ; Serial Transfer Complete
.equ    URXCaddr    = 0x000b    ; USART, Rx Complete
.equ    UDREaddr    = 0x000c    ; USART Data Register Empty
.equ    UTXCaddr    = 0x000d    ; USART, Tx Complete
.equ    ADCCaddr    = 0x000e    ; ADC Conversion Complete
.equ    ERDYaddr    = 0x000f    ; EEPROM Ready
.equ    ACIaddr = 0x0010    ; Analog Comparator
.equ    TWIaddr = 0x0011    ; 2-wire Serial Interface
.equ    SPMRaddr    = 0x0012    ; Store Program Memory Ready
 
.equ    INT_VECTORS_SIZE    = 19    ; size in words
 
 */
 
/*
ATMEGA8A-PU
 
fuses
 
LOW=$FE           ?fix
HIGH=$D9  ( or C9 )         ?fix
LOCK=$3F  //select for no protect , default 
 
CKSEL3...1=111   // 1- 16 MHz 
CKSEL0=0  
SUT1...0=11  //65 ms +  16 ck
BODEN=1
BODLEVEL=1
 
BOOTRST=1
BOOTSZ0=0
BOOTSZ1=0
EESAVE=1
CKOPT=1 (may be 0 )
SPIEN=0 (default)
WDTON=1 (or default )
RSTDISBL=1 ( not programmed, nReset on the pin )
 
 
 
 
OSC 14.7456 MHz , no div by 8  //fix
 
PB0  D0 (  log.1  low )  T: out; L: in
PB1  D1 (  log.1  low )  T: out; L: in
PB2  D2 (  log.1  low )  T: out; L: in 
PB3  D3 (  log.1  low )  T: out; L: in
PB4  D4 (  log.1  low )  T: out; L: in
PB5  D5 (  log.1  low )  T: out; L: in 
PC0  D6 (  log.1  low )  T: out; L: in
PC1  D7 (  log.1  low )  T: out; L: in
 
PC2  IFC (  log.1  low )  out
PC3  SRQ (  log.1  low )   in  , default   / 
PC4  ATN (  log.1  low )   out
PC5  REN (  log.1  low )   out
 
PD0 RXD MCU TTL
PD1 TXD MCU TTL
PD2  EOI (  log.1  low )  IDY=0  in / IDY=1 EOI  out , ATN=1  low and EOI =1 low 
PD3 LED HL1 out
PD4 RW out for SN74ALS245A control (1 A->B, 0 B->A )
PD5 NDAC (  log.1  low )    T: in, L: out
PD6 NRFD (  log.1  low )     T: in, L: out
PD7  DAV   (  log.1  low )     T: out; L: in
Pin1 - nReset 
 
$0 REN=0 (set REN high )
$1 REN=1 (set REN low )
$2 ATN=0 (set REN high )
$3 ATN=1 (set REN low )
$4 IFC=1 pulse (pulse IFC  low 13.2 ms )
$5 IDY=0 , turn off parallel poll   (EOI  in , ATN high)
$6 IDY=1 , turn on parallel poll   (EOI  out , ATN and EOI low )
$7 Read Data bus statement   (transmit via RS232    DIO1-DIO8  statement  byte (status))
$8 Receive byte via GPIB HS (receive  bytte from GPIB with handshake  and send to UART or  send error 0x01 )
$9 Read control lines (send  byte with EOI,REN,ATN,SRQ,1,IDY, 0,0 statement)
#x Send ASCII -code via GPIB HS (Transmit byte x using handshake and send report to UART :0x03 success , 0x02 error)
 
 */
 
 
 
 
  
 
 
                      //115200 baud 8-N-1
                      //fosc =14.7456 MHz 
                     //UCSRA 0x02
                     //UCSRB 0x98
                     //UCSRC 0x06
                     //UBRRH 0x00
                     //UBRRL 0x0F
/*
 
UCSRA:  RXC TXC UDRE FE DOR UPE U2X MPCM
UCSRB:  RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
UCSRC: UMSEL1 UMSEL0 UPM1 UPM0 USBS  UCSZ1   UCSZ0  UCPOL 
 
 
#define ubrr (FOSC/(BAUDRATE<<3))-1 U2X=1
#define ubrr (FOSC/(BAUDRATE<<4))-1 U2X=0
 
BAUD=fOSC/(8*(UBRRn + 1)) for U2X0=1
BAUD=fOSC/(16*(UBRRn + 1)) for U2X0=0
UBRR=(fOSC/(8*BAUD))1  for U2X0=1
UBRR=(fOSC/(16*BAUD))1  for U2X0=0
 
 115200*(8*(15+1))=115200*128=14745600
 
UCSRA=(1<<U2X) ; double speed, async
UCSRB =(1 <<RXCIE)|(1<<RXEN)|(1<<TXEN)
UCSRC =(1 << UCSZ1) | (1 << UCSZ0);     
( USBS=0 1stop bit, 8 data bit UCSZ2...0= 011,
  no parity UPM1...0=00 ,Asynchronous USART UMSEL1...0=00 )
UBRR=15  U2X=1 , 14,745600 MHz
UBRRH = (unsigned char) (ubrr >> 8);
UBRRL = (unsigned char) ubrr;
UBRR=103  U2X=1   for 12MHz ,  fix delay subs 
UBRR=3  (0x00, 0x03 )      U2X=0   for  7.3728MHz,  fix delay subs 
 
*/
 
                     
 
 
 
 
 
           //.device atmega8a
           .nolist                  
 
          .include  "m8Adef.inc"    
           
          .list                
 
 
 
 
 
 
    .cseg                    ;?????? ????????? ????????, ??? ?????? ???? ??? ?????????
    .org 0x0000                   ; Reset Handler
                              
                          
                         rjmp    Label_0  
 
    .org  URXCaddr            ; USART Rx Complete
                             
               rjmp Label_1 
 
 
   
 
 
   .org 0x0013 ; real begin of code segment
 
  
 
 Label_0:
 
 
                  ; stack  initializing 
                   
 
                     ldi r16 , high(RAMEND)  ;  main program start
                     out SPH, r16                     ;  set stack pointer to top of RAM 
                     ldi r16,   low(RAMEND)  ;
                     out SPL, r16    
   
                     ser r16     
                     out DDRB, r16     ; DDRB=0b11111111    PB0-PB5   out ; PB6,PB7 osc
                  
                      ldi r16, 0x37      ;                        
                     out DDRC, r16      ;  DDRC= 0b00110111  
                                                    ; PC0 (D6) out, PC1 (D7) out , 
                                                    ; PC2 (IFC) out,  PC3(SRQ) in , PC4(ATN) out, PC5(REN) out , PC6 nReset, PC7 not used
                    
                     ldi r16, 0x98      ;     
                     out DDRD, r16       ; DDRD=0b10011000   ; PD0,PD1 UART, PD2 (EOI) in    , PD3(HL1)  , PD4(RW) out 
                                                     ; PD5 (NDAC) in , PD6(NRFD) in, PD7 (DAV) out
 
                     ser r16             
                     out PORTB, r16     ;  PORTB=0b11111111  ; set pull-up on PB0-PB7
 
                     ldi r16, 0x3F 
                     out PORTC, r16     ;  PORTC=0b00111111  ; set pull-up on  PB0-PB5
 
                     ldi r16, 0xF4     
                     out PORTD, r16     ;  PORTD=0b11110100 ;   PD7-PD4  high (pull-up), PD3 low (LED) , PD2  (EOI) high, PD1,PD0 low(UART)
 
 
 
 
 //init usart 
 
        ldi r16,0x02 ;  (1<<U2X)  
                     out UCSRA, r16  ;  
                     //ldi r16, UCSRB_value 
                      ldi r16, 0x98 ; (1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
                     out UCSRB, r16   
                     ; ldi r16, UCSRC_value 
                     ldi r16, 0x06 ; (1 << UCSZ1) | (1 << UCSZ0 ) ; 
                     out UCSRC, r16
  
                
                     ldi r17, 0x00
                    
                     out UBRRH, r17 
                     ldi r16, 0x0f              
                     out UBRRL, r16  
 
                     eor r18, r18 
                     sei       ; enable interrupts
//  loop forever, if no interrupts
Label_2:             rjmp Label_2 
 
 
//for '#'       
 
//Send byte via GPIB HS , Talker mode 
Label_24: 
//Init ports
                      //ser r16= ldi r16, 0xFF
                     sbi DDRD, DDD3  
                     sbi PORTD, PD3  ; turn on  LED HL1
                     ser r16         ; all PB out  
                     out DDRB, r16   ; PB=0xFF
                     sbi DDRC, DDC1  ; PC1 (D7)   out
                     sbi DDRC, DDC0  ; PC0 (D6)   out
                     sbi DDRD, DDD4  ; PD4 (RW)  out 
                     sbi PORTD, PD4   ;  set PD4 high , RW=1, out, as talker
                     cbi DDRD, DDD5  ; set PD5(NDAC) as input   
                     sbi PORTD, PD5   ; set NDAC pull-up
                     cbi DDRD, DDD6  ; set PD6(NRFD ) as input
                     sbi PORTD, PD6   ; set PD6  NRFD  pull-up
 
//Block1_Source, DAV=0
 
                     sbi DDRD, DDD7  ; set PD7 (DAV) as output 
                     sbi PORTD, PD7  ; set PD7  high
 
//Block2_Source If  NRFD=0 (high) and  NDAC=0 (high)   both , then error  
       
                     ser r22  //delay
                     ser r23 
 
 
Label_5:      
                     dec r23 
                     cpi r23, 0x00 
                     brne Label_3 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4   //to Block3_Source
 
Label_3:     
                     sbic PIND, PIND5 ; skip next line if PD5  (NDAC) low  ( 1 )
                     rjmp Label_5 
//delay 
                     ser r22    
                     ser r23 
Label_7:       
                     dec r23   // delay
                     cpi r23, 0x00 
                     brne Label_6 //terminate loop
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 // send  error statement, to Block3_Source
 
Label_6:             
                     sbis PIND, PIND6  ; skip next line if PD6 (NRFD)  high (0)
 
                     rjmp Label_7 
 
//Block4_Source OUT DB
                     com r25           
                     out PORTB, r25  ; PB=nDB 
                     adc r25, r25    ; shift  
                     adc r25, r25 
                     adc r25, r25 
                     andi r25, 0x03 ; r25&=0b00000011
                     in r16, PINC  ; input from PC to r16
                     andi r16, 0xFC ; mask 0b11111100
                     or r16, r25    ; r16 |=r25
                     out PORTC, r16 ;r16->PC
 
//Block5_Source Delay
 
                     rcall Label_8
 
//Block6_Source NRFD=0 (high)? 
//If yes -> next sub, else - > loop
 
checkNRFD_Loop: 
                      sbis PIND, PIND6 ; skip next line if PD6 (NRFD)  high (0)
                      rjmp checkNRFD_Loop
 
 
//Block7_Source  Set DAV=1( low)
 
                     cbi PORTD, PD7  ; set PD7 (DAV) low
 
 
                     ser r22  //delay init
                     ser r23 
Label_10:            
                     dec r23 //delay 
                     cpi r23, 0x00 
                     brne Label_9   //
                     ser r23  
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_4 // to Block3_Source
 
//Block8_Source  NDAC=0 (high)? If yes -> next
 
Label_9:             
                     sbis PIND, PIND5 ; skip next line if PD5  (NDAC) high  ( 0 )
                     rjmp Label_10 
 
//Block9_1_Source_if_error 
                     sbi PORTD, PD7   ; set PD7 (DAV) high
 
                     ldi r25, 0x03  ; send 0x03  to UART
                     rcall Label_11 
                     rjmp Label_12 
 
//Block3_Source, error
Label_4:             
                     ldi r25, 0x02 
                     rcall Label_11 ; send 0x02 to UART
 
Label_12:   
//Block9_Source   
                     sbi PORTD, PD7  ; set PD7 (DAV=0, high)
       
                     sbi DDRD, DDD3 ; PD3 out 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=0 
                     ret 
 
 
 
 
 
//Receive byte via GPIB HS,  Listener mode 
Label_37:   
//LED  on        
                     sbi DDRD, DDD3 ; PD3 out 
                     sbi PORTD, PD3 ; turn on LED HL1 PD3=1 
 
// init ports
                     eor r16, r16  
                     out DDRB, r16  ; PB    input 
                     ser r16        
                     out PORTB, r16 ; PB pull-up   
                     cbi DDRC, DDC1 ; PC1 (D7) input  
                     sbi PORTC, PC1 ; PC1 pull-up 
                     cbi DDRC, DDC0 ; PC0 (D6) input
                     sbi PORTC, PC0 ; PC0 pull-up
                     sbi DDRD, DDD4 ; PD4(RW) output
                     cbi PORTD, PD4 ; set PD4 low RW  =0 , input , as listener, TE=0
 
//Block1_Acceptor  or after Block2.2_Acceptor
 
                     sbi DDRD, DDD5 ; PD5(NDAC) as  output 
                     cbi PORTD, PD5 ; set PD5 low (NDAC =1, low) 
//for Block1_Acceptor
                       sbi DDRD, DDD6 ; PD6(NRFD) as output 
                 //      cbi PORTD, PD6 ; set PD6 high (NRFD=1, low ) 
 
// may be Block2_Acceptor
 
 
//Block3_Acceptor 
                    
                     sbi PORTD, PD6 ; set PD6 high (NRFD=0, high )
 
//Block4_Acceptor
 
                     cbi DDRD, DDD7 ; PD7 (DAV) as input 
                     sbi PORTD, PD7 ; PD7 pull-up (DAV)
 
 //delay , timeout check
                     ser r22  
                     ser r23 
Label_15:          
                      dec r23 //delay
                     cpi r23, 0x00 
                     brne Label_13 // check DAV=1 or timeout  and error 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 //out error  
 
Label_13:  
 
//Block4_1_Acceptor  DAV=1(1ow) ?
         
                     sbic PIND, PIND7 ; skip next line if PD7  (DAV ) low
                     rjmp Label_15 
 
//Block5_Acceptor , add
                     cbi PORTD, PD6 ;  set  NRFD=1,  low 
 
//Block6_Acceptor
                     in r25, PINB ; read PB 
                     andi r16, 0x3F 
                     in r16, PINC ; read DB6, DB7 
                     ror r16          ; shift 
                     ror r16 
                     ror r16 
                     andi r16, 0xC0 
                     or r25, r16    ; append
 
 
//Block7_Acceptor NDAC=0( high)
                     sbi PORTD, PD5 ;  set  NDAC high 
/*
 
//Block5_Acceptor, fix
                     cbi PORTD, PD6 ;  set  NRFD low 
*/
 
//Block8_Acceptor
 
                     ser r22 
                     ser r23 
Label_17:            
                     dec r23
                     cpi r23, 0x00 
                     brne Label_16  //check DAV=0  (high) or timeout 
                     ser r23 
                     dec r22 
                     cpi r22, 0x00 
                     breq Label_14 
 
//Block8_1_Acceptor
Label_16:           
                     sbis PIND, PIND7 ; skip next line if PD7  (DAV ) high
                     rjmp Label_17 
                     rjmp Label_18 
 
//send AH error message 
Label_14:           
                     ldi r25, 0x01 //send error 
                     rcall Label_11 
                     rjmp Label_19 
 
 //send data 
Label_18:            
                      com r25  //decode inverse logic DB -> TTL
                      rcall Label_11 
 
 
 
Label_19:      
//Block9_Acceptor
                     cbi PORTD, PD5 ;  set  NDAC=1  (  low )
 //LED sub 
                     sbi DDRD, DDD3 
                     cbi PORTD, PD3 ; turn off LED HL1 PD3=1 
                     ret 
 
 
 
//ISR(USART_Rx_Complete)
Label_1:             
                      cli 
                      ;lds r25, UDR  ; loar byte from UARt to r25 
                       in r25, UDR 
 
                      cpi r18, 0x23  ; if  '#'
                      breq Label_20 
                      cpi r18, 0x24  ; if  '$'
                      breq Label_21 
                      cpi r18, 0x00  ; '\0x00'
                      breq Label_22 
                      rjmp Label_23  ; exit 
 
 
//if '#'
Label_20:         
                     rcall Label_24 
                     rjmp Label_23 
//if '$'
Label_21:            
                     cpi r25, 0x30 ; '0'    
                     breq Label_25        //REN=0
                     cpi r25, 0x31 ; '1'
                     breq Label_26        //REN=1
                     cpi r25, 0x32 ; '2'
                     breq Label_27       //ATN=0
                     cpi r25, 0x33 ; '3'
                     breq Label_28       //ATN=1
                     cpi r25, 0x34 ; '4'
                     breq Label_29      // IFC=1 pulse  
                     cpi r25, 0x35 ; '5'
                     breq Label_30     //mode IDY=0 turn off parallel polling, EOI in,  ATN out,  high 
                     cpi r25, 0x36 ; '6'
                     breq Label_31     //mode IDY=6 turn on parallel polling , EOI out , EOI =1(out) ,  ATN=1 (out) 
                     cpi r25, 0x37 ; '7'
                     breq Label_32    //Read byte from GPIB
                     cpi r25, 0x38 ; '8'
                     breq Label_33    //Receive byte    from GPIB  (HS)
                     cpi r25, 0x39 ; '9'
                     breq Label_34   //Read control lines from GPIB 
                     rjmp Label_23 
//if $0
Label_25:            
                     sbi PORTC, PC5 ; set REN low (1)
                     rjmp Label_23 
//if $1
Label_26:            
                     cbi PORTC, PC5 ; set REN high (0)
                     rjmp Label_23 
//if $2
Label_27:            
                     sbi PORTC, PC4 ; set ATN high (0)
                     rjmp Label_23 
//if $3
Label_28:            
                     cbi PORTC, PC4 ; set ATN  low (1)
                     rjmp Label_23 
//if $4
Label_29:            
                     cbi PORTC, PC2 ; set IFC low (1)
                     rcall Label_35 
 
                     sbi PORTC, PC2 ; set IFC high (0)
                     rjmp Label_23 
//if $5
Label_30:            
                     cbi DDRD, DDD2 ; set PD2 (EOI)  as input
                     sbi PORTD, PD2  ; set PD2 (EOI) pull-up
                     sbi PORTC, PC4  ; set PC4 (ATN=0)      high 
                     rjmp Label_23 
//if $6
Label_31:            
                     sbi DDRD, DDD2 ; set PD2 (EOI ) as output
                     cbi PORTD, PD2  ; set EOI =1,  low  
                     cbi PORTC, PC4  ; set ATN=1,  low  
                     rjmp Label_23 
//if $7
Label_32:            //Read byte from GPIB 
                     rcall Label_36 //Read byte from GPIB
                     rjmp Label_23 
//if $8
Label_33:            //Read control lines from GPIB 
                     rcall Label_37 //Read byte from GPIB HS 
                     rjmp Label_23 
//if $9
Label_34:            
                      rcall Label_38 //   Read control lines
                     rjmp Label_23 
//if '\0x00'
Label_22:            
                     cpi r25, 0x23 ; if '#'
                     breq Label_39 
                     cpi r25, 0x24 ; if '$'
                     breq Label_39 
                     rjmp Label_40 
 
//if '$' or '#' after 0x00
Label_39:            
                     mov r18, r25 
                     rjmp Label_40 
//default
Label_23:            eor r18, r18 
 
//exit
Label_40:           
                      sei 
                     reti 
 
//   Read control lines
Label_38:            
                     eor r25, r25 
                     sbic PIND, PIND2 ; read EOI
                     sbr r25, 0x80     
                     sbic PINC, PINC5 ; read REN
                     sbr r25, 0x40 
                     sbic PINC, PINC4 ; read ATN
                     sbr r25, 0x20 
                     sbic PINC, PINC3 ; read SRQ
                     sbr r25, 0x10 
                     sbic PINC, PINC2 ; read IFC
                     sbr r25, 0x08 
                     sbis DDRD, DDD2    
                     sbr r25, 0x04 
                     rcall Label_11  ; send 
                     ret 
 
//Read Data bus
Label_36:            
                     eor r16, r16 
                     out DDRB, r16     ; PB in 
                     ser r16 
                     out PORTB, r16 
                     cbi DDRC, DDC1    ; DB7 in 
                     sbi PORTC, PC1     ;  DB7 pull- up
                     cbi DDRC, DDC0    ;  DB6 in 
                     sbi PORTC, PC0     ;  DB6 pull- up
                     sbi DDRD, DDD4    ; PD4 (RW) out  
                     cbi PORTD, PD4     ; RW =0 ,  buiffer     for input ,TE=0
 
                     in r25, PINB          ;  read DB
                     andi r16, 0x3F 
                     in r16, PINC         ;    read DB6,DB7  , shift, append byte
                     ror r16                  ;    shift
                     ror r16 
                     ror r16 
                     andi r16, 0xC0 
                     or r25, r16           ; append byte
                     com r25 
                     rcall Label_11    ; send byte to UART
                     ret 
 
//uart_send
Label_11:            
                     in r17, UCSRA 
                    // sbrs r17, 5          //UDRE
                      sbis UCSRA, UDRE
                     rjmp Label_11 
                     out UDR, r25 
                     ret 
 
//for IFC=1 pulse (pulse IFC  low 13.2 ms ) delay sub
Label_35:         
                             ser r20 //delay  init
Label_42:            ser r21 
Label_41:            dec r21 //delay loop
                     brne Label_41 
                     dec r20 
                     brne Label_42 
                     ret 
 
 
Label_8:              ldi r21, 0x4C //delay
Label_43:            dec r21 
                     brne Label_43 
                     ret
0
Вложения
Тип файла: zip astudio.zip (3.24 Мб, 3 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.07.2019, 22:50  [ТС] 35
исправил некоторые мнемоники в UART-подпрограмме (lds -> in и другие ) .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
14.07.2019, 09:43  [ТС] 36
http://www.dalton.ax/gpib/ с диодами на выходе катодами к микросхеме для некоторых выходов (в GPIB они все с открытым коллектором ), обеспечивающими замыкание на корпус (когда лог. 1 отрицательной логики, в американской редакции названий выводов по смыслу, где все - ОЛ) и ХХ, когда лог 0 ОЛ (высокий уровень ) проблема при работе на ввод : нужно подтяжка вниз со стороны катода (6,8...10 kOm ), "пересиливаемая" резистором подтяжки вверх со стороны шины перед диодом (режим лог. 0 ОЛ )со стороны анода (3,3...4,7 kOm) и замыканием на корпус со стороны вентиля с 155ЛА8 - образным выходом в устройстве в режиме приема 1 ОЛ (0 ПЛ) , ( https://elektrikaetoprosto.ru/sn7401.html , http://vak.ru/pub/gost/gost-26-003-80.pdf ) или током через нижний транзистор выходного вентиля . Особенно это важно для NDAC, NRFD , DAV , SRQ , EOI ,DIO .

Но тогда микросхема должна в режиме входа иметь отключенные подтягивающие резисторы вверх и вниз и большую нагрузочную способность . А это возможно только с буферами . Переключение направлений см. SN75160, SN75162 . значит, в схеме желательно иметь другую прошивку или уточнить исходник .

Добавлено через 27 минут
А вот индикацию в схеме с буферами можно приделать и как в http://www.dalton.ax/gpib/ , освободив светодиод , изменив в прошивке назначение вывода PD3 на управляющее , отказавшись от светодиода, введя индикацию TE (Talker Enabled ) по сигналу с PD4 (RW,TE) ,за обменом информацией следить по светодиодам DAV ,NRFD,NDAC (отр. логика. ) , управлять буферами на 2...3 74ALS 245 или аналогичных мощных ТТЛ, ТТЛШ , включенными с учетом направления , аналогичного в 75160 ,75162 ,
http://ecee.colorado.edu/~mccl... 45rev5.pdf , с диодами (если у них выходы не с открытым коллектором с аналогичными резисторами перед и после диодов)
доработав логику , добавив несколько транзисторов и резисторов для логики управления направлением SRQ, EOI ,ATN , управляя B (аналогично схеме ) и DAV, NDAC,NRDF (с соответствующим выбором направления ) по сигналу TE (RW), буферировав REN,IFC (они всегда выходы с открытым коллектором для контроллера, для эмуляции акцептора- источника, акцептора-приемника подумать ) , SRQ,ATN; EOI с помощью логики (как в 75162 ) и минтермов TE , nDC , переписав программы хендшейков Label_24, Label_37 , Label_36 и управления режимом IDY ,PPE ,PPD , правильно инициализировав порты .

Добавлено через 4 минуты
Если вводить режим эмулятора акцептора ( прибора, источника и приемника с функциями СИx, СПx, ДМх, Зх , И, П ) , например, для тестирования 814-х терминалов с компьютера, то направлением ДУ, и ОИ надо управлять , тогда в программу нужно вводить дополнительные режимы, подпрограммы и опции , добавить в схему переключатель контроллер-акцептор .

Добавлено через 15 минут
Для эмуляции приборов (акцепторов) ввести режим @, с которого начинаются инициализация и подпрограммы работы, хендшейков источника и приемника как акцептора (прибора ,а не конороллера ) , ввести режим инициализации как контроллера в меню $ . Добавить режим контроля четности и учесть логику управления выводами ЗО,УП, КП для эмуляции ситуаций , аналогичных при работе Л2-70, некоторых осциллографов, частотомеров (запрос , БСТ, ... ).

Добавлено через 32 минуты
Можно использовать 74ALS244 (ТТЛШ ) с диодами и резисторами для шины управления , так компактнее . Можно переработать меню и протокол на работу аналогично устройству 814 2...5 ...байтными сообщениями , читая состояние шины данных и шины управления одновременно для индикации в приложении , выдавая как 2 байта с ЗД перед ними и ОД после них (можно xon/xoff ,можно *-ЗД, \n -ОД) . Состояние УП, ЗО, КП , ассоциированное с передаваемым (учесть з состояния "виртуальных" переключателей ) и принимаемым байтом можно запоминать аналогично 814-му , используя 2...3- байтные сообщения ТД с ЗД в начале и ОД в конце (3...5 байтные пакеты ). Основные программы обработки состояний и эмуляции приборов разместить в программе на компьютере со сменными режимами , написанной, например, на Дельфи , VisualC# .NET . Можно приделать нестандартный драйвер (модуль) связи с RS-232 к LabView . В контроллере предусмотреть связь с фундаментальными атомарными процедурами управления , "рукопожатий" с участием DB, шины синхронизации ; управления режимом IDY, Parity Check(с участием 8 бита байта ШД ), чтения состояния шины данных и управления .

Добавлено через 3 минуты
Надстройки NI488.2 над базовыми функциями, имеющимися в NI488.1 , ГОСТ 26.003-80, учесть как дополнительные особенности некоторых атомарных процедур управления направлением, параметры подпрограмм задержки . Основные реализации функций надстроек NI488.2 обеспечить в программе , установленной на компьютере .

Добавлено через 25 секунд
Возможно , тогда понадобится ATMEGA48
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
16.07.2019, 12:07  [ТС] 37
Не очень удобно , но на пяти 74ALS245 и 7400 , транзисторах с диодами и резисторами возможно . С IDY, кажется , проблема возникает , исправить . Сведения про IDY . http://www.ni.com/pdf/manuals/373124b.pdf
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
16.07.2019, 12:40  [ТС] 38
Вариант схемы (узел управления направлением ATN,SRQ,EOI и прошивку доработать ).
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере   OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
16.07.2019, 13:33  [ТС] 39
http://www.softelectro.ru/ieee488.html
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
17.07.2019, 15:42  [ТС] 40
Вариант программы с упрощенным включением буферов (режим @ не поддерживается,
управление с помощью программы М. Терентьева из Радио 1/2010 ) . Возможно, в программе есть баги .

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
/*
 * gpib_m8a_ctl.cpp
 *
 * Created: 17.07.2019 13:04:55
 * Author : USERPC01
 */ 
 
#include <avr/io.h>
 
 
 
 
 
 
 
/*
 
OSC 7.3728 MHz , no div by 8  //fix
 
PB0  D0 (  log.1  low )  T: out; L: in
PB1  D1 (  log.1  low )  T: out; L: in
PB2  D2 (  log.1  low )  T: out; L: in 
PB3  D3 (  log.1  low )  T: out; L: in
PB4  D4 (  log.1  low )  T: out; L: in
PB5  D5 (  log.1  low )  T: out; L: in 
PC0  D6 (  log.1  low )  T: out; L: in
PC1  D7 (  log.1  low )  T: out; L: in
 
PC2  IFC (  log.1  low )  out
PC3  SRQ (  log.1  low )   in  , default   / 
PC4  ATN (  log.1  low )   out
PC5  REN (  log.1  low )   out
 
PD0 RXD MCU TTL
PD1 TXD MCU TTL
PD2  EOI (  log.1  low )  IDY=0  in / IDY=1 EOI  out , ATN=1  low and EOI =1 low 
PD3 LED HL1 out
PD4 RW out for SN74ALS245A control (1 A->B, 0 B->A )
PD5 NDAC (  log.1  low )    T: in, L: out
PD6 NRFD (  log.1  low )     T: in, L: out
PD7  DAV   (  log.1  low )     T: out; L: in
Pin1 - nReset 
 
$0 REN=0 (set REN high )
$1 REN=1 (set REN low )
$2 ATN=0 (set REN high )
$3 ATN=1 (set REN low )
$4 IFC=1 pulse (pulse IFC  low 13.2 ms )
$5 IDY=0 , turn off parallel poll   (EOI  in , ATN high)
$6 IDY=1 , turn on parallel poll   (EOI  out , ATN and EOI low )
$7 Read Data bus statement   (transmit via RS232    DIO1-DIO8  statement  byte (status))
$8 Receive byte via GPIB HS (receive  byte from GPIB with handshake  and send to UART or  send error 0x01 )
$9 Read control lines (send  byte with EOI,REN,ATN,SRQ,1,IDY, 0,0 statement)
#x Send ASCII -code via GPIB HS (Transmit byte x using handshake and send report to UART :0x03 success , 0x02 error)
 
 */
 
//proc ATMEGA8A-PU
 
#define F_CPU 7372800UL
 
 
#include  <avr/io.h> 
#include <avr/interrupt.h>
#include <util/delay.h>
 
 
 
 
 
 
#define BAUDRATE 115200
#define ubrr_1 (F_CPU /(BAUDRATE<<3))-1  // U2X=1
#define ubrr_0 (F_CPU /(BAUDRATE<<4))-1  //U2X=0
 
#define U2X_VALUE 0
#define My_UBRR_VAL    ubrr_0
 
#define Timeout1_NDAC_NRFD_high_TXHS 10
 
 
#define Timeout1_DAV_High_RXHS      10
#define Timeout2_DAV_Low_RXHS     10
#define Delay_IFC_ms 14
 
void InitPorts (void)
{
 
 
DDRB=0xff   ;    // DDRB=0b11111111    PB0-PB5   out ; PB6,PB7 osc
DDRC=0b00110111 ;  
//PC0 (D6) out, PC1 (D7) out
//PC2 (IFC) out,  PC3(SRQ) in , PC4(ATN) out, PC5(REN) out , PC6 nReset, PC7 not used
DDRD=0b10011000;
 
//  PD0,PD1 UART, 
//  PD2 (EOI) in    , PD3(HL1)  , PD4(TE) out 
//  PD5 (NDAC) in , PD6(NRFD) in, PD7 (DAV) out
 
PORTB=0xff ; // set pull-up on PB0-PB7
PORTC=0x3f ; // set pull-up on  PB0-PB5
PORTD=0xf4 ;//   PD7-PD4  high (pull-up), PD3 low (LED) , PD2  (EOI) high, PD1,PD0 low(UART)
 
}
 
/*****************************************************/
 
 
void Init_USART(void)
{
UCSRA  =(0<<U2X);// (U2X_VALUE<<U2X)  ;
UCSRB  = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC  = (1 << UCSZ1) | (1 << UCSZ0 ) ;
 
UBRRH =0x00;// (uint8_t)( (My_UBRR_VAL)>>8 ) ;
UBRRL =0x03;// (uint8_t)( (My_UBRR_VAL)&0x00FF   ) ;
 
}
 
 
 
void SendToUART( uint8_t byte_tx)
{
 while (!(UCSRA&(1<<UDRE)) ) { ; }
UDR=byte_tx;
return;
}
 
uint8_t UART_receive(void)
{
 while (!(UCSRA&(1<<RXC)) )   { ; }
return UDR;
 
}
 
 
/***************************************************/
void SetTE_High(void)
{
DDRD|= (1<<DDRD4);   //PD4(RW) output
PORTD|=(1<<PORTD4) ;     //set PD4 low RW  =1 ,output,   talker, TE=1
}
 
void SetTE_Low(void)
{
 DDRD|= (1<<DDRD4);   //PD4(RW) output
PORTD&=~(1<<PORTD4) ;     //set PD4 low RW  =0 , input ,  listener, TE=0
}
 
 
void Set_PB3_low(void)
{
DDRD|= (1<<DDRD3);
 PORTD&=~(1<<PORTD3);
}
 
void Set_PB3_high(void)
{
     
 DDRD|= (1<<DDRD3);
 PORTD|= (1<<PORTD3);
}
 
 
 
/***************************************************/
 
void Set_NRFD_Low(void)
{
PORTD&=~(1<<PORTD6); // set PD6 low (NRFD=1 NL, low ) 
}
 
void Set_NRFD_High()
{
PORTD|= (1<<PORTD7);// set PD6 high (NRFD=0 NL, high ) 
}
 
void Set_NDAC_Low( void)
{
    PORTD&=~(1<<PORTD5);
          // set PD5 low (NDAC=1 NL, low ) 
}
 
 
void Set_NDAC_High(void) 
{
PORTD |= (1<<PORTD5); // set PD5 high (NDAC=0 NL, high ) 
}
 
void SetDavHigh(void)
{
DDRD |= (1<<DDRD7);    // set PD7 (DAV) as output
PORTD|= (1<<PORTD7);    //set PD7  high
}
 
void SetDavLow()
{
    DDRD |=   (1<<DDRD7); // set PD7 (DAV) as output
    PORTD&=~(1<<PORTD7)  ; //set PD7 low
   
}
 
 
void SetDBOut()
{
DDRB=0xFF; //set DB out
DDRC|= (1<<PORTC1)|(1<<PORTC0) ;
SetTE_High();
}
 
void SetDBIn()
{
DDRB=0x00; //set DB in
DDRC&= ~((1<<PORTC1)|(1<<PORTC0) ); //PC1 (D7) input, PC0 (D6) input
PORTB=0xFF; //PB pull-up
PORTC|=(1<<PORTC1)|(1<<PORTC0);        //PC1 (D7)  , PC0 (D6)  pull-up 
SetTE_Low();  //RW(TE=0)
 
}
 
 
 
void SetNRFD_NDAC_In()
{
DDRD&=~( (1<<PORTD6)|  (1<<PORTD5)) ; //set (NDAC) as input,   set PD6(NRFD ) as input
PORTD|= (1<<PORTD6)| (1<<PORTD5) ; //set NDAC pull-up ,set PD6  NRFD  pull-up
  DDRD|=  (1<<PORTD7) ;   // set PD7 (DAV) as output
}
 
void SetNRFD_NDAC_Out()
{
                 DDRD|=(1<<DDRD5)| (1<<DDRD6);  //PD5(NDAC) as  output,  PD6(NRFD) as output
                 PORTD&=~(1<<PORTD5) ;   //set PD5 low (NDAC =1, low) 
 
                    
                 //     // set PD6 low (NRFD=1, low ) 
                 PORTD|=(1<<PORTD6); //set PD6 high (NRFD=0, high )
                   
                 DDRD&=~(1<<PORTD7);  // PD7 (DAV) as input 
                 PORTD|=(1<<PORTD7);   //PD7 pull-up (DAV)
 
                                       
}
 
 
 
/******************************************/
 
 
void Out_DAB_to_bus (uint8_t data)
{
//PC1 PC0   PB5 PB4 PB3 PB2 PB1 PB0
//D7   D6     D5    D4   D3   D2   D1    D0
 
 
PORTB=data^0xff;
PORTC =( PINC&0b11111100) | (0b00000011&(data>>6)) ;
return;
}
 
uint8_t In_DAB_from_bus()
{
//PC1 PC0   PB5 PB4 PB3 PB2 PB1 PB0
//D7   D6     D5    D4   D3   D2   D1    D0
 
uint8_t rxbyte;
                                              // get  D5-D0,
rxbyte=(PINB&0x3F)|((PINC<<6)&0b11000000) ;  //append byte 
 
return (rxbyte^0xff);
}
 
/*************************************************/
 
bool Check_NRFD_and_NDAC_high()
{   
if( (PORTD&((1<<PORTD6)|(1<<PORTD5))) ==((1<<PORTD6)|(1<<PORTD5))) 
{ return true; } else { return false;} 
}
 
 
 
void GPIB_SendByte_HS ( uint8_t  tx_byte)
 
{
 
SetDBOut(); 
SetNRFD_NDAC_In() ;
SetDavHigh();
 
 
 
     //if   NRFD =0 NL, high  and   NDAC=0 NL,  high  then error
 while (Check_NRFD_and_NDAC_high())                       
   
 {  
 _delay_ms(Timeout1_NDAC_NRFD_high_TXHS ); 
 if ( Check_NRFD_and_NDAC_high()  ) {  SetDavHigh();     SendToUART(0x03);   return;    }
    
 }
 
Out_DAB_to_bus (tx_byte);
 
//NRFD=0 NL,  High ? No -loop, yes -next 
 while (   !(PORTD&(1<<PORTD6) )  ) {  ; }
 
SetDavLow();
 
//NDAC =0 NL, High ? If not -loop, if yes -next 
 while ( ! (PORTD&(1<<PORTD5)) )     {  ; }
//if success 
  SetDavHigh();
  SendToUART(0x02);
 
 
return ; 
}
 
bool Check_DAV_LOW()
{   
    if ((PORTD&(1<<PORTD7))==0) { return true; } else { return false; }     
}
 
void SendErrorRXMSG(void)
{
     SendToUART(0x01); //send error
     Set_NDAC_Low();
    
}
 
void GPIB_Receive_byte_HS()
{
SetDBIn ();
SetNRFD_NDAC_Out();
Set_NRFD_High();
 
//check DAV low ? No - loop, Yes- next  (DAV high ? Yes - loop, No - next)
while (! Check_DAV_LOW()  ) 
{  
_delay_ms(Timeout1_DAV_High_RXHS);   
     if ( !Check_DAV_LOW() )  {  SendErrorRXMSG( );  return;  }
}
 
//set NRFD=1 NL, low
Set_NRFD_Low();
 
//accept data byte
uint8_t byte_rx;
byte_rx= In_DAB_from_bus();
 
//Set NDAC=0 NL,  high 
Set_NDAC_High();
 
//check DAV=0 NL (high)  No-loop ,  yes-next 
while (  Check_DAV_LOW()   ) 
{   
_delay_ms(Timeout2_DAV_Low_RXHS); 
if(  Check_DAV_LOW()  ) {  SendErrorRXMSG( );  return; }
 
}
 
 
 
SendToUART(byte_rx);
 
//set  NDAC=1  (  low )
Set_NDAC_Low();
//insert  turn off led  sub  here , if it is used 
 
 
 return;
 
 
}
 
void GPIB_Read_DB_Statement()
{
SetDBIn ();
SendToUART(In_DAB_from_bus());
return;
}
 
 
void GPIB_Read_control()
{
    uint8_t data_ctl;
     data_ctl=0;
     //read  , encode 
    if (PIND&(1<<PIND2)) { data_ctl|=0x80; }  //EOI
    if (PINC&(1<<PINC5)) { data_ctl|=0x40; }  //REN
    if (PINC&(1<<PINC4)) { data_ctl|=0x20; }  //ATN
    if (PINC&(1<<PINC3)) { data_ctl|=0x10; }  //SRQ
    if (PINC&(1<<PIND3)) { data_ctl|=0x08; }  //IFC
    if(  (DDRD&(1<<DDD2)) ==0 ) {data_ctl|=0x04; }      //test
            
        SendToUART(data_ctl);       
    
    
}
 
/******************************/
void  Set_REN_High()
{
PORTC |=  ~(1<<PORTC5); 
  //set REN high (0 NL)
return;
}
 
void  Set_REN_Low()
{
    PORTC &=  ~(1<<PORTC5);
  //set REN low (1 NL)
return;
}
 
 
void Set_ATN_High()
{
    PORTC |=   (1<<PORTC4);
  //set ATN high (0 NL)
return;
}
 
void Set_ATN_Low()
{
PORTC &=  ~(1<<PORTC4); 
   //set ATN low (1 NL)
 return;
}
 
 
void Send_IFC_Low_Pulse()
{
     
PORTC &=  ~(1<<PORTC2);//set IFC low (1 NL)
_delay_ms(Delay_IFC_ms);
PORTC |=   (1<<PORTC2);//set IFC low (0 NL)
return;
}
 
/***********change for circuit  ******/
void Set_EOI_gate_input(void )
{
DDRD |= (1<<DDD3); //  set PD2 (nDC) pin  as out
PORTD &=  ~(1<<PORTD3);  // 0 - EOI gate - input
 
}
 
 
void Set_EOI_gate_output(void )
{
 
DDRD |= (1<<DDD3); //set PD2 (nDC) pin  as out
PORTD |=  (1<<PORTD3);  // 1 - EOI gate -out
}
 
/***************/ 
 
//fix for your  circuit and gates 
void Set_EOI_input(void)
{
 
DDRD &= ~(1<<DDD2); //set PD2 (EOI)  as input
PORTD |=  (1<<PORTD2);   //set PD2 (EOI) pull-up
Set_EOI_gate_input();  
 
}
 
 
 
 
 
 
//fix for your  circuit and gates 
 void    Set_EOI_out_low()
 {
                   Set_EOI_gate_output();
                   
                     DDRD |= (1<<DDD2); //set PD2 (EOI ) as output
                     PORTD &= ~(1<<PORTD2);   //set EOI =1,  low
            return;  
 }
 
 
/**************************/
void Set_IDY_0()
{
 
// EOI input, ATN =0 (high) 
 
Set_EOI_input();
Set_ATN_High();
 return;
 
}
 
void Set_IDY_1()
{
// PD2 (EOI ) - output,set   EOI =1 NL ( low) and ATN=1 ( low )
  Set_EOI_out_low();
  Set_ATN_Low();
return;
}
/******************************/
 
 uint8_t arg=0;
 
 
 
 
ISR(USART_RXC_vect)
{
cli();
 
uint8_t uart_byte;
uart_byte=UART_receive();
 
 
switch(arg)
{
 
case '#' : 
             GPIB_SendByte_HS(uart_byte);
             break;
 
case '$' :   
              switch(uart_byte){
                case '0' : 
                             Set_REN_High(); //Set REN=0 NL
                             break;
                case '1' : 
                             Set_REN_Low(); //Set REN=1 NL
                             break;
               case  '2' : 
                              Set_ATN_High(); //Set ATN=0 NL, data mode 
                              break;
               case  '3' : 
                             Set_ATN_Low();  //Set ATN=1  NL , command mode 
                             break;
               case  '4' :
                             Send_IFC_Low_Pulse();  //IFC =1 pulse  ,   low , 14 ms
                             break;
               case  '5' : 
                             Set_IDY_0();   //mode IDY=0 turn off parallel polling, EOI in,  ATN out,  high , default
                             break;
               case '6' : 
                             Set_IDY_1();   //mode IDY=1 turn on parallel polling , EOI out , EOI =1(out) ,  ATN=1 (out) 
                             break;
                case '7' : 
                             GPIB_Read_DB_Statement(); // Read byte from GPIB
                             break; 
               case '8' :
                             GPIB_Receive_byte_HS();  //Receive byte    from GPIB  (HS)
                              break;
              case '9' :
                              GPIB_Read_control(); // Read control lines from GPIB 
 
              default : 
                             break;
 
             }
 
           break;
 
case 0x00:
           if(uart_byte=='#') { arg=uart_byte;   }
           if(uart_byte=='$') { arg=uart_byte;   }           
           break;
 
default :
           arg=0;   
           break; 
 
}
 
asm("sei");
 
return;
 
}
 
 
 
 
 
 
 
int main()
{
InitPorts ();
Init_USART();
asm("sei");
 
while(1) {    ; }  //loop forever , if no interrupts 
return 0;
}
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
Вложения
Тип файла: zip gpib_m8a_ctl.zip (659.4 Кб, 4 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2019, 15:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

СМА Ardo А 814, Наминал термо датчика
Доброго дня всем . пришла машина на ремонт , после , после чудо мастеров мастеров , Вобщем все...

СМА Ardo А 814, нет реверсав одну сторону
Доброго дня всем. машина СМА Ardo А 814 . Модуль DMPU J1S , пришла с проблемой не вкл. Сдох как...

Написать программу выводящую на линейку семисегментных индикаторов АЛС 318 бегущую строку
Помогите с программой: Написать программу выводящую на линейку симесигментных индикаторов АЛС 318...

СМА Ardo A-814, Не контролируется обороты отжима с помощю регулятора оборотов
Не контролируется обороты отжима с помощю регулятора оборотов постоянно отжим происходит на 800...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.