Форум программистов, компьютерный форум, киберфорум
Измерительная техника
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 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
17.07.2019, 17:19  [ТС] 41
Можно модифицировать программу .

Основные коды :

Добавлено через 1 час 30 минут
 
Универсальные однолинейные команды:
REN (ДУ)-Разрешить удалённый доступ REN=1
IFC (ОИ ) Очистка ATN=1,IFC=1 ( >100мкс.)
IDY(ИДТ)-Идентификация [REN=1, IFC=0], ATN=1 , EOI=1(out)
( IDY(ATN=1 и EOI=1) в пределах 200ns ,
результат опроса через 2мкс) .
Универсальные многолинейные команды
LLO(ЗПМ)-Блокировка локального управления [REN=1, IFC=0], ATN=1, DB=0x11
DCL(СБУ)-Сброс универсальный [REN=1, IFC=0], ATN=1, DB=0x14
PPU (ДПР) -Деконфигурация параллельного опроса [REN=1, IFC=0], ATN=1, DB=0x15
SPE(ОПО)-Разрешить последовательный опрос [REN=1, IFC=0], ATN=1, DB=0x18
SPD(ЗПО)-Запретить последовательный опрос [REN=1, IFC=0], ATN=1, DB=0x19
ADL - Адресация приёмника [REN=1, IFC=0], ATN=1, DB=0x20
UNL (НПМ) -Деадресация приёмника [REN=1, IFC=0], ATN=1, DB=0x3F
ADT - Адресация передатчика [REN=1, IFC=0], ATN=1, DB=0x40
UNT(НПД)- Деадресация передатчика [REN=1, IFC=0], ATN=1, DB=0x5F
ADE Расширенная адресация [REN=1, IFC=0], ATN=1, DB=0x60
Универсальные адресные команды:
GTL(ПНМ)-Переход в локальный режим [REN=1, IFC=0], ATN=1, DB=0x01
SDC(СБА) - Очистка выбранного устройства [REN=1, IFC=0], ATN=1, DB=0x04
PPC (КПР)- Конфигурация параллельного опроса [REN=1, IFC=0], ATN=1, DB=0x05
GET(ЗАП) - Одновременный запуск группы [REN=1, IFC=0], ATN=1, DB=0x08
TCT(ВУП)- Сделать контроллером [REN=1, IFC=0], ATN=1, DB=0x09
Вторичные команды:
PPE(ОПР)-Разрешить параллельный опрос [REN=1, IFC=0], ATN=1, DB=0x60
PPD(ЗПР)-Запретить параллельный опрос [REN=1, IFC=0], ATN=1, DB=0x70
Приборные сообщения :
в режиме [REN=1], ATN=0, DB=Byte , послежний бит-контроль четности или равен 0 (ОЛ, high)
по инструкции на прибор .
Для 814-го коды восьмеричные, для нашей схемы - шестнадцатеричные (зависит от программы и версии).
Добавлено через 4 минуты
Если тумблер ТПД на приборе включен , REN может не действовать, прибор как источник выдает данные (читать , пока не засветится КП(EOI) и появится байт конца сообщения ) .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
18.07.2019, 12:22  [ТС] 42
проблему с
C++
1
PORTB=data^0xff
можно устранить , исправив и для старших разрядов :
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
   
 
 
void Out_DAB_to_bus (uint8_t data)
{
//PC1 PC0   PB5 PB4 PB3 PB2 PB1 PB0
//D7   D6     D5    D4   D3   D2   D1    D0
 
 data=~data; 
PORTB= data ;
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 
 rxbyte=~rxbyte;
return  rxbyte  ;
}
Добавлено через 24 минуты
main.c
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
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
/*
 * gpib_m8a_ctl.cpp
 *
 * Created: 17.07.2019 13:04:55
 * Author : USERPC01
 */ 
 
 
 
 
 
 
 
 
 
/*
 
OSC 7.3728 MHz , no div by 8  //fix
LFUSE  FE    //fix CKOPT for Crystal ,7,37MHz , may be for 14..16MHz
HFUSE   D9   //fix CKOPT for Crystal, 7,37 MHz , may be for 14..16MHz
LOCK 3F // no lock 
 
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
 
 
/*
make.bat  for WinAVR-20100110
rem fix for atmega8a, if it is possible in your compiler or use atmega8 mode 
avr-gcc -Os -DF_CPU=7372800 -mmcu=atmega8  -c main.c
REM wait 1 seconds to process
SLEEP 1
avr-gcc -DF_CPU=7372800 -mmcu=atmega8  -o main.elf main.o
REM wait 1 seconds to process
SLEEP 1
avr-objcopy -O ihex main.elf main.hex
 
REM wait 1 seconds to process
SLEEP 1
REM   avrdude -P usb -b 19200 -c usbtiny -p m8 -U flash:w:main.hex
 
REM avrdude.exe -p atmega8 -c usbtiny -U flash:w:main.hex:i  
REM  avrdude.exe -p atmega8 -c usbtiny -U lfuse:w:0xFE:m
REM  avrdude.exe -p atmega8 -c usbtiny -U hfuse:w:0xD9:m
REM  avrdude.exe -p atmega8 -c usbtiny -U lock:w:0x3F :m
 
PAUSE
 
*/
 
 
 
 
 
#define F_CPU 7372800UL
 
 
#include  <avr/io.h> 
#include <avr/interrupt.h>
#include <util/delay.h>
 
 
 
 
 
#define  MCU mega8a ;
#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<<DDD4);   //PD4(RW) output
PORTD|=(1<<PORTD4) ;     //set PD4 low RW  =1 ,output,   talker, TE=1
}
 
void SetTE_Low(void)
{
 DDRD|= (1<<DDD4);   //PD4(RW) output
PORTD&=~(1<<PORTD4) ;     //set PD4 low RW  =0 , input ,  listener, TE=0
}
 
 
void Set_PB3_low(void)
{
DDRD|= (1<<DDD3);
 PORTD&=~(1<<PORTD3);
}
 
void Set_PB3_high(void)
{
     
 DDRD|= (1<<DDD3);
 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<<DDD7);    // set PD7 (DAV) as output
PORTD|= (1<<PORTD7);    //set PD7  high
}
 
void SetDavLow()
{
    DDRD |=   (1<<DDD7); // 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<<DDD5)| (1<<DDD6);  //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
 
 data=~data; 
PORTB= data ;
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 
 rxbyte=~rxbyte;
return  rxbyte  ;
}
 
/*************************************************/
 
uint8_t Check_NRFD_and_NDAC_high()
{   
if( (PORTD&((1<<PORTD6)|(1<<PORTD5))) ==((1<<PORTD6)|(1<<PORTD5))) 
{ return 1; } else { return 0;} 
}
 
 
 
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 ; 
}
 
uint8_t Check_DAV_LOW()
{   
    if ((PORTD&(1<<PORTD7))==0) { return 1; } else { return 0; }        
}
 
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;
}
Добавлено через 2 минуты
некоторые компиляторы не понимают atmega8a (для простых программ, кроме фьюзов и таблицы векторов прерываний аналогично atmega8 ) и DDRDn (писать DDDn ) .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
14.02.2020, 19:06  [ТС] 43
Некоторые соображения на тему 814 -го (пока проблема с задержкой, компаратором, четностью , связь с шиной еще не имплементована , можно через порт, мэппинг светодиодов еще некорректный ).
0
Вложения
Тип файла: zip term814gui_templ2.zip (186.7 Кб, 1 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
29.06.2020, 03:24  [ТС] 44
Для расширенных команд можно и на ATMEGA16A + транзисторы и буферы перевести .
Тренироваться пока на абстрактных акцепторах -источниках и акцепторах - приемниках .
А если к нему приделать аналог терминала Терентьева на Embarcadero free commandline tools , для эмуляции ввода и чтения последовательностей байтов для прибора "слушателя" и "говорящего" (в стиле макросов к QBASIC4.5 и строк к ним)

https://usermanual.wiki/Docume... 41488/help
https://link.springer.com/book... 42-93528-2
https://www.sm5cbw.se/instrume... d2_10E.pdf
https://usermanual.wiki/Docume... 21903/html
https://cdn.rohde-schwarz.com.... NRT_9D.pdf
http://www.zahnarzt-adler.de/nlq/ajni2src.txt


?
0
Вложения
Тип файла: zip R&S CMT 52Operating .zip (8.05 Мб, 0 просмотров)
Тип файла: zip example900118.zip (87.6 Кб, 0 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
29.06.2020, 03:37  [ТС] 45
Схема еще не доработана, с багами , не использовать ее пока, вентили дефицитные и устарели , MC3448A Motorola тоже .

Добавлено через 1 минуту
Терентьев (из Ульяновска) где-то в интернете исходники на Дельфи выкладывал , но пока их нет .

Добавлено через 8 минут
(в стиле макросов к QBASIC4.5 и строк к ним)
в смысле, макросов IECIN0," ... " , IECOUT0 , " ... " и других и их современных аналогов
IECIN(str), IECOUT(str) из example900118.zip с QBDECL.BAS, QBIB.OBJ .

https://forums.ni.com/t5/Examp... anguage=en

Такие карты в PCI-E -условиях уже почти не используются.
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
29.06.2020, 05:26  [ТС] 46
Со стороны акцептора (способного быть источником и приемником; не со стороны нашего контроллера ) микросхемы MC3448A могут сопрягаться с контроллером I8291 и шиной IEC625/GPIB/NI488 следующим образом (например, как в приборе Rohde&Schwarz )
0
Миниатюры
OpenSource  аналог   АЛС  КОП  814 на микроконтроллере  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2020, 05:26

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

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

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

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

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


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

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

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