Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/57: Рейтинг темы: голосов - 57, средняя оценка - 4.63
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536

Доработка программатора MAVR для работы с W27 С 512-45Z

26.10.2019, 11:26. Показов 14046. Ответов 136
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как доработать файлы aMAVR1 программатора Ковлева MAVR и схему для работы с W27С512-45Z , добавив режим стирания ЭРПЗУ , W27С512-45Z , режим работы с другими ПЗУ серии 27Cxxx ,28Cxxx , 29Cxxx? Можно убрать поддержку 24Сxx.Как переделать на Лазарус программу и обеспечить устойчивый обмен данными по (виртуальному) UART-порту на 115200 бод 8-N-2 ?
Есть ли у кого - то готовые решения? Если что, потом допишу свои варианты и соображения на эту тему .

Есть ли у кого -то программы на лазарусе для обмена данными по UART с двухпоточностью (фоновый прием при передаче ) на 115200 бод 8-N-2 ? Можно и аналогично хайасмовскому сделать с "мультитредс ".

Добавлено через 1 минуту
Кажется, "глюкнул " браузер , удалить копию темы с таким же названием , плохо вводилось название микросхемы в заголовке при редактировании
Вложения
Тип файла: zip aMAVR1_fixed_read27_1.zip (317.9 Кб, 70 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2019, 11:26
Ответы с готовыми решениями:

Библиотека или функция для работы с SHA-512
Нужна библиотека или функция с помощью которой я смогу зашифровать строку в SHA-512

Доработка программы для работы с классами
прикрепил проект, помогите плз доработать программу, там пару ошибок связанные с классами + нужно отсортировать список с помощью лямбда...

Доработка модуля проекта Аксесс 2003 (отбирающего все записи, находящиеся в форме) для работы с MySQL для
Форумчане, доброго времени суток! Была разделенная БД Формы, запросы, отчеты Аксесс2003- таблицыАксесс2003. Таблицы перенес на MySQL,...

136
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
01.11.2019, 04:01  [ТС]
Студворк — интернет-сервис помощи студентам
Пока питание не включает , пишет received 6 bytes , фиксать баги .

Добавлено через 3 часа 16 минут
Пробные варианты с разным количеством стоп-битов (1, 2) . С 24хх пока странно работает .

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
PortInit:
    ;Исходное состояние PORTA=0, PORTB,PORTC,PORTD=255
    ldi     temp0,0xFF
    out     DDRA, temp0     ;ПортА на вывод
    out     DDRB, temp0     ;ПортВ на вывод
    out     DDRC, temp0     ;ПортC на вывод
    out     DDRD, temp0     ;ПортD на вывод
    ldi     temp0,0x0
    out     PORTA, temp0    ;Снимаем напр. с ПортА 
    out     PORTC, temp0    ;Снимаем напр. с ПортС 
    out     PORTB, temp0    ;Снимаем напр. с ПортВ
    ldi     temp0, 0b11000000
    out     PORTD, temp0
 
    cbi     PORTD, OE  ; turn off Vpp
    sbi     PORTD, NOE ; turn off Vpp
    sbi     PORTD, PWR ; turn off Vcc ic
    cbi     PORTD, CE ;fix  safe level without Vcc ic
    
    ;настройка последовательного порта 
;   ldi     temp0,0b00011000    ; прерывания выключены, 8 бит
;   out     UCR,temp0
    ldi     temp0, (1<<RXEN)|(1<<TXEN)
    out     UCSRB,temp0
    ; Set frame format: 8data,     ;    (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1)  8- N- 2
    ldi     temp0, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)   ; 8-n-1
    out     UCSRC,temp0
 
    clr     temp0
    out     UBRRH,temp0     ; скорость передачи (115200 бод)
    ldi     temp0, InitBaudRate
    out     UBRRL,temp0     ; скорость передачи (115200 бод)
    ret
Теперь можно выбирать удобную скорость

Добавлено через 23 секунды
С 2 стопбитами может устойчивее работать
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
01.11.2019, 22:04  [ТС]
С

C++
1
 WriteFile(file, DAT, (DWORD)  lpSize, &bc, NULL);

пишет
Code
1
 Unreachable code in function prwReadAll(unsigned char)
пробовать
C++
1
WriteFile(file,  DAT , (DWORD)  lpSize,  NULL, NULL);
С портом &bc нужно .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 20:31  [ТС]
Переделал , убрал ненужные модули , немного переименовал подпрограммы и модули . Читает, но нужно добавить подпрограмму обработки стирания ЭСППЗУ W27512

Для BCC102 (<iostream.h> - > <iostream > )

C++
1
2
//#include <iostream.h>  //fix  
#include <iostream >
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rem Файл make_gui.bat
 
rem объявление переменных
path C:\Borland\BCC102\bin;%path%
set include=C:\Borland\BCC102\include\windows\sdk
set lib=C:\Borland\BCC102\lib
 
set app=textbox1
 
if exist %appp%.exe del %app%.exe
if exist %appp%.obj del %app%.obj
if exist %appp%.res del %app%.res
 
if not exist %app%.rc goto compile
brc32x.exe -r %app%.rc > errres.txt
:compile
rem запуск компилятора
bcc32x.exe -tW -I%include% -L%lib% %app%.cpp > errout.txt
 
pause 0
Assembler
1
2
   // ldi   temp0,    (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8 data, 2 stop bit 
   ldi  temp0, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8data, 1 stop bit

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
/*
#define PBS_MARQUEE  8
#define PBM_SETMARQUEE WM_USER + 10
 
*/
 
  
 
/*
#define PBM_SETRANGE 0xF0A0 
 #define PBM_SETSTEP 0xF0A1
#define PBM_SETPOS   0xF0A2
#define PBM_DELTAPOS   0xF0A3
#define PBM_STEPIT   0xF0A4
*/
 
 
...
 dcb->BaudRate = lpSpeed;   //115200 bd
//dcb->StopBits = TWOSTOPBITS; //2 stopbits
 
 dcb->StopBits = ONESTOPBIT;  //  for 1 stopbit 
 
...
Code
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
./iosubs27.h:29:20: warning: conversion from string literal to 'LPSTR' (aka 'char *') is deprecated
      [-Wdeprecated-writable-strings]
LPSTR lpProjName = "Parallel  Read/Write";
 
./iosubs27.h:270:15: warning: conversion from string literal to 'LPSTR' (aka 'char *') is deprecated
      [-Wdeprecated-writable-strings]
                lpDevName = "COM1";
 
 
./iosubs27.h:655:74: warning: format specifies type 'unsigned int' but the argument has type 'long' [-Wformat]
                                 { sprintf(tszMsg,  "IC CS: %x \nBuffer CS: %x \nCS Mismatch " , sm, c); }
                                                                            ~~                       ^
./iosubs27.h:1017:43: warning: format specifies type 'int' but the argument has type 'DWORD' (aka 'unsigned long')
      [-Wformat]
                        sprintf(tszMsg,  "Received: %d bytes", bc);
                                                    ~~         ^~
                                                    %lu
In file included from textbox1.cpp:4:
./macros27.h:81:30: warning: conversion from string literal to 'LPSTR' (aka 'char *') is deprecated
      [-Wdeprecated-writable-strings]
                if (lRes==0) { lpDevName = "COM1"; }
                                           ^
./macros27.h:82:36: warning: conversion from string literal to 'LPSTR' (aka 'char *') is deprecated
      [-Wdeprecated-writable-strings]
                else if (lRes==1)  { lpDevName = "COM2"; }
Добавлено через 1 час 11 минут
Для устранения ошибок в некоторых местах программы c sprintf добавить приведение типов к int , LPSTR , unsigned int ,


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
void ReadConfig(HWND Dlg)
{
     
 
    
     
 
                char  StrTmp[]  =  "COM1";
     int ComNum=0;
                 lpDevName =(LPSTR) StrTmp;
                    
                   
    if (strcmp(StrTmp,"COM1")==0)
    {
        ComNum=0;
        lpDevName = (LPSTR)"COM1";
    }
    else if (strcmp(StrTmp,"COM2")==0)
    {
        ComNum=1;
        lpDevName =(LPSTR) "COM2";
    }
    else if (strcmp(StrTmp,"COM3")==0)
    {
        ComNum=2;
        lpDevName =(LPSTR) "COM3";
    }
    else if (strcmp(StrTmp,"COM4")==0)
    {
        ComNum=3;
        lpDevName = (LPSTR)"COM4";
    }
 
    else if (strcmp(StrTmp,"COM5")==0)
    {
         
        
        
        ComNum=4;
                                    lpDevName =(LPSTR) "COM5";
    }
                  else if (strcmp(StrTmp,"COM6")==0)
    {
         
         
        
        ComNum=5;
                                    lpDevName = (LPSTR)"COM6";
    }
                  else if (strcmp(StrTmp,"COM7")==0)
    {
         
         ComNum=6;
        lpDevName =(LPSTR) "COM7";
        
    }
                   else if (strcmp(StrTmp,"COM8")==0)
    {
         ComNum=7;
         
        lpDevName =(LPSTR) "COM8";
        
    }
                   else if (strcmp(StrTmp,"COM1")==0)
    {
         ComNum=8;
         
        lpDevName =(LPSTR) "COM9";
        
    }
                 else if (strcmp(StrTmp,"COM1")==0)
    {
         
         ComNum=9;
        lpDevName =(LPSTR) "COM10";
        
    }
                 else
     
         MessageBox(Dlg,"Error GetCurSel","Error",MB_OK);
 
 
         
     
 
    if (SendDlgItemMessage(Dlg, IDC_PORTNUM, CB_SETCURSEL, (WPARAM) ComNum, 0) == CB_ERR)
        MessageBox(Dlg,  "Error SetCurSel - PORTNUM" , "Error" ,MB_OK);
 
 
 
 
 
}
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 20:37  [ТС]
Вариант с измененными модулями под Embarcadero free commandline tools BC102 https://www.embarcadero.com/free-tools/ccompiler
( добавить обработчик стирания флэшек , выбрать количество стопбитов )
Вложения
Тип файла: zip test__8_N_1.zip (144.1 Кб, 12 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 21:30  [ТС]
Пока испытывать виртуально (без ПЗУ), с нуль-модемным кабелем, терминалом, доработать прошивку на предмет программы проверки чистоты микросхемы после стирания .

Добавлено через 6 минут
Собрать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//void prwW27C512DoClear( )
void prwW27C512_Erase( )
 
 {
//byte0 command 0x78
//byte1  ADDR_HI , определиться
//byte2 ADDR_LOW   , определиться
//byte3  VAL  , определиться
//byte4 ADR  , определиться 
 
 
 
 
...
 
//определиться с таймаутами между командой  и чтением результата 
}
из

C++
1
 void prwIsClear(byte Cmd)
, использовав команду 0x78 в качестве первого бита, доработать прошивку и хард , изменив первый байт , оптимизировав подпрограмму. Можно изменить прошивку и делать проверку на чистоту отдельно от стирания ,
изменив прошивку .

Добавлено через 13 минут
Пробовать как-то по аналогии , под него переделать

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
.equ W27C512_CompSID= 0xDA
.equ W27C512_DevSID =0x08
 
.equ W27C512_HiAdrId0= 0x00 
.equ W27C512_LowAdrId0 =0x00 
.equ W27C512_HiAdrId1= 0x00 
.equ W27C512_LowAdrId1 = 0x01
 
;Skip if not Winbond vendor, product
W27_CheckWinBond:
                             cbi        PORTD, PWR ; Vcc=5V  ; fix
                             sbi        PORTD, CE    ;  nCE=1
                             cbi        PORTD, OE    ; turn off +12V  on nOE/Vpp 
                             sbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             ldi YH ,W27C512_HiAdrId0;
                             ldi YL ,W27C512_LowAdrId0;
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t   
                             ldi        temp0, 0
               out      DDRA, temp0     ;ПортА in
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     temp0, PINA     ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
               cpi   temp0, W27C512_CompSID
               brne   W27_EraseSubSID_error
 
                ldi YH ,W27C512_HiAdrId1;
                             ldi YL ,W27C512_LowAdrId1;
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t   
                             ldi        temp0, 0
               out      DDRA, temp0     ;ПортА in
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     temp0, PINA     ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
                             cpi     temp0, W27C512_DevSID
                             brne   W27_EraseSubSID_error  
                             rjmp   W27_OKEraseSub
 
 
W27_EraseSubSID_error:
                             sbi        PORTD, PWR ; Vcc=5V
                             cbi        PORTD, CE    ;  nCE=1
                             cbi        PORTD, OE    ; turn off +14V  on nOE/Vpp 
                             cbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             clr        temp0
               out      DDRA, temp0
                             out        PORTA, temp0    ;выставляем данные 0xFF  
                             out        PORTB, temp0     
               out      PORTC, temp0
 
                           rjmp NotClear27
                         
                          ; ret
 
 
 
W27_EraseSub:
                             
                             rjmp W27_CheckWinBond
                            ; ret
 
W27_OKEraseSub:
 
 
 
                             cbi        PORTD, PWR ; Vcc=5V
                             sbi        PORTD, CE    ;  nCE=1
                             sbi        PORTD, OE    ; turn off +14V  on nOE/Vpp 
                             sbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             ldi        temp0, 0x00
               out      DDRA, temp0
                              
                           
 
                             clr        YH
               clr      YL
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t  
                             ldi        temp0, 0xff
               out      DDRA, temp0     ;ПортА out
                             ldi                     temp0, 0xff
                             out        PORTA, temp0    ;выставляем данные 0xFF
 
 
                             rcall  Del_10t
               rcall    Del_10t 
                             rcall  Del_10t
               rcall    Del_10t
                              
                             cbi        PORTD, CE
                             rcall  Del_100mks  ; pulse nCE=0 100us
                             sbi        PORTD, CE   
                             rcall  Del_10t 
                             cbi        PORTD, Vpe   ; turn off Vpe
                             rcall  Del_10t
                             cbi        PORTD,  OE   ; turn off Vpe
                             rcall  Del_10t
 
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     VAL, PINA       ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
  
                               rcall  W27_IsClearAfterErase
                            
                              ret
 
 
 
 W27_IsClearAfterErase:
 
                   cbi      PORTD, Vpe ;turn off +14V
    cbi     PORTD, OE  ;turn off +12V                
                  cbi       PORTD, PWR ; Vcc=5V 
                  sbi       PORTD, CE     
 
    ldi     XH, 0xff     ;    ;кладем в пару XH:XL максимальный размер м.сх
    ldi     XL,  0xff ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
W27_ICNext27_Erase :        ; reading 
                  sbi       PORTD, CE  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, CE  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, CE 
 
    cpi  temp0, 0xFF
    brne    W27_NotClear27_Erase    
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    W27_ICNext27_Erase 
    ldi  temp2, 0x43    ;   clear 
 
W27_ICEnd27_Erase :
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret 
 
                    ;выход
W27_NotClear27_Erase :
    ldi             temp2, 0x44  //not clear
    rjmp    W27_ICEnd27_Erase
Добавлено через 2 минуты
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
;PortA
.equ    iDir    = DDRC
.equ    iOut    = PORTC
.equ    iIn     = PINC
.equ    SDA     = 4
.equ    SCL     = 3
;PortD
.equ    PWR     = 7
.equ    CE      = 4
.equ    Vpe     = 5     ; 
.equ    OE      = 6     ;
;Комманды устройству от хоста
.equ    CMD_SENDID           =0x69
.equ    CMD_POWER            =0x50
 
.equ    CMD_AT24READPAGEBIG      =0x53
.equ    CMD_AT24WRITEBUFFERBIG   =0x01
.equ    CMD_AT24ISCLEARBIG       =0x3F
.equ    CMD_AT24READPAGESMALL    =0x54
.equ    CMD_AT24WRITEBUFFERSMALL =0x02
.equ    CMD_AT24GETCSBIG         =0x4B
.equ    CMD_AT24GETCSSMALL       =0x4A
.equ    CMD_AT24ISCLEARSMALL     =0x3E
 
.equ    CMD_AT27READPAGE         =0x72 ; 'r'
.equ    CMD_AT27GETCS            =0x4C; 'L'
.equ    CMD_AT27ISCLEAR           =0x2F;
.equ    CMD_AT27WRITEBUFFER      =0x77 ; 'w'
 
.equ    CMD_W27READPAGE          = 0x52;   'R'
.equ    CMD_W27GETCS             =0x6C ;  'l'
.equ    CMD_W27ISCLEAR           = 0x6E;  'n'
.equ    CMD_W27WRITEBUFFER       = 0x70 ; 'p'
.equ    CMD_W27ERASESUB          = 0x78 ; 'x'
...
 
.macro  jmpeq
    cpi     @0, @1
    brne    PC+2
    rjmp    @2
.endmacro
 
    .dseg
    .org    0x60
 
...
;Main program
Main:
    rcall   GetChar
    mov     CMD, temp0
    rcall   GetChar
    mov     ADDR_HI, temp0
    rcall   GetChar
    mov     ADDR_LOW, temp0
    rcall   GetChar
    mov     VAL, temp0
    rcall   GetChar
    mov     ADR, temp0
                  rjmp Menu
 
//.include "AT24support.asm"
 
 
 
 
Menu:                  
    ;Разбираем, что за команда пришла
 
    jmpeq   CMD, CMD_SENDID, SendDeviceID
    jmpeq   CMD, CMD_POWER, Power
    ; rcall         AT24_MenuCMD
    jmpeq   CMD, CMD_AT27READPAGE, DoAT27ReadPage
    jmpeq   CMD, CMD_AT27GETCS, DoAT27GetCS
    jmpeq   CMD, CMD_AT27ISCLEAR,  DoAT27IsClear
    jmpeq   CMD, CMD_AT27WRITEBUFFER, DoAt27WriteBuffer
 
     jmpeq  CMD, CMD_W27READPAGE  , DoW27ReadPage 
     jmpeq  CMD, CMD_W27GETCS  ,  DoW27GetCS
     jmpeq  CMD, CMD_W27ISCLEAR  ,  DoW27IsClear                
     jmpeq  CMD,  CMD_W27WRITEBUFFER, DoW27WriteBuffer    
     jmpeq  CMD,  CMD_W27ERASESUB ,DoW27EraseSub
 
 
 
    rjmp    UnknownCommand
 
 
 
 
...
 
...
;--------------------------------------------------------------------------
DoAT27WriteBuffer:
    ldi     cntL, 32
    rcall   LoadInBuffer
    rcall   At27WriteBuffer
    rjmp    Main
 
;***********************************
 
 
DoW27ReadPage:  
    cbi     PORTD, Vpe ;turn off +12V
    cbi     PORTD, OE  ;turn off +12V   
    cbi     PORTD, PWR ;turn on PWR
    sbi     PORTD, CE ; 
 
  
    rcall   W27_ReadPage
    rjmp    Main
;--------------------------------------------------------------------------
DoW27GetCS:  
    cbi     PORTD, Vpe ;turn off +12V
    cbi     PORTD, OE  ;turn off +12V   
    cbi     PORTD, PWR ;turn on PWR
    sbi     PORTD, CE ; 
     
     
    rcall   W27_GetCS
    rjmp    Main
;--------------------------------------------------------------------------
DoW27IsClear:  
    cbi     PORTD, Vpe ;turn off +12V
    cbi     PORTD, OE  ;turn off +12V   
    cbi     PORTD, PWR ;turn on PWR
    sbi     PORTD, CE ; 
    
    rcall   W27_IsClear
    rjmp    Main
;--------------------------------------------------------------------------
DoW27WriteBuffer:  
    cbi     PORTD, Vpe ;turn off +12V
    cbi     PORTD, OE  ;turn off +12V   
    cbi     PORTD, PWR ;turn on PWR
    sbi     PORTD, CE ; 
     
    ldi cntL, 32
     
    rcall   LoadInBuffer
 
    rcall   W27_WriteBuffer
    rjmp    Main
 
DoW27EraseSub:
    
     ;ldi    cntL, 32
    ; rcall LoadInBuffer
    rcall   W27_EraseSub
    rjmp    Main
 
 
 
 
 
 
 
 
 
 
 
;-----------------------------------------------------------------
DeviceID:
    .db     "Master AVR v.0.7 W27"
DeviceIDEnd:
;-----------------------------------------------------------------
 
;.include "At24.asm"
.include "At27.asm"
.include "W27.asm"
Добавлено через 3 минуты
W27512 : 65536 cells *8bit (0...65535 , 8bit out )

0 -0x0000 hex
65535 dec = 0xffff hex

Добавлено через 11 минут
Добавить в iosubs27.h

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
 
void prwW27C512Erase( )
{
//byte0 command 0x78
//byte1  ADDR_HI, not used
//byte2 ADDR_LOW  
//byte3  VAL 
//byte4 ADR  
lpSize=65536;//for W27C512
    HANDLE port;
    DWORD bc;
    HWND Dlg = (HWND) GetActiveWindow();
    byte comm[5]={0x78, 0x00, 0x00, 0x00, 0xa0};
    byte answ[4]={0x00, 0x00, 0x00, 0x00};
     
    port=CreateFile(lpDevName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(port==INVALID_HANDLE_VALUE) 
    {
        MessageBox(Dlg, "Could not open port","Erasing W27C512 ",MB_OK);
        goto Ex;
    }
                       
    SetDlgItemText(Dlg, IDC_STATUS, "COM port was opened successfull !");
                  UpdateWindow(Dlg);
    if (!Power(port, 1))      MessageBox(Dlg, "Power supply error !","Erasing W27C512 ", MB_OK);
    PortInit(port);
     
     
    comm[4] = 0xa0 | 0x00| 0x00;
 
    comm[0]=Cmd;
    comm[1]=lpSize/256;
    comm[2]=lpSize%256;
 
    WriteFile(port, comm, 5, &bc, NULL);
 
//delay?
 
 
    ReadFile(port, answ, 4, &bc, NULL);
        if (bc==0)
        {
            MessageBox(Dlg, "Device not reply ","Erasing W27C512 ", MB_OK);
            Power(port, 0);
            goto Ex;
        }
        else if (bc==4)
        {
            if (answ[0] == 0x43)
            {
                Power(port, 0); 
                                                                          
                SetDlgItemText(Dlg, IDC_STATUS, "Port was closed");
                MessageBox(Dlg,  "IC is clear. Ok  " , "Erasing W27C512 ", MB_OK);
                goto Ex;
            }
            else if (answ[0] == 0x44)
            {
                TCHAR   tszMsg[32];
                int Ad = (answ[1]<<8) + answ[2];
                 sprintf(tszMsg,"IC is not clear: %x - %x", Ad, answ[3]);
                Power(port, 0);
                                                                         
                 SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed " );
                MessageBox(Dlg, tszMsg, "Erasing W27C512 ",MB_OK);
                goto Ex;
            }
            else
            {
                Power(port, 0);
                                                                        
                 SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed " );
                MessageBox(Dlg,  "Answer error !" , "Erasing W27C512 ", MB_OK);
                goto Ex;
            }
        }
        else if ((bc==3) && answ[0]==0x55 && answ[1]==0x55 && answ[2]==0x55)
        {
            Power(port, 0);
                                                       
             SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed" );
            MessageBox(Dlg, "Reading error ", "Erasing W27C512 ",MB_OK);
            goto Ex;
        }
        else
        {
            TCHAR   tszMsg[32];
             sprintf(tszMsg, "Received: %d byte(s) " , (int)bc);
            Power(port, 0);
             SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed" );
                                                      
            MessageBox(Dlg, tszMsg,"Erasing W27C512 ",MB_OK);
            goto Ex;
        }
Ex:;
  if (port != INVALID_HANDLE_VALUE) { CloseHandle(port); }
     SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed " );
                    UpdateWindow(Dlg);
                    
}
и прописать в классе обработки кнопок реакцию на нее при выборе Винбондовской микросхемы .

Добавлено через 1 минуту
Подумать , нужно ли

C++
1
comm[4] = 0xa0 | 0x00| 0x00;
,
может 0x00 записать в него (последовательные 24хх мы здесь не используем ) ?
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 21:45  [ТС]
Пробная версия:
питание чипа 5В включается нулем на PD7 , выключается подтяжкой к единице (5В),
управление OE PD6 1 включает +12В на nOE , 0 выключает (Vpe=0 , программирование ) , 14В на nOE
при стирании ,
управление Vpe - PD5 1 включает +12В Vpe (идентификация), 0 выключает , 1 на PD6 и 1 на PD5 включает 14 В стирания на A9, nOE .
С 3,75 В пока проблема .
Вложения
Тип файла: zip aMAVR1_w27_8_N_1preview.zip (289.4 Кб, 11 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 22:29  [ТС]
С бодностью и стопбитами доработать

Добавлено через 14 минут
При записи буфера в обычную 27512 (без ИМС ) сбоит .Что -то с типами в подпрограмме записи .

Добавлено через 27 минут
Обнулить i,j,k надо перед циклом (и для W27-й тоже, до этого их обнуляли, но компилятор ругался, что они предзаданы в начале и не не нужны ):

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
void prwWriteBuffer(byte Cmd)
{
 
     
    int i  , j  , k ,  m ;
    DWORD bc=0;  
    HANDLE port=INVALID_HANDLE_VALUE;
    byte SEG[32];
    byte comm[5]={0x77, 0x00, 0x00, 0x00, 0xa0};
    byte answ[2]={0x00, 0x00};
    int MaxB =(int) ( lpSize / 32); //размер записываемого - 32 байт
                  comm[0]=Cmd;    
                     HWND Dlg = (HWND) GetActiveWindow();
 
     SendDlgItemMessage(Dlg, IDC_PB, PBM_SETRANGE, 0, (LPARAM) MAKELPARAM (0, MaxB));
 
    if (MessageBox(Dlg, "Write buffer to IC 27xxx ?", "Write ", MB_YESNO) == IDNO)
        goto Ex;
 
    port=CreateFile(lpDevName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(port==INVALID_HANDLE_VALUE) 
    {
        MessageBox(Dlg, "Could not open port","Error",MB_OK);
        goto Ex;
    }
 
    SetDlgItemText(Dlg, IDC_STATUS,  "Port was opened successful" );
                  UpdateWindow(Dlg);
    if (!Power(port, 1))   MessageBox(Dlg, "Power supply error !", "Writing to 27512", MB_OK);
 
    PortInit(port);
//add 
                i=0;
                j=0;
                k=0;
L1:;
   for (m=0; m<65536; i=j*2, m++ ) {};
    comm[1]=(byte)(j/256);
    comm[2]=(byte)(j%256);
 
    for (i=j, k=0; k<32; SEG[k]=DAT[i],  i++, k++) {};
    WriteFile(port, comm, 5, &bc, NULL);
    WriteFile(port, SEG, 32, &bc, NULL);
    
    ReadFile(port, answ, 2, &bc, NULL);
        if (bc==0)
        {
            MessageBox(Dlg, "Device not reply ","Error",MB_OK);
            Power(port, 0);
            goto Ex;
        }
        else if (bc==2)
        {
            if (answ[0] == 0x00 && answ[1] == 0x00)
            {
                PurgeComm(port, PURGE_TXCLEAR|PURGE_RXCLEAR);
                if (j<(MaxB-1)*32)
                {
                    j += 32;
                                                                                                   
                     SendDlgItemMessage(Dlg, IDC_PB, PBM_SETPOS, (int )(j/32), 0);
                    goto L1;
                }
                else
                { 
                                                                                              
                     SendDlgItemMessage(Dlg, IDC_PB, PBM_SETPOS, 0, 0);
                    Power(port, 0);
                    goto Ex;
                }
            }
            else if (answ[0] == 0x77 && answ[1] == 0x77)
            {
                Power(port, 0);
                MessageBox(Dlg, "Writing error !", "Writing 27C512",MB_OK);
                goto Ex;
            }
            else
            {
                Power(port, 0);
                MessageBox(Dlg,  "Answer error !", "Writing 27C512", MB_OK);
                goto Ex;
            }
        }
        else
        {
            TCHAR   tszMsg[40];
            sprintf(tszMsg,  "Received: %d bytes",(int) bc);
            Power(port, 0);
             MessageBox(Dlg, tszMsg,"Writing 27C512  ",MB_OK);
            goto Ex;
        }
    Edited = false;
Ex:;
    if (port != INVALID_HANDLE_VALUE)
        CloseHandle(port);
    SetDlgItemText(Dlg, IDC_STATUS,  "Port was closed" );
                UpdateWindow(Dlg);
 
}
Добавлено через 29 секунд
Еще с приведенными типами проверить .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 22:42  [ТС]
С исправлением инициализации в программе записи
Вложения
Тип файла: zip aMAVR1_w27_8_N_1fixed_Write.zip (145.4 Кб, 12 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 22:44  [ТС]
Является модифицированным аналогом программы Ковлева , но на альтернативном языке , хард и прошивка немного модифицированы. Прошивку уточню.
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
02.11.2019, 23:36  [ТС]
Типовые виды алгоритмов прошивки УФ ПЗУ и их аналогов показаны в аттаче (на основе сайтов про программатор Uniprog, http://www.microart.ru/Uniprog/page_uniprog.htm ) .

У нас аналог алгоритма, обозначенного на рисунке как С3 .
Для 573РФ2(M2716),РФ6, M2764, M27128, M27256 используются другие алгоритмы
и адаптеры, другое напряжение питания. Требуется другая схема и прошивка .

Можно сделать аналог на основе ATMEGA48/ATMEGA8А+ битвайсовая эмуляция SPI для 74HC595/74HC597 для чтения данных , чтения и записи данных + пины управления, добавить их в список, в том числе с побитным программированием 556РТ7 с токовыми ключами . Редактор может быть аналогичным .
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z  

0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
03.11.2019, 02:30  [ТС]
Для некоторых микросхем напряжение программирования +5В, для некоторых нужно еще напряжением питания управлять .

Добавлено через 54 минуты
Для поддержки других чипов можно ввести (в том числе на случай совместимого по системе команд программатора) следующие команды

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 ; is clear  0x2F (default )
 ; get checksum 0x4C (default,with params )
 ; read parlallel 0x72 , address 
 ; 0x77 -write  27C512, C3
 ; 0x70 -write W27C512, C3, hard fix 
 ; 0x84 -write M2732,C3
 
 ; 0x82 -write M27256, C2
 
 
; 0x88  write M27128,C1
; 0x86  write M2764, C1
 
; 0x81 , 2716 , C0
 
; 0x80 , 2708 , C00
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
void prwWriteBufferC00(byte Cmd)
{
 
//0x80 , 2708 , C00
HWND Dlg = (HWND) GetActiveWindow();
MessageBox(Dlg, " Not implemented ","Error",MB_OK);
return ;
    
}
 
void prwWriteBufferC0(byte Cmd)
{
 
//0x81 , 2716 , C0
HWND Dlg = (HWND) GetActiveWindow();
MessageBox(Dlg, " Not implemented ","Error",MB_OK);
return ;
    
}
 
 
void prwWriteBufferC1(byte Cmd)
{
//0x88  27128,C1
//0x86 2764, C1
 
HWND Dlg = (HWND) GetActiveWindow();
MessageBox(Dlg, " Not implemented ","Error",MB_OK);
return ;
    
}
 
void prwWriteBufferC2(byte Cmd)
{
//0x82 27256 , C2
 
HWND Dlg = (HWND) GetActiveWindow();
MessageBox(Dlg, " Not implemented ","Error",MB_OK);
return ;
    
}
 
void prwWriteBufferC3(byte Cmd)
{
 // 0x77 -27C512
 // 0x70 -W27C512
 // 0x84  2732
     ...
 
}
Добавлено через 1 минуту
Можно ввести индикацию типа харда и алгоритма .

Добавлено через 20 минут
Некоторые особенности доработки программы для аналогов схемы с другим хардом , системой команд на основе аналога формата программатора Ковлева MAVR с доработкам

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
void CPRWDlg::OnSelchangeSize() 
{
    long lRes;
              HWND Dlg = (HWND) GetActiveWindow();
                lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0);   
                 lpSize = 65536;
    if (lRes != CB_ERR)
    {
        if (lRes == 0)          {   lpSize = 65536;  AlgMode =0x03 ;         }   //27512                          
        else if (lRes == 1)    { lpSize = 65536;  AlgMode =0x13 ; }  //W27512
             else if (lRes == 2)    { lpSize = 32768;  AlgMode =0x02 ; }  //M27256 
                  else if (lRes == 3)    { lpSize =16384;   AlgMode=0x01 ; }  //M27128  
         else if (lRes == 4)    { lpSize =8192;  AlgMode=0x01 ;}  //M2764
                  else if (lRes == 5)    { lpSize =4096;  AlgMode=0x03 ; }  //M2732 
                 else if (lRes == 6)    { lpSize =2048; AlgMode=0x00 ;  }  //M2716
                  else if (lRes == 7)    { lpSize =1024;  AlgMode=0xF0; }  //M2708 
             
        else
            MessageBox( Dlg, "Error GetCurSel","Message ", MB_OK);
    }
 
 
    else
                      MessageBox(Dlg, "Error GetCurSel", "Message", MB_OK);
                          
 
                SendDlgItemMessage(Dlg, IDC_CLEARALL, WM_ENABLE, (WPARAM) false, NULL);
    
 
     SetClearRgn(0, lpSize-1, Dlg);
    memset(&DAT,0xFF, 65536);
    FillBuff(Dlg) ;
}
 
 
 /************************************************/
 
void CPRWDlg::OnReadall( ) 
{
     long lRes;
                   HWND Dlg = (HWND) GetActiveWindow();
                    lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0);     
     if (lRes != CB_ERR)
     {
 
                                    if (lRes == 0)            {    prwReadAll(0x72);  }  //27512                          
        else if (lRes == 1)    {    prwReadAll(0x52);  }  //W27512  //or use 0x72
        else if (lRes == 2)    {    prwReadAll(0x72);  } //27256    
                                    else if (lRes == 3)    {    prwReadAll(0x72);  } //27128
        else if (lRes == 4)    {    prwReadAll(0x72);  } //2764
                                    else if (lRes == 5)    {    prwReadAll(0x72);  } //2732
                                    else if (lRes == 6)    {    prwReadAll(0x72);  } //2716
                                    else if (lRes == 7)    {    prwReadAll(0x72);  } //2708              
                 
        else MessageBox(Dlg,"Error GetCurSel", lpProjName, MB_OK);
     }
     else MessageBox(Dlg,"Error GetCurSel", lpProjName, MB_OK);
     SaveBuffer();
     FillBuff( Dlg);
}
 
 
void CPRWDlg::OnWritebuff() 
{
 
HWND Dlg = (HWND) GetActiveWindow();
 
    long lRes;
    
                 lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0);
    if (lRes != CB_ERR)
    {
 
                                     if (lRes == 0) {          prwWriteBufferC3(0x77);   }  // 27C512 12V 
        else if (lRes == 1) {    prwWriteBufferC3(0x70);   } //W27C512 
                                    else if (lRes == 2) {    prwWriteBufferC2(0x82 );   } //27C256
                                    else if (lRes == 3) {    prwWriteBufferC1(0x88 );   } //27128 
                                    else if (lRes == 4) {    prwWriteBufferC1(0x86 );   } //2764
                                    else if (lRes == 5) {    prwWriteBufferC3(0x84 );   } //2732
                                    else if (lRes == 6) {    prwWriteBufferC0(0x81 );   } //2716
                                    else if (lRes == 7) {    prwWriteBufferC00(0x80 );   } //2708
                                     
        else  MessageBox(Dlg, "Error GetCurSel", lpProjName, MB_OK);
    }
    else  MessageBox(Dlg,"Error GetCurSel", lpProjName, MB_OK);
}
 
 
 
 
 
 
void CPRWDlg::OnIsclear() 
{
 
HWND Dlg = (HWND) GetActiveWindow();
     long lRes;
                  lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0);
     if (lRes != CB_ERR)
     {
 
                                     if (lRes == 0)          { prwIsClear(0x2F); }                        
        else if (lRes == 1)    { prwIsClear( 0x6E); }   
        else if (lRes == 2)    { prwIsClear( 0x2F); }    
                                    else if (lRes == 3)    { prwIsClear( 0x2F); }    
                                     else if (lRes == 4)    { prwIsClear( 0x2F); }   
                                     else if (lRes == 5)    { prwIsClear( 0x2F); }   
                                     else if (lRes == 6)    { prwIsClear( 0x2F); }   
                                     else if (lRes == 7)    { prwIsClear( 0x2F); }   
  
             
        else  MessageBox(Dlg, "Error GetCurSel", lpProjName, MB_OK);
     }
     else  MessageBox(Dlg ,"Error GetCurSel", lpProjName, MB_OK);
 
 
}
 
 
 
void CPRWDlg::OnChecksum() 
{
HWND Dlg = (HWND) GetActiveWindow();
     long lRes;
                    lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0); 
     if (lRes != CB_ERR)
     {
 
                                    if (lRes == 0)           {   prwCheckCS(0x4C); }  //AT27C512                          
        else if (lRes == 1)    {  prwCheckCS(0x6C); } //W27C512 ,fix 
                      if (lRes == 2)           {   prwCheckCS(0x4C); }   
                                    if (lRes == 3 )           {   prwCheckCS(0x4C); }   
                                     if (lRes == 4)           {   prwCheckCS(0x4C); }   
                                     if (lRes == 5)           {   prwCheckCS(0x4C); }   
                                      if (lRes == 6)           {   prwCheckCS(0x4C); }   
                                     if (lRes == 7)           {   prwCheckCS(0x4C); }   
         
        else MessageBox(Dlg, "Error GetCurSel", lpProjName, MB_OK);
     }
     else  MessageBox(Dlg,"Error GetCurSel", lpProjName, MB_OK);
}
 
 
 
 
 
 
 
 
void CPRWDlg::OnClearall() 
{
 HWND Dlg = (HWND) GetActiveWindow();
     long lRes;
                   lRes = SendDlgItemMessage(Dlg,IDC_CHOOSEDEV, CB_GETCURSEL, 0, 0);     
     if (lRes != CB_ERR)
     {
                                     if (lRes == 0)         {  MessageBox(Dlg,"For this type clearing impossible .", lpProjName, MB_OK);}                   
        else if (lRes == 1)  {   prwW27C512Erase(0x78 ) ; }          
                      if (lRes == 2)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}
                                      if (lRes == 3)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}
                                       if (lRes == 4)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}
                                        if (lRes == 5)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}
                                        if (lRes == 6)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}
                                       if (lRes == 7)         {  MessageBox(Dlg,"For this type clearing impossible\n ( or use UV eraser) .", lpProjName, MB_OK);}                                     
        else  MessageBox(Dlg, "Error GetCurSel", lpProjName, MB_OK);
     }
     else MessageBox(Dlg,"Error GetCurSel - CLEARALL", lpProjName, MB_OK);
 
 
    
}
 
 
 
 
 
 
 
 
void CPRWDlg::OnCompare() 
{
prw_OnCompare() ;
    
}
Добавлено через 1 час 30 минут
Можно предустановить на нулевые пункты меню комбобоксы:
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
   hComboPORTNAME = CreateWindow("combobox", TEXT(""),  
                                WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                                 10, 210, 80, 150,  hWnd,(HMENU) IDC_PORTNUM, hInstance, NULL);
      
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM1");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM2");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM3");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM4");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM5");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM6");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM7");
   SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM8");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM9");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM10");
  SendDlgItemMessage(hWnd, IDC_PORTNUM, CB_SETCURSEL, (WPARAM)0, 0) ;
    hLabel2 = CreateWindow("STATIC","Chip",WS_VISIBLE | WS_CHILD | SS_LEFT, 100,180,80,20, hWnd, NULL,hInstance,NULL); 
 
     hComboDevType = CreateWindow("combobox",   TEXT(""),  
                         WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                           100, 210, 80, 150, hWnd, (HMENU)IDC_CHOOSEDEV, hInstance, NULL);
    
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"27C512");  //C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"W27C512"); //C3  
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27256"); //C2
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27128");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2764");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2732");//C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2716");//C0
  
   //    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2708");//C00 , special hard  
 SendDlgItemMessage(hWnd, IDC_CHOOSEDEV, CB_SETCURSEL, (WPARAM)0, 0) ;
Добавлено через 9 секунд
Можно предустановить на нулевые пункты меню комбобоксы:
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
   hComboPORTNAME = CreateWindow("combobox", TEXT(""),  
                                WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                                 10, 210, 80, 150,  hWnd,(HMENU) IDC_PORTNUM, hInstance, NULL);
      
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM1");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM2");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM3");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM4");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM5");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM6");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM7");
   SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM8");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM9");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM10");
  SendDlgItemMessage(hWnd, IDC_PORTNUM, CB_SETCURSEL, (WPARAM)0, 0) ;
    hLabel2 = CreateWindow("STATIC","Chip",WS_VISIBLE | WS_CHILD | SS_LEFT, 100,180,80,20, hWnd, NULL,hInstance,NULL); 
 
     hComboDevType = CreateWindow("combobox",   TEXT(""),  
                         WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                           100, 210, 80, 150, hWnd, (HMENU)IDC_CHOOSEDEV, hInstance, NULL);
    
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"27C512");  //C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"W27C512"); //C3  
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27256"); //C2
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27128");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2764");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2732");//C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2716");//C0
  
   //    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2708");//C00 , special hard  
 SendDlgItemMessage(hWnd, IDC_CHOOSEDEV, CB_SETCURSEL, (WPARAM)0, 0) ;
Добавлено через 5 секунд
Можно предустановить на нулевые пункты меню комбобоксы:
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
   hComboPORTNAME = CreateWindow("combobox", TEXT(""),  
                                WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                                 10, 210, 80, 150,  hWnd,(HMENU) IDC_PORTNUM, hInstance, NULL);
      
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM1");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM2");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM3");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM4");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM5");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM6");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM7");
   SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM8");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM9");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM10");
  SendDlgItemMessage(hWnd, IDC_PORTNUM, CB_SETCURSEL, (WPARAM)0, 0) ;
    hLabel2 = CreateWindow("STATIC","Chip",WS_VISIBLE | WS_CHILD | SS_LEFT, 100,180,80,20, hWnd, NULL,hInstance,NULL); 
 
     hComboDevType = CreateWindow("combobox",   TEXT(""),  
                         WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                           100, 210, 80, 150, hWnd, (HMENU)IDC_CHOOSEDEV, hInstance, NULL);
    
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"27C512");  //C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"W27C512"); //C3  
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27256"); //C2
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27128");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2764");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2732");//C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2716");//C0
  
   //    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2708");//C00 , special hard  
 SendDlgItemMessage(hWnd, IDC_CHOOSEDEV, CB_SETCURSEL, (WPARAM)0, 0) ;
Добавлено через 4 минуты
Можно попробовать еще добавить класс поддержки .hex -формата https://ru.wikipedia.org/wiki/Intel_HEX
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
03.11.2019, 10:08  [ТС]
Многорежимный вариант (для различных контроллеров , скоростей , количества стоп-битов) . Некоторые микросхемы поддерживаются только с альтернативной схемой с другой прошивкой, хардом , адаптером и соответствующими блоками питания.
Вложения
Тип файла: zip aMAVR1_w27_multibaud.zip (157.6 Кб, 9 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.11.2019, 01:12  [ТС]
Можно и программы чтения с разными кодами применить, доработать адаптер, а не только с джамперами для чтения
с адаптером 1 панелью 1(27512) и 2(с джамперами для 27256, 27128), адаптером 1 , панелью 1 (2716)
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
; 27512
.equ nCE_C3 =4
.equ nOE_Vpp_C3 =6
.equ Vpe_C3  =5 ; for W27512 only, jumpers , switch 
.equ PWR_C3  =7 
 
 ;  check  jumpers for IC M27512 for sockert2  
 ; PD4  nCE TTL
 ; PD6  turn on Vpp , nOE for 27512 , in safe mode  nOE/Vpp  
 ; PD5  turn on Vpe for  W27512  
 ; PD7 turn on PWR if =0 
 
 
 
; with modifyed hard  for M27256
.equ nCE_C2 =4
.equ nOE_C2 =5
.equ Vpp_C2  =6
.equ PWR_C2  =7  turn on power if =0
 
 ;  check  jumpers for IC M 27256 for sockert 2  
 ; PD4  nCE TTL
 ; PD6  turn on Vpp
 ; PD5  nOE   TTL
 ; PD7 turn on PWR
Добавлено через 17 секунд
добавить модуль , доработать прошивку

Добавлено через 24 секунды
Улучшить управление питанием при записи и чтении

Добавлено через 17 минут
Дополнительные минтермы с битов 4,5,6,7 порта D и отдельно напряжение программирования и стирания (можно в адаптере ) выводят (можно буферировать и защитить от небезопасного состояния ) на разъем адреса, питания и управления адаптера
( у меня DB25 не с ЛПТ-шной распайкой , можно правильный разъем) , данные выводят на второй разъем ( у меня DB9, такие было удобно подключать к уже имеющемуся адаптеру с моддингом и коммутационными джамперами )или в этот , на соответствующие пины разъема адаптера .

Схему еще уточняю .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.11.2019, 01:41  [ТС]
За основу берется этот модифицированный аналог схемы и дорабатывается
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
05.11.2019, 02:02  [ТС]
Выбрать коды
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
; 0x2F    ISCLEAR C3    27512, W27C512
; 0x2E   ISCLEAR  C2
; 0x2D   ISCLEAR C1
; 0x2C   ISCLEAR C0
; 0x2B   ISCLEAR C00
 
 
; 0x4C get CS C3   27512, W27C512
; 0x4D get CS C2
; 0x4E get CS C1
; 0x4F get CS C0
; 0x6F get CS C00
 
 ; read parlallel C3 0x72 ,  
; 0x72 read page  C3   27512, W27C512
 ; 0x73 read page  C2
; 0x74 read page  C1
; 0x75 read page  C0
; 0x71 read page  C00
 
 
 ; 0x78 Erase W27C512  
 ; 0x77 -write  27C512, C3 // 27512   
 
 ; 0x70 -write W27C512, C3,   fix 
 ; 0x84 -write M2732,C3
 ; 0x82 -write M27256, C2
 
 
; 0x88  write M27128,C1  (ur use 0x86)
; 0x86  write M2764, C1 
 
; 0x81 , 2716 , C0
 
; 0x80 , 2708 , C00
Вложения
Тип файла: zip mavrhost_test_checkb.zip (122.6 Кб, 12 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 08:14  [ТС]
Управление питанием перед входом в процедуры чтения, записи , верификации, подсчета контрольной суммы доработать для безопасного включения под соответствующие пины как со стороны программы , так и со стороны контроллера.

Добавлено через 16 секунд
Функции выводов переназначить .

Добавлено через 1 час 48 минут
В подпрограммах чтения и записи , верификации и контрольной суммы доработать инициализацию cntL, cntH
ActionScript 3
1
2
     ldi        cntL, 32  //fix 
    ldi     cntH, 3  //fix
для различных ПЗУ , изменив программу инициализации верхней границы блока, доработав приложение .

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
.equ nE_C3 =4 ; pin 20 
.equ  Vpe_C3=5 
.equ nGVpp_C3  =6 ;  pin 22 to switch nOE/Vpp 
.equ PWR_C3  =7  
 
 
;  27256
 
.equ nE_C2 =4  ;  pin  20 
.equ nG_C2 =5 ;  pin 22  ; jumper to TTL   // read control 
.equ Vpp_C2  =6 ;   pin 1   jumper  to  Vpp  switch  
.equ PWR_C2  =7   
 
 ;  check  jumpers for IC 27256 for socket 2  
 
 
; with modifyed hard  2764, 27128
; nE  pin  20 jumper to 0 
 
.equ nG_C1  =4   ;   pin  22  jumper to PD4 
.equ nP_C1  = 5   ;   pin 27  to nP   PD5  
.equ Vpp_C1   =6 ;   turn on Vpp  jumper to    pin 1
.equ PWR_C1  =7  ; pin 28 
 
; 2716
.equ nG_C0  =4   ;  pin 20
.equ nEP_C0  = 5   ;    for pin 18
.equ Vpp_C0   =6   ; turn on Vpp on pin 21
.equ PWR_C0 =7 
 
 
.equ M2708_nCS_WE  =4 ; pin 20 switch control   high Vpp  if prog , 0 if read 
.equ M2708_Prog        = 5 ; pin 18 control switch    ; pulse  1 ms Vpp if prog   
.equ M2708_Vpp_on  =  6 ; 
.equ M2708_PWR  =       7

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
; до этого правильно управлять питанием в безопасном режиме , доработав программу, с учетом 
; блочного чтения и записи  в нашей программе  
 
DoM27WriteC2:  
 
; C2    
     rcall          M27_C2_WriteBuffer
    rjmp    Main
 
M27_C2_WriteBuffer:
 
 
                   cbi      PORTD, PWR_C2 ; Vcc=5V  ; fix         
                   sbi      PORTD, nG_C2 ;  
     sbi        PORTD, nE_C2 ;  
     sbi        PORTD, Vpp_C2  ;   Vpp=Vpp
 
                   ldi  cntL, 32     
     rcall  LoadInBuffer
     
 
    rcall   Del_1ms
    ldi     XL, low(BufferBegin)   
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI  
    mov     YL, ADDR_LOW
    ldi     cntL, 32  ;fix  number of bytes 
    ldi     cntH, 3  ;  fix  
 
M27_C2_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
M27_C2_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ; Порт А на out
    out     PORTB, YH ; AH
    out     PORTC, YL  ; AL
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t                              
    rcall   Del_10t
    rcall   Del_10t
                  sbi       PORTD, nG_C2
    cbi     PORTD, nE_C2            ;
    rcall   Del_100mks ;  100mks  pulse 
    sbi     PORTD, nE_C2 ;
 
    rcall   Del_10t
    rcall   Del_10t
     
     
 
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ; Порт А на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на Порт А
                  rcall Del_10t
                  sbi       PORTD, nE_C2
    cbi     PORTD, nG_C2
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD, nG_C2
 
    cp      temp0, VAL
;   brne    M27_C2_WBTry
    adiw    YH:YL, 1     ; увеличиваем адрес   
    dec  cntL  ;  если это не последний байт  блока    ; fix 
    brne    M27_C2_WBNext  ; если флаг Z не установлен, переходим к следующему байту
    ldi  temp0, 0
 
M27_C2_WBErr:
    rcall   SendChar
    rcall   SendChar
    ret
 
M27_C2_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    M27_C2_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    M27_C2_WBErr
 
 
 
 
;-----------------------------------------------------------------
 
M27_ReadPageC2:
 
                 cbi                       PORTD, Vpp_C2
                 cbi         PORTD, PWR_C2 ; Vcc=5V  ; fix
                 sbi                       PORTD, nE_C2 
                 sbi                       PORTD, nG_C2
                              
    ldi     temp0, 0
    out     DDRA, temp0     ; Порт А на вход
    ldi     temp0, 0xFF     
    out     PORTA, temp0        ; Подтяжка на Порт А
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms                  
 
M27_RPNextC2:    
    
    out  PORTB, ADDR_HI ; fix  
    out  PORTC, ADDR_LOW     
                    sbi                    PORTD, nE_C2 
                    sbi                    PORTD, nG_C2 
    rcall   Del_10t
                  rcall Del_10t 
                  rcall Del_10t 
      cbi                      PORTD, nE_C2 
                    cbi                    PORTD, nG_C2 
                  rcall Del_100mks ; 
 
    in   temp0, PINA   ;read byte
                sbi                    PORTD, nG_C2 
                sbi                    PORTD, nE_C2  
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF   ; fix 
    breq    M27_RPEndC2
    inc  ADDR_LOW       ; Addr++
    rjmp    M27_RPNextC2
M27_RPEndC2:
    ret
Добавлено через 4 часа 49 минут
mavrprog.asm

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
.include "m8515def.inc"
 
;MAVR W27
 
 
;PortA
.equ    iDir    = DDRC
.equ    iOut    = PORTC
.equ    iIn     = PINC
.equ    SDA     = 4
.equ    SCL     = 3
 
;PortD
.equ    PWR     = 7
.equ    CE      = 4
.equ    Vpe     = 5 ; 
.equ    OE      = 6 ;
 
 
.equ PowerFlag  =0; 
 
.equ    StackBegin      =RAMEND                 ;íà÷àëî ñòåêà
.equ    InitBaudRate    =3              ; 7372800/16/115200-1   ;UART on 115200
;.equ   InitBaudRate    =5              ;11059200/16/115200-1   ;UART on 115200
 
;Êîììàíäû óñòðîéñòâó îò õîñòà
.equ    CMD_SENDID           =0x69
.equ    CMD_POWER            =0x50
 
 ;.equ  CMD_AT24READPAGEBIG      =0x53
;.equ   CMD_AT24WRITEBUFFERBIG   =0x01
;.equ   CMD_AT24ISCLEARBIG       =0x3F
;.equ   CMD_AT24READPAGESMALL    =0x54
;.equ   CMD_AT24WRITEBUFFERSMALL =0x02
;.equ   CMD_AT24GETCSBIG         =0x4B
;.equ   CMD_AT24GETCSSMALL       =0x4A
;.equ   CMD_AT24ISCLEARSMALL     =0x3E
 
 
 
 
 
 
 
.equ          CMD_W27C512_ERASESUB          = 0x78 ; 'x'
 
 
.equ          CMD_W27C512_WRITEBUFFER  = 0x70 ; 'p'
.equ          CMD_M27512_WRITE      = 0x77 ;  'w'
.equ          CMD_M27256_WRITE      = 0x82 ;  
.equ          CMD_M27128_WRITE      = 0x88 ;  
.equ          CMD_M2764_WRITE        = 0x86 ;    
.equ          CMD_M2732_WRITE        = 0x84 ;  
.equ          CMD_M2716_WRITE        = 0x81 ; 
.equ          CMD_M2708_WRITE        = 0x80 ; 
 
 
 
.equ    CMD_W27C512_ISCLEAR             = 0x6E;  'n'
.equ    CMD_M27512_ISCLEAR_C3          =0x2F; '/'
.equ    CMD_M27256_ISCLEAR_C2          =0x2E; '.'
.equ    CMD_M27128_ISCLEAR_C1          =0x2D; '-'
.equ    CMD_M2764_ISCLEAR_C1          =0x2C;  
.equ    CMD_M2732_ISCLEAR_C3          =0x2B;
.equ    CMD_M2716_ISCLEAR_C0          =0x2A;  
.equ    CMD_M2708_ISCLEAR_C00         =0x29;
 
 
.equ    CMD_W27C512_GETCS_C3  = 0x6C ;    'l'
.equ          CMD_M27512_GETCS_C3      = 0x4C ;   'L'
.equ          CMD_M27256_GETCS_C2       = 0x4D ;  'M'
.equ          CMD_M27128_GETCS_C1        = 0x4E;   'N'
.equ          CMD_M2764_GETCS_C1         = 0x49;     'I'
.equ          CMD_M2732_GETCS_C3        = 0x48;    'H'
.equ          CMD_M2716_GETCS_C0          = 0x4F ;  'O'
.equ          CMD_M2708_GETCS_C00        = 0x45 ;  'E'
 
 
.equ           CMD_W27C512_READPAGE              = 0x52;   'R'
.equ          CMD_M27512_READPAGE_C3          = 0x72 ; 'r'
.equ          CMD_M27256_READPAGE_C2           = 0x73 ;  's'
.equ          CMD_M27128_READPAGE_C1           = 0x74 ; 't'
 .equ          CMD_M2764_READPAGE_C1         = 0x64 ;  'd' 
 .equ          CMD_M2732_READPAGE_C3         =  0x62 ;  'b'
.equ          CMD_M2716_READPAGE_C0        = 0x75 ; 'u'
.equ          CMD_M2708_READPAGE_C00      = 0x71 ; 'q'
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
;Ñ÷åò÷èêè
 
;.def   CS1         =R0
;.def   CS2         =R1
;.def   CS3         =R2
.def    CS1         =R3     ;temporary register
.def    CS2         =R4     ;temporary register
.def    CS3         =R5     ;temporary register
.def    CntL_tmp            =R6     ;
.def    CntH_tmp            =R7     ;
; .def  temp5           =R8
 ;.def  temp6           =R9
  .def  PowerReg    =R10
;.def   r11         =R11
;.def   r12         =R12
;.def   r13         =R13
;.def   r14         =R14
;.def   TmpSREG     =R15
 
 
.def    temp0       =R16        ;temporary register
.def    temp1       =R17        ;temporary register
.def    temp2       =R18        ;temporary register
.def    cntL        =R19        ;temporary register
.def    cntH        =R20        ;temporary register
 
 
;CMD ADDR_HI ADDR_LOW VAL RSV ADR SUMM
.def    ADR         =R21        ;Ïðîãðàììèðóåìûé àäðåñ ì.ñõ
.def    CMD         =R22        ;Êîìàíäà
.def    VAL         =R23        ;Çíà÷åíèå äëÿ çàïèñè/÷òåíèÿ
.def    ADDR_LOW    =R24        ;àäðåñ, ìëàäøèé áàéò
.def    ADDR_HI     =R25        ;àäðåñ, ñòàðøèé áàéò
;r26    XH
;r27    XL
;r28    YH
;r29    YL
;r30    ZH
;r31    ZL
 
 
.macro  jmpeq
    cpi     @0, @1
    brne    PC+2
    rjmp    @2
.endmacro
 
 
 
 
    .dseg
    .org    0x60
BufferBegin:        .byte   64
 
;------------------------------------------------------------------------------------------
;********************************************************************
;* Interrupt table  ;ENG;* Interrupt table
;********************************************************************
.cseg
;------------------------------------------------------------------------------------------
.org 0                      ;reset
    rjmp    Reset
 
;------------------------------------------------------------------------------------------
Reset:      
    ;èíèöèàëèçàöèÿ ïåðåìåííûõ, ïîðòà
    ldi     temp0, HIGH(StackBegin) ;óêàçàòåëü ñòåêà íà êîíåö ïàìÿòè
    out     SPH, temp0
    ldi     temp0, LOW(StackBegin)
    out     SPL, temp0
    rcall   PortInit     
                  rcall Del_100mks  
                   rjmp Main;
                  
;---------------------------------------------------------------
 
;Main program
Main:
 
;ldi  VAL,0x01
;rjmp Power
rjmp DoM27512_ReadPageC3
 
    rcall   GetChar
    mov     CMD, temp0
    rcall   GetChar
    mov     ADDR_HI, temp0
    rcall   GetChar
    mov     ADDR_LOW, temp0
    rcall   GetChar
    mov     VAL, temp0
    rcall   GetChar
    mov     ADR, temp0
                  rjmp Menu
 
 
 
 
Menu:                  
    ;Ðàçáèðàåì, ÷òî çà êîìàíäà ïðèøëà
 
    jmpeq   CMD, CMD_SENDID, SendDeviceID
    jmpeq   CMD, CMD_POWER, Power
     
 
           
   
 
 
 ;      jmpeq  CMD, CMD_W27C512_READPAGE  , DoW27C512ReadPageC3 
       jmpeq  CMD,  CMD_M27512_READPAGE_C3   ,   DoM27512_ReadPageC3  ; C3
       jmpeq  CMD,  CMD_M27256_READPAGE_C2   ,   DoM27256_ReadPageC2  ; C2    
       jmpeq  CMD,  CMD_M27128_READPAGE_C1   ,   DoM27128_ReadPageC1 ; C1
       jmpeq  CMD,  CMD_M2764_READPAGE_C1   ,   DoM2764_ReadPageC1 ; C1
       jmpeq  CMD,  CMD_M2732_READPAGE_C3   ,   DoM2732_ReadPageC3 ; C3
       jmpeq  CMD,  CMD_M2716_READPAGE_C0   ,   DoM2716_ReadPageC0 ; C0
       jmpeq  CMD,  CMD_M2708_READPAGE_C00 ,   DoM2708_ReadPageC00
 
 
;      jmpeq   CMD, CMD_W27C512_GETCS  ,  DoW27C512GetCS_C3
      jmpeq   CMD,  CMD_M27512_GETCS_C3  ,  DoM27512_GetCS_C3
      jmpeq   CMD,  CMD_M27256_GETCS_C2  ,  DoM27256_GetCS_C2
     jmpeq   CMD,  CMD_M27128_GETCS_C1  ,  DoM27128_GetCS_C1
      jmpeq   CMD,  CMD_M2764_GETCS_C1  ,  DoM2764_GetCS_C1
      jmpeq   CMD,  CMD_M2732_GETCS_C3  ,  DoM2732_GetCS_C3
      jmpeq   CMD,  CMD_M2716_GETCS_C0  ,  DoM2716_GetCS_C0
     jmpeq   CMD,  CMD_M2708_GETCS_C00  ,  DoM2708_GetCS_C00
 
;        jmpeq   CMD, CMD_W27C512_ISCLEAR  ,  DoW27C512IsClear_C3     
        jmpeq   CMD, CMD_M27512_ISCLEAR_C3 ,  DoM27512_IsClear_C3
        jmpeq   CMD, CMD_M27256_ISCLEAR_C2 ,  DoM27256_IsClear_C2
        jmpeq   CMD, CMD_M27128_ISCLEAR_C1 ,  DoM27128_IsClear_C1
        jmpeq   CMD, CMD_M2764_ISCLEAR_C1 ,    DoM2764_IsClear_C1   
        jmpeq   CMD, CMD_M2732_ISCLEAR_C3 ,    DoM2732_IsClear_C3   
        jmpeq   CMD, CMD_M2716_ISCLEAR_C0 ,    DoM2716_IsClear_C0
        jmpeq   CMD, CMD_M2708_ISCLEAR_C00 ,  DoM2708_IsClear_C00
    
  ;    jmpeq  CMD,  CMD_W27ERASESUB ,DoW27C512EraseSub
 
      jmpeq  CMD,  CMD_M27512_WRITE , DoM27512WriteC3  ; C3
      jmpeq  CMD,  CMD_M27256_WRITE , DoM27256WriteC2  ; C2    
      jmpeq  CMD,  CMD_M27128_WRITE , DoM27128WriteC1 ; C1
      jmpeq  CMD,  CMD_M2764_WRITE ,   DoM2764WriteC1 ; C1
      jmpeq  CMD,  CMD_M2732_WRITE ,   DoM2732WriteC3  ; C3 
      jmpeq  CMD,  CMD_M2716_WRITE ,  DoM2716WriteC0 
       ;  jmpeq  CMD,  CMD_M2708_WRITE ,  DoM2708WriteC00 
 
   
    rjmp    UnknownCommand
 
 
;-----------------------------------------------------------------
PortInit:
    ;Èñõîäíîå ñîñòîÿíèå PORTA=0, PORTB,PORTC,PORTD=255
    ldi     temp0,0xFF
    out     DDRA, temp0     ;ÏîðòÀ íà âûâîä
    out     DDRB, temp0     ;ÏîðòÂ íà âûâîä
    out     DDRC, temp0     ;ÏîðòC íà âûâîä
    out     DDRD, temp0     ;ÏîðòD íà âûâîä
    ldi     temp0,0x0
    out     PORTA, temp0    ;Ñíèìàåì íàïð. ñ ÏîðòÀ 
    out     PORTC, temp0    ;Ñíèìàåì íàïð. ñ ÏîðòÑ 
    out     PORTB, temp0    ;Ñíèìàåì íàïð. ñ ÏîðòÂ
    ldi     temp0, 0b11000000
    out     PORTD, temp0
 
 
    cbi     PORTD, CE  ;fix  safe level without Vcc ic
    cbi     PORTD, OE  ; turn off Vpp
    cbi     PORTD, Vpe ; turn off Vpe
    sbi     PORTD, PWR ; turn off Vcc ic
 
     
    
    
    ;íàñòðîéêà ïîñëåäîâàòåëüíîãî ïîðòà 
;   ldi     temp0, 0b00011000   ; ïðåðûâàíèÿ âûêëþ÷åíû, 8 áèò
;   out     UCR, temp0
    ldi     temp0, (1<<RXEN)|(1<<TXEN)
    out     UCSRB,temp0
    
  ; ldi     temp0,    (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8data, 2 stop bit 
   ldi  temp0, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8data, 1 stop bit 
    out     UCSRC,temp0
 
    clr     temp0
    out     UBRRH,temp0     ; ñêîðîñòü ïåðåäà÷è (115200 áîä)
    ldi     temp0, InitBaudRate
    out     UBRRL,temp0     ; ñêîðîñòü ïåðåäà÷è (115200 áîä)
    ret
 
;--------------------------------------------------------------------------
 
 
 
 
 
 
Power_On_Sub:
        cbi     PORTD, OE ; turn off Vpp
        cbi     PORTD, Vpe ; turn off Vpe
        cbi     PORTD, PWR ; turn on  PWR fix 
    
    
       sbi      PORTD, CE 
       ldi  temp2 ,  0x01
       mov  PowerReg, temp2      
 
ret
 
 
 
 
 
Power_Off_Sub:
 
 
        cbi     PORTD, Vpe ; turn off Vpe
        cbi     PORTD, OE ; turn off Vpp 
        sbi     PORTD, PWR ; turn off  PWR  fix 
        cbi     PORTD, CE  
    
       ldi  temp2 ,  0x00
       mov  PowerReg, temp2    
 
ret
 
Power_Off_Sub1:
 
               
        cbi     PORTD, Vpe ; turn off Vpe
        cbi     PORTD, OE ; turn off Vpp
        
        sbi     PORTD, PWR ; turn off  PWR  fix 
        cbi     PORTD, CE  
    
        
 
ret
 
 
 
 
;*******************************
 
Power:
    cpi     VAL, 1 ; if value=1  branch to POW_ON
    breq    POW_ON  
 
POW_OFF:
     
    rcall   Power_Off_Sub
    rcall   Del_10t
    ldi     VAL, 1
 
       mov   temp2, PowerReg
       cpi  temp2, 0x01 ; skip Val=0 if power flag =1 
       breq PC+2       
       ldi      VAL, 0
       rcall    PortInit
 
    rjmp    PWN
 
POW_ON:
    
    rcall   Power_On_Sub  
 
    rcall   Del_10t
    ldi     VAL, 0
    mov   temp2, PowerReg ; skip Val:=1 if power flag =1 
    cpi  temp2, 0x01
    breq    PC+2
    ldi     VAL, 1
 
PWN:
    mov     temp0, CMD
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    rcall   SendChar
    rcall   SendChar
    rjmp    Main
 
 
 
;-----------------------------------------------------------------
DoErrR:
    ldi     temp0, 0x55
    rcall   SendChar
    rcall   SendChar
    rcall   SendChar
    rjmp    Reset
;-----------------------------------------------------------------
DoErrW:
    ldi     temp0, 0xAA
    rcall   SendChar
    rcall   SendChar
    rcall   SendChar
    rjmp    Reset
;-----------------------------------------------------------------
Del_1s:
    ldi     temp2, 0xFF
D2: rcall   Del_1ms
    rcall   Del_1ms
    rcall   Del_1ms
    rcall   Del_1ms
    dec     temp2
    brne    D2
    ret
;-----------------------------------------------------------------
Del_1ms:    ;çàäåðæêà íà 1 ìñ (246 ðàç ïî 4.05ìêñ äëÿ 7.3728MHz)
    ldi     temp1, 0xF6
D1: rcall   Del_10t
    rcall   Del_10t
    rcall   Del_10t
    dec     temp1
    brne    D1
    ret
;-----------------------------------------------------------------
Del_100mks: ;çàäåðæêà íà 100 ìêñ
    ldi     temp1, 0x3D
D3: rcall   Del_10t
    dec     temp1
    brne    D3
    ret
;-----------------------------------------------------------------
Del_10t:    ;çàäåðæêà íà 10 öèêëîâ - 1.35ìêñ äëÿ 7.3728MHz
    nop
    nop
    nop
    ret
;-----------------------------------------------------------------
SendDeviceID:
    ldi     ZH, high(DeviceID<<1)  ;Óêàçàòåëü íà ñòðîêó îïèñàíèÿ
    ldi     ZL, low(DeviceID<<1)
    ldi     temp1, 20
SendDeviceID_1:
    lpm
    mov     temp0, r0
    rcall   SendChar
    adiw    ZH:ZL, 1
    dec  temp1
    brne    SendDeviceID_1
    rjmp    Main
;-----------------------------------------------------------------
UnknownCommand:
    rcall   PortInit
    mov     temp1, temp0
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0x55
    rcall   SendChar
    ldi     temp0, 0x00
    rcall   SendChar
    rcall   SendChar
    rcall   SendChar
    mov     temp0, temp1
    rcall   SendChar
    rjmp    Main
;-----------------------------------------------------------------
SendChar:
    sbis    UCSRA,UDRE ; æäåì îñâîáîæäåíèÿ âûõîäíîãî áóôåðà
    rjmp    SendChar
    out     UDR, temp0      ; îòïðàâëÿåì áàéò
    ret
;-----------------------------------------------------------------                                                                 
GetChar:
    sbis    UCSRA,RXC   ; æäåì ïðèåìà ñèìâîëà
 
    rjmp    GetChar
    in  temp0, UDR  ; ñ÷èòûâàåì ñèìâîë
    clc
    sbic    UCSRA, FE ; åñëè îøèáêà, óñòàíàâëèâàåì
    sec  ; ôëàã C
    ret
;-----------------------------------------------------------------
 
 
 
;****************************************
;  cntL  bytes counter
LoadInBuffer:
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
GetNextByte:
    rcall   GetChar
    st      X+, temp0   ; 
    dec     cntL
    brne    GetNextByte
    ret
 
 
 
 
 
;-----------------------------------------------------------------
DeviceID:
    .db     "MAVR W27  v.1.2 "
DeviceIDEnd:
;-----------------------------------------------------------------
 
 
.include "M27.asm"
;  .include "W27.asm"
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 08:15  [ТС]
M27.asm

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
;27512
 
.equ nE_C3 =4 ; pin 20 
.equ  Vpe_C3=5 
.equ nGVpp_C3  =6 ;  pin 22 to switch nOE/Vpp 
.equ PWR_C3  =7  
 
 
;  27256
 
.equ nE_C2 =4  ;  pin  20 
.equ nG_C2 =5 ;  pin 22  ; jumper to TTL   // read control 
.equ Vpp_C2  =6 ;   pin 1   jumper  to  Vpp  switch  
.equ PWR_C2  =7   
 
 ;  check  jumpers for IC 27256 for socket 2  
 
 
; with modifyed hard  2764, 27128
; nE  pin  20 jumper to 0 
 
.equ nG_C1  =4   ;   pin  22  jumper to PD4 
.equ nP_C1  = 5   ;   pin 27  to nP   PD5  
.equ Vpp_C1   =6 ;   turn on Vpp  jumper to    pin 1
.equ PWR_C1  =7  ; pin 28 
 
; 2716
.equ nG_C0  =4   ;  pin 20
.equ nEP_C0  = 5   ;    for pin 18
.equ Vpp_C0   =6   ; turn on Vpp on pin 21
.equ PWR_C0 =7 
 
 
.equ M2708_nCS_WE  =4 ; pin 20 switch control   high Vpp  if prog , 0 if read 
.equ M2708_Prog        = 5 ; pin 18 control switch    ; pulse  1 ms Vpp if prog   
.equ M2708_Vpp_on  =  6 ; 
.equ M2708_PWR  =       7
 
 
 
 
 
 
;**********************************
 
DoM27512WriteC3:  
;65536, max addr  , 0xFFFF
; C3
     rcall          M27_C3_WriteBuffer
    rjmp    Main
 
 
DoM27256WriteC2:  
;32768, max addr  0x7FFF
; C2    
     rcall          M27_C2_WriteBuffer
    rjmp    Main
 
 
DoM27128WriteC1:  
;16384, max addr 0x3FFF
; C1
 
     rcall          M27_C1_WriteBuffer
    rjmp    Main
 
 
 
DoM2764WriteC1:
;8192,  max addr 1FFF  
 
; C1
 
     rcall          M27_C1_WriteBuffer
    rjmp    Main
 
DoM2732WriteC3:  
;4096, max addr  0FFF
; C3
     rcall          M27_C3_WriteBuffer
     rjmp   Main
 
DoM2716WriteC0:  
;2048 max addr  07FF
; C0
     
 
    rcall          M27_C0_WriteBuffer
    rjmp    Main
 
 
 
DoM2708WriteC00:  
; 1024 max addr  03FF
 ; C00
 
 
    ; rcall          M27_C00_WriteBuffer
 
    rjmp    Main
 
 
 
 
;*********************
 
 DoM27512_ReadPageC3:
 
                  rcall          M27_ReadPageC3
    rjmp    Main
 
 DoM27256_ReadPageC2:
 
                  rcall          M27_ReadPageC2
    rjmp    Main
 
DoM27128_ReadPageC1:
 
                  rcall          M27_ReadPageC2
    rjmp    Main
 
 
 DoM2764_ReadPageC1:
 
                  rcall          M27_ReadPageC1
    rjmp    Main
 
 
 
 DoM2732_ReadPageC3:
 
                  rcall          M27_ReadPageC3
    rjmp    Main
 
 
 DoM2716_ReadPageC0:
 
                  rcall          M27_ReadPageC0
    rjmp    Main
 
 DoM2708_ReadPageC00:
 
                 ; rcall          M27_ReadPageC00
    rjmp    Main
 
;*************************
 
 DoM27512_GetCS_C3:
 
                   rcall          M27_GetCS_C3
    rjmp    Main
 
DoM27256_GetCS_C2:
 
                   rcall          M27_GetCS_C2
    rjmp    Main
 
DoM27128_GetCS_C1:
 
                   rcall          M27_GetCS_C1
    rjmp    Main
 
 
DoM2764_GetCS_C1:
//fix 
                   rcall          M27_GetCS_C1
    rjmp    Main
 
 
 
DoM2732_GetCS_C3:
 
                   rcall          M27_GetCS_C3
    rjmp    Main
 
 
DoM2716_GetCS_C0:
 
                   rcall         M2716_GetCS_C0
    rjmp    Main
 
DoM2708_GetCS_C00:
 
                   rcall          M2708_ReadPageC00
    rjmp    Main
 
;******************
 
 DoM27512_IsClear_C3:
 
                   rcall          M27_IsClear_C3
    rjmp    Main
 
DoM27256_IsClear_C2:
 
                   rcall          M27_IsClear_C2
    rjmp    Main
 
DoM27128_IsClear_C1:
 
                   rcall          M27_IsClear_C1
    rjmp    Main
 
 
DoM2764_IsClear_C1:
 
                   rcall          M27_IsClear_C1
    rjmp    Main
 
 
 
DoM2732_IsClear_C3:
 
                   rcall         M27_IsClear_C3
    rjmp    Main
 
 
DoM2716_IsClear_C0:
 
                   rcall          M27_IsClear_C0
    rjmp    Main
 
DoM2708_IsClear_C00:
 
                  rcall          M2708_IsClear_C00
    rjmp    Main
 
 
 
;-----------------------------------------------------------------
M27_ReadPageC3:
 
                
                 cbi        PORTD, PWR_C3 ; Vcc=5V  
                 sbi                       PORTD, nE_C3  
                 cbi                       PORTD, nGVpp_C3 
                 cbi                       PORTD, Vpe_C3
 
    
 
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ; Подтяжка на ПортА
 
    ldi     ADDR_LOW, 0   ; begin of the dump
    rcall   Del_1ms
                  
 
M27_RPNextC3:    
    
    out  PORTB, ADDR_HI  ; from interface 
    out  PORTC, ADDR_LOW     
                  sbi    PORTD, nE_C3  
    rcall   Del_10t
                  rcall Del_10t 
                  rcall Del_10t 
    cbi  PORTD, nE_C3; 
                  rcall Del_100mks ; 
 
    in   temp0, PINA   ;read byte
                  sbi   PORTD, nE_C3; 
    rcall   Del_100mks ;               
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF   ; 256 bytes   
    breq    M27_RPEndC3   
    inc  ADDR_LOW       ; Addr++
    rjmp    M27_RPNextC3 ; if not end of dump 
M27_RPEndC3:    ; end of the block 
 
 
              rcall Power_Off_Sub1
 
    ret
 
 
 
;-----------------------------------------------------------------
 
M27_ReadPageC2:
 
                 cbi                       PORTD, Vpp_C2
                 cbi         PORTD, PWR_C2 ; Vcc=5V  ; fix
                 sbi                       PORTD, nE_C2 
                 sbi                       PORTD, nG_C2
                              
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ; Подтяжка на ПортА
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms                  
 
M27_RPNextC2:    
    
    out  PORTB, ADDR_HI  
    out  PORTC, ADDR_LOW     
                    sbi                    PORTD, nE_C2 
                    sbi                    PORTD, nG_C2 
    rcall   Del_10t
                  rcall Del_10t 
                  rcall Del_10t 
      cbi                      PORTD, nE_C2 
                    cbi                    PORTD, nG_C2 
                  rcall Del_100mks ; 
 
    in   temp0, PINA   ;read byte
                sbi                    PORTD, nG_C2 
                sbi                    PORTD, nE_C2  
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF
    breq    M27_RPEndC2
    inc  ADDR_LOW       ; Addr++
    rjmp    M27_RPNextC2
M27_RPEndC2:
 
     rcall Power_Off_Sub1
    ret
 
 
 
;-----------------------------------------------------------------
 
M27_ReadPageC1:
 
                 cbi                       PORTD, Vpp_C1
                 cbi         PORTD, PWR_C1 ; Vcc=5V  ; fix
                ; sbi                      PORTD, nE_C1
                 sbi                       PORTD, nP_C1 
                 sbi                       PORTD, nG_C1
   
    
              
                           
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ; Подтяжка на ПортА
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms                  
 
M27_RPNextC1:    
    
    out  PORTB, ADDR_HI  
    out  PORTC, ADDR_LOW
                             
                   ; sbi                       PORTD, nE_C1 
                    sbi                    PORTD, nG_C1 
    rcall   Del_10t
                  rcall Del_10t 
                  rcall Del_10t 
     ; cbi                     PORTD, nE_C1 
                    cbi                    PORTD, nG_C1 
                  rcall Del_100mks ; 
 
    in   temp0, PINA   ;read byte
                  sbi                      PORTD, nG_C1
                 ; sbi                     PORTD, nE_C1  
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF
    breq    M27_RPEndC1
    inc  ADDR_LOW       ; Addr++
    rjmp    M27_RPNextC1
M27_RPEndC1:
 
 rcall Power_Off_Sub1
 
    ret
 
;********************************
 
M27_ReadPageC0:
 
                 cbi                       PORTD, Vpp_C1
                 cbi         PORTD, PWR_C1 ; Vcc=5V  ; fix
                 sbi                       PORTD, nG_C0
                 sbi                       PORTD, nEP_C0
                 
                              
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ; Подтяжка на ПортА
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms                  
 
M27_RPNextC0:    
    
    out  PORTB, ADDR_HI  
    out  PORTC, ADDR_LOW     
                 sbi                       PORTD, nG_C0
                 cbi                       PORTD, nEP_C0
    rcall   Del_10t
                  rcall Del_10t 
                  rcall Del_10t 
    cbi                    PORTD, nG_C0
                  rcall Del_100mks ; 
 
    in   temp0, PINA   ;read byte
                  rcall Del_10t   
   
                 sbi                       PORTD, nG_C0
                 sbi                       PORTD, nEP_C0
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF
    breq    M27_RPEndC0
    inc  ADDR_LOW       ; Addr++
    rjmp    M27_RPNextC0
M27_RPEndC0:
 
rcall Power_Off_Sub1 //fix 
    ret
 
 
 
;******************************
 
 
 
 
 
M2708_ReadPageC00:
                 
                 cbi                       PORTD, M2708_Prog
                 cbi                       PORTD, M2708_Vpp_on 
                 cbi         PORTD, M2708_PWR ; Vbb=-5V , Vcc=5V ,  Vdd=12V ;  
                 sbi                       PORTD, M2708_nCS_WE ; nCS_WE = 5V 
               
                 
                              
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ; Подтяжка на ПортА
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms                  
 
M2708_RPNextC00:     
    
    out  PORTB, ADDR_HI  
    out  PORTC, ADDR_LOW     
               
 
    cbi   PORTD, M2708_nCS_WE
                  rcall Del_100mks   
                   
    in   temp0, PINA   ;read byte
                  rcall Del_10t   
   
                 sbi     PORTD, M2708_nCS_WE ;close port,  +5V 
                 
    rcall   SendChar         
    
 
    cpi  ADDR_LOW, 0xFF
    breq    M2708_RPEndC00
    inc  ADDR_LOW       ; Addr++
    rjmp    M2708_RPNextC00
M2708_RPEndC00:
rcall Power_Off_Sub1
    ret
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 08:16  [ТС]
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
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
;----------- writing subs ------------------------------------------------------
 
 
 ; C3  27512, 2732 
 ;  nE=nCE=nCE=1
 ;  nGVpp=nOE/Vpp=Vpp 
 ;  Vpp=Vpp
 ;  Vcc= 5V
 
 ;  set ADDR
 ;  set DB
 
 
 ; nE=nCE=nCE=1 , pin 20  ;  or 18 nE 
 ; nGVpp=nOE/Vpp =Vpp pin 22 ; or 20  nGVpp 2732
 ; Vpp=Vpp   (pin27 ) =12V
 ; programming on pulse  '0' on nCE
 ; nE nCE =1 
 ; nE nCE =0 during 100us
 ; nE nCE =1 
 
 
 
M27_C3_WriteBuffer:
                   cbi      PORTD, PWR ; Vcc=5V  ; fix
                   sbi      PORTD, nE_C3 ;close output 
 
     cbi        PORTD, Vpe_C3 ;turn off +14V
     sbi        PORTD, nGVpp_C3  ;turn off +12V
 
     ldi    cntL, 32     
     rcall  LoadInBuffer
     
 
    rcall   Del_1ms
    ldi     XL,  low(BufferBegin)
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI
    mov     YL, ADDR_LOW
    
 
    ldi     cntL, 32 ; number  of bytes in the block 
    ldi     cntH, 3
M27_C3_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
M27_C3_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ;ПортА на out
    out     PORTB, YH ;выставляем старший байт
    out     PORTC, YL  ;выставляем младший байт
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t
 
     
    sbi     PORTD,   nGVpp_C3 ;Включаем +12В Vpp
                  cbi       PORTD,   Vpe_C3      
    rcall   Del_10t
    rcall   Del_10t
 
    cbi     PORTD,  nE_C3           ;
    rcall   Del_100mks ;импульс программирования 100мкс
    sbi     PORTD,  nE_C3 ;
 
    rcall   Del_10t
    rcall   Del_10t
 
    cbi     PORTD,   Vpe_C3 
    cbi     PORTD, nGVpp_C3 ; Выключаем +12В Vpp
                   
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на ПортА
                  rcall Del_10t
    cbi     PORTD, nE_C3
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD, nE_C3
    cp      temp0, VAL
;   brne    M27_C3_WBTry
    adiw    YH:YL, 1     ; Addr++
    dec  cntL  ; if not last byte of the block 
    brne    M27_C3_WBNext  ; if Z clear go to next byte 
    ldi     temp0, 0
M27_C3_WBErr:
    rcall   SendChar
    rcall   SendChar
    rcall Power_Off_Sub1
    ret
M27_C3_WBTry:
    mov  temp0, VAL
    dec  cntH  ;CntH--
    breq    M27_C3_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    M27_C3_WBErr
 
 
;-----------------------------------------------------------------
 
;  27256
 
;.equ nE_C2 =4  ;  pin  20 
;.equ nG_C2 =5 ;  pin 22  ; jumper to TTL   // read control 
;.equ Vpp_C2  =6 ;   pin 1   jumper  to  Vpp  switch  
;.equ PWR_C2  =7   
 
 ;  check  jumpers for IC 27256 for socket2  
 
 
 
M27_C2_WriteBuffer:
 
 
                   cbi      PORTD, PWR_C2 ; Vcc=5V  ; fix         
                   sbi      PORTD, nG_C2 ;  
     sbi        PORTD, nE_C2 ;  
     sbi        PORTD, Vpp_C2  ;   Vpp=Vpp
 
     ldi    cntL, 32     
     rcall  LoadInBuffer
     
 
    rcall   Del_1ms
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI
    mov     YL, ADDR_LOW
    ldi     cntL, 32  //fix 
    ldi     cntH, 3  //fix 
 
M27_C2_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
M27_C2_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ;ПортА на out
    out     PORTB, YH ; AH
    out     PORTC, YL  ; AL
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t                              
    rcall   Del_10t
    rcall   Del_10t
                  sbi       PORTD, nG_C2
    cbi     PORTD, nE_C2            ;
    rcall   Del_100mks ;  100mks  pulse 
    sbi     PORTD, nE_C2 ;
 
    rcall   Del_10t
    rcall   Del_10t
     
     
 
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на ПортА
                  rcall Del_10t
                  sbi       PORTD, nE_C2
    cbi     PORTD, nG_C2
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD, nG_C2
 
    cp      temp0, VAL
;   brne    M27_C2_WBTry
    adiw    YH:YL, 1     ; увеличиваем адрес
    dec  cntL  ;  если это не последний байт
    brne    M27_C2_WBNext  ; если флаг Z не установлен, переходим к следующему байту
    ldi  temp0, 0
 
M27_C2_WBErr:
    rcall   SendChar
    rcall   SendChar
    rcall Power_Off_Sub1 
    ret
 
M27_C2_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    M27_C2_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    M27_C2_WBErr
 
;-----------------------------------------------------------------
 
 
 
 
 ;  check  jumpers for IC 27128 for sockert2  
 ;  nE= 0      pin 20  (jumper)
 ;  nG=    pin    22  ( remap using jumper )   0- read 
 ;  nP  =   pin  27    (0 pulse -prog ) 
 ; Vpp=    pin 1 
 
 
;**************************
 
M27_C1_WriteBuffer:
 
                   ;nE=0      
                    cbi  PORTD, PWR_C1 ; Vcc=5V  ; fix
                    ldi  temp0 , (1<<nG_C1) | (1<<nP_C1) | (1<<Vpp_C1);
                    out PORTD, temp0  
 
                   ldi  cntL, 32     
     rcall  LoadInBuffer
     
 
    rcall   Del_1ms
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI
    mov     YL, ADDR_LOW
    ldi     cntL, 32
    ldi     cntH, 3
M27_C1_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
M27_C1_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ;ПортА на out
    out     PORTB, YH ;выставляем старший байт
    out     PORTC, YL  ;выставляем младший байт
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t
 
     
      
                  sbi       PORTD,  nP_C1
                  sbi       PORTD,  nG_C1 
                  sbi       PORTD,  Vpp_C1
     
    rcall   Del_10t
    rcall   Del_10t
 
    cbi     PORTD, nP_C1            ;
    rcall   Del_100mks ;импульс программирования 100мкс
    sbi     PORTD, nP_C1 ;
 
    rcall   Del_10t
    rcall   Del_10t
 
     
     ; cbi      PORTD, Vpp_C1
                   
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на ПортА
    cbi     PORTD,  nG_C1   
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD,  nG_C1
    cp      temp0, VAL
;   brne    M27_C1_WBTry
    adiw    YH:YL, 1     ; увеличиваем адрес
    dec  cntL  ; если это не последний байт
    brne    M27_C1_WBNext  ; если флаг Z не установлен, переходим к следующему байту
    ldi     temp0, 0
M27_C1_WBErr:
    rcall   SendChar
    rcall   SendChar
    rcall Power_Off_Sub1
    ret
M27_C1_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    M27_C1_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    M27_C1_WBErr
 
 
 
 ;fix
 
 
;**************************
M27_C0_WriteBuffer:
 
                   ;nE=0      
                     
                    cbi  PORTD, PWR_C0 ; Vcc=5V  ; 
                        
                    sbi  PORTD, nG_C0 ;  nG=1 , close output 
                    cbi  PORTD, nEP_C0 ; nEP=0   not prog mode 
                    sbi  PORTD, Vpp_C0 ; Vpp_C0=0
                  
                   ldi  cntL, 32     
     rcall  LoadInBuffer
     
 
    rcall   Del_1ms
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI
    mov     YL, ADDR_LOW
    ldi     cntL, 32
    ldi     cntH, 3
M27_C0_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
M27_C0_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ;ПортА на out
    out     PORTB, YH ;выставляем старший байт
    out     PORTC, YL  ;выставляем младший байт
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t
 
     
      sbi  PORTD, nG_C0 ;  nG=1 , close output 
                    cbi  PORTD, nEP_C0 ; nEP=0   not prog mode 
                    sbi  PORTD, Vpp_C0 ; Vpp_C0=0
                     
    rcall   Del_10t
    rcall   Del_10t
 
    sbi     PORTD, nEP_C0           ;
    rcall   Del_100mks ;импульс программирования 100мкс
    cbi     PORTD, nEP_C0 ;
 
    rcall   Del_10t
    rcall   Del_10t
 
     
     
                   
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на ПортА
 
                  cbi       PORTD,  nEP_C0 ;  
    cbi     PORTD,  nG_C0    ;  DB out 
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD,  nG_C0
    cp      temp0, VAL
;   brne    M27_C0_WBTry
    adiw    YH:YL, 1     ; увеличиваем адрес
    dec  cntL  ; если это не последний байт
    brne    M27_C0_WBNext  ; если флаг Z не установлен, переходим к следующему байту
    ldi     temp0, 0
M27_C0_WBErr:
    rcall   SendChar
    rcall   SendChar
    rcall Power_Off_Sub1
    ret
M27_C0_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    M27_C0_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    M27_C0_WBErr
 
 
 
;*******************************************
 
 
 
 
 
M27_IsClear_C3:
 
 
                  cbi       PORTD, nGVpp_C3  ;turn off +12V 
                  cbi       PORTD, Vpe_C3 ;turn off +14V                   
                  cbi       PORTD, PWR ; Vcc=5V 
                  sbi       PORTD, nE_C3     
 
    mov     XH, ADDR_HI     ;       ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
M27_ICNext27_C3:        ; reading 
                  sbi       PORTD, nE_C3  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, nE_C3  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, nE_C3
 
    cpi  temp0, 0xFF
    brne    M27_NotClear27_C3   
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_ICNext27_C3
    ldi  temp2, 0x43    ;    clear 
 
M27_ICEnd27_C3:
    rcall Power_Off_Sub1
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
 
    ret                     ;выход
M27_NotClear27_C3:
    ldi             temp2, 0x44  ;  not clear
    rjmp    M27_ICEnd27_C3
;-----------------------------------------------------------------
 
 
M27_IsClear_C2:
                  
                  
    cbi     PORTD, Vpp_C2   ; turn off +12V               
                  cbi       PORTD, PWR_C2 ; Vcc=5V 
                  sbi       PORTD, nG_C2 ;  ; pin 5  , close output    
                  sbi       PORTD, nE_C2     
 
    mov     XH, ADDR_HI     ;       ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
M27_ICNext27_C2:     ; reading 
                  sbi       PORTD,  nG_C2 
                  cbi       PORTD,  nE_C2
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  
                  cbi       PORTD, nG_C2  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, nG_C2
                  sbi       PORTD, nE_C2
 
    cpi  temp0, 0xFF
    brne    M27_NotClear27_C2   
    adiw    YH:YL, 1        ; счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_ICNext27_C2
    ldi  temp2, 0x43   ;  clear 
 
M27_ICEnd27_C2:
    rcall Power_Off_Sub1              
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret  
M27_NotClear27_C2:
    ldi             temp2, 0x44  ; not clear
    rjmp    M27_ICEnd27_C2
;-----------------------------------------------------------------
 
 
 
M27_IsClear_C1:
                  
                   
    cbi     PORTD, Vpp_C1  ;turn off Vpp              
                  cbi       PORTD, PWR_C1  ; Vcc=5V 
                  sbi       PORTD, nP_C1 ; nP=1
                  ; sbi     PORTD, nE_C1 ; nE=1 
                  sbi       PORTD, nG_C1     
 
    mov     XH, ADDR_HI     ; 0x7f      ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ; 0x00
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
M27_ICNext27_C1:        ; reading 
                  sbi       PORTD, nP_C1 ; nP=1 
                  ; сbi        PORTD, nE_C1 ; nE=0 
                  sbi       PORTD, nG_C1   ; output disable 
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, nG_C1  ; 
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, nG_C1 
                   ; sbi        PORTD, nE_C1 ; nE=1 
    cpi  temp0, 0xFF
    brne    M27_NotClear27_C1   
    adiw    YH:YL, 1        ; счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_ICNext27_C1
    ldi  temp2, 0x43   ;  clear 
 
M27_ICEnd27_C1:
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret  
M27_NotClear27_C1:
    ldi             temp2, 0x44  ; not clear
    rjmp    M27_ICEnd27_C1
 
 
 
 
;-----------------------------------------------------------------
 
 
 
 
 
 
M27_IsClear_C0:
                  
                  cbi       PORTD, Vpp_C0 ;      turn off Vpp
    cbi     PORTD, nEP_C0  ;     =0         
                  cbi       PORTD, PWR_C0 ; Vcc=5V 
                  sbi       PORTD, nG_C0    ; disable outputs
 
    mov     XH, ADDR_HI     ;       ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
M27_ICNext27_C0:        ; reading 
 
                  cbi       PORTD, nEP_C0  ;     =0       
                  sbi       PORTD, nG_C0  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, nG_C0  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, nG_C0 ; disable outputs
 
    cpi  temp0, 0xFF
    brne    M27_NotClear27_C0   
    adiw    YH:YL, 1        ; счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_ICNext27_C0
    ldi  temp2, 0x43   ;  clear 
 
M27_ICEnd27_C0:
    rcall Power_Off_Sub1         
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret  
M27_NotClear27_C0:
    ldi             temp2, 0x44  ; not clear
    rjmp    M27_ICEnd27_C0
;-----------------------------------------------------------------
 
 
 
M2708_IsClear_C00:
                  
                  cbi       PORTD, M2708_Vpp_on ; turn off Vpp  
    cbi     PORTD, M2708_Prog                  
                  cbi       PORTD, M2708_PWR   ;Vpp=5V 
                  sbi       PORTD,  M2708_nCS_WE ; disable output ,  5V     
 
    mov     XH, ADDR_HI     ;       ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
M2708_ICNext2708_C00:       ; reading 
                  cbi       PORTD, M2708_Prog
                  sbi       PORTD, M2708_nCS_WE  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, CE  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, CE 
 
    cpi  temp0, 0xFF
    brne    M2708_NotClear2708_C00   
    adiw    YH:YL, 1        ; счетчик адреса
    sbiw    XH:XL, 1
    brne    M2708_ICNext2708_C00
    ldi  temp2, 0x43   ;  clear 
 
M2708_ICEnd2708_C00:
    rcall Power_Off_Sub1              
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret  
M2708_NotClear2708_C00 :
    ldi             temp2, 0x44  ; not clear
    rjmp    M2708_ICEnd2708_C00
 
;-----------------------------------------------------------------
 
 
 
 
 
 
; *************************
M27_GetCS_C3:
                   
                   cbi      PORTD, nGVpp_C3 ; turn off Vpp
                   cbi      PORTD, Vpe ; turn off Vpe
                   cbi      PORTD, PWR ; turn on  PWR fix 
                   sbi PORTD, nE_C3
                   
 
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
M27_CSNext27:       ;собственно, цикл чтения
                  sbi       PORTD, nE_C3
                  rcall Del_10t
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
    rcall   Del_10t
    cbi     PORTD, nE_C3   
    rcall   Del_10t
     
                 
    rcall   Del_10t
    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
    sbi     PORTD, nE_C3      
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_CSNext27
 
 
 
    rcall Power_Off_Sub1
   
 
  
 
 
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
 
 
 
    ret  ;выход
 
 
 
 
M27_GetCS_C2:
                 
                 
                 cbi         PORTD, Vpp_C2
                 cbi         PORTD, PWR_C2 ; Vcc=5V  ; fix
                 sbi         PORTD, nE_C2 
                 sbi         PORTD, nG_C2 
 
 
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
M27_CSNext27_C2:        ;reading 
                    sbi                    PORTD, nE_C2 
                    sbi                    PORTD, nG_C2 
 
 
 
 
                  rcall Del_10t
                  out       PORTB, YH   ;выставляем старший байт
                  out       PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                    cbi                    PORTD, nE_C2 
                    cbi                    PORTD, nG_C2 
                  rcall Del_10t
     
                 
                    rcall   Del_10t
                    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
                sbi                    PORTD, nG_C2 
                sbi                    PORTD, nE_C2 
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_CSNext27_C2
 
    rcall Power_Off_Sub1
 
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret  ;выход
 
 
 
 
 
M27_GetCS_C1:
                 cbi            PORTD, Vpp_C1
                 cbi         PORTD, PWR_C1 ; Vcc=5V  ; fix
                ; sbi        PORTD, nE_C1
                 sbi         PORTD, nP_C1 
                 sbi         PORTD, nG_C1
   
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
M27_CSNext27_C1:        ;собственно, цикл чтения
                    ; sbi                  PORTD, nE_C1 
                    sbi                    PORTD, nG_C1 
                  rcall Del_10t
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
    rcall   Del_10t
                   ; cbi                   PORTD, nE_C1 
                    cbi                    PORTD, nG_C1 
                    rcall   Del_10t
     
                    rcall   Del_10t
                    rcall   Del_10t
    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
                  sbi                      PORTD, nG_C1
                 ; sbi                     PORTD, nE_C1  
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M27_CSNext27_C1
     
  
    rcall Power_Off_Sub1
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret  ;выход
 
 
  
 
 
M2716_GetCS_C0:
                   
                  cbi                      PORTD, Vpp_C0
                 cbi         PORTD, PWR_C0 ; Vcc=5V  ; fix
                 sbi                       PORTD, nG_C0
                 sbi                       PORTD, nEP_C0
 
 
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
M2716_CSNext27_C0:      ;собственно, цикл чтения
                 sbi                       PORTD, nG_C0
                 cbi                       PORTD, nEP_C0
                  rcall Del_10t
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
    rcall   Del_10t
                  cbi                      PORTD, nG_C0
                  rcall Del_10t
     
                 
                    rcall   Del_10t
    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
 
    sbi                    PORTD, nG_C0
    sbi                    PORTD, nEP_C0
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M2716_CSNext27_C0
 
 rcall Power_Off_Sub1
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret  ;выход
 
//fix
 
 
M2708_GetCS_C00:
                  cbi                      PORTD, M2708_Prog
                 cbi                       PORTD, M2708_Vpp_on 
                 cbi         PORTD, M2708_PWR ; Vbb=-5V , Vcc=5V ,  Vdd=12V ;  
                 sbi                       PORTD, M2708_nCS_WE ; nCS_WE = 5V 
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
M2708_CSNext27_C00:     ;собственно, цикл чтения
                  sbi     PORTD, M2708_nCS_WE
                  rcall Del_10t
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
    rcall   Del_10t
                  cbi     PORTD, M2708_nCS_WE
                  rcall Del_10t
     
                 
                    rcall   Del_10t
    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
    sbi  PORTD, M2708_nCS_WE ;close port,  +5V 
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    M2708_CSNext27_C00
 
 
 
    rcall Power_Off_Sub1
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret  ;выход
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 08:18  [ТС]
Программа с измененными кодами
Вложения
Тип файла: zip mavrhost_27256_test_cmd.zip (122.6 Кб, 12 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 08:29  [ТС]
W27.asm
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
;*************************************
 
 
DoW27C512ReadPageC3:  
 
 
  
    rcall   W27C512_ReadPage
    rjmp    Main
;--------------------------------------------------------------------------
 DoW27C512GetCS_C3:  
 
     
     
    rcall   W27C512_GetCS
    rjmp    Main
;--------------------------------------------------------------------------
DoW27C512IsClear_C3:  
  
    
    rcall   W27C512_IsClear
    rjmp    Main
;--------------------------------------------------------------------------
DoM27C512WriteC3:  
 
     
    
    rcall   W27_WriteBuffer
    rjmp    Main
 
 
DoW27C512EraseSub:
    
    
    rcall   W27C512_EraseSub
    rjmp    Main
 
 
 
;-----------------------------------------------------------------
W27C512_ReadPage:
                 cbi        PORTD, PWR ; Vcc=5V  ; fix
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    ldi     ADDR_LOW, 0          
    rcall   Del_1ms
                 sbi                       PORTD, CE
;   cbi     PORTD, CE
W27_RPNext:  ;собственно, цикл чтения
    
    out  PORTB, ADDR_HI ;выставляем старший байт
    out  PORTC, ADDR_LOW    ;выставляем младший байт
    rcall   Del_10t
 
    cbi  PORTD, CE; fix
                   rcall    Del_100mks ;fix 
 
    in   temp0, PINA        ;читаем байт
    sbi     PORTD, CE; fix
    rcall   SendChar        ;и отсылаем в посл.порт
    
 
    cpi  ADDR_LOW, 0xFF
    breq    W27_RPEnd
    inc  ADDR_LOW       ;инкрементируем адрес
    rjmp    W27_RPNext
W27_RPEnd:
    ret
;-----------------------------------------------------------------
W27C512_IsClear:
                  
                  cbi       PORTD, Vpe ;turn off +14V
    cbi     PORTD, OE  ;turn off +12V                
                  cbi       PORTD, PWR ; Vcc=5V 
                  sbi       PORTD, CE     
 
    mov     XH, ADDR_HI     ; 0x7f      ;кладем в пару XH:XL максимальный размер м.сх
    mov     XL, ADDR_LOW ; 0x00
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
W27_ICNext27:       ; reading 
                  sbi       PORTD, CE  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, CE  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, CE 
 
    cpi  temp0, 0xFF
    brne    W27_NotClear27   
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    W27_ICNext27
    ldi  temp2, 0x43    //    clear 
 
W27_ICEnd27:
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret                     ;выход
W27_NotClear27:
    ldi             temp2, 0x44  //not clear
    rjmp    W27_ICEnd27
;-----------------------------------------------------------------
 
W27C512_GetCS:
                   cbi      PORTD, PWR ; Vcc=5V  ; fix  
    clr     CS1         ;чистим буфер КС
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI ;кладем в пару XH:XL max size   
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
    ldi     temp0, 0
    out     DDRA, temp0     ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
    
 
W27_CSNext27:       ;собственно, цикл чтения
                  sbi       PORTD, CE
                  rcall Del_10t
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
    rcall   Del_10t
                  cbi       PORTD, CE  ;fix
                  rcall Del_10t
     
                 
                    rcall   Del_10t
    in      temp0, PINA     ;читаем байт
                  rcall Del_10t
                  rcall Del_10t 
    sbi     PORTD, CE    ;fix
                  
 
    clc     ;чиcтим Carry  ;блок суммирования
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc     ;конец суммирования
 
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    W27_CSNext27
 
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret                     ;выход
 
;-----------------------------------------------------------------
W27_WriteBuffer:
                   cbi      PORTD, PWR ; Vcc=5V  ; fix
                   sbi      PORTD, CE
 
    cbi     PORTD, Vpe ;turn off +14V
    cbi     PORTD, OE  ;turn off +12V
 
     ldi    cntL, 32
     
    rcall   LoadInBuffer
 
 
    rcall   Del_1ms
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
    mov     YH, ADDR_HI
    mov     YL, ADDR_LOW
    ldi     cntL, 32
    ldi     cntH, 3
W27_WBNext:
    ld      temp0, X+
    mov     VAL, temp0
W27_WBTryWrite:
    ldi     ADR, 0xFF   ; because  temp0 in use  
    out     DDRA, ADR ;ПортА на out
    out     PORTB, YH ;выставляем старший байт
    out     PORTC, YL  ;выставляем младший байт
    out     PORTA, temp0 ;выставляем данные
    rcall   Del_10t
 
     
    sbi     PORTD,  OE ;Включаем +12В Vpp
                  cbi       PORTD,  Vpe      
    rcall   Del_10t
    rcall   Del_10t
 
    cbi     PORTD, CE           ;
    rcall   Del_100mks ;импульс программирования 100мкс
    sbi     PORTD, CE ;
 
    rcall   Del_10t
    rcall   Del_10t
 
     
    cbi     PORTD, OE ; Выключаем +12В Vpp
 
    rcall   Del_10t
    ldi     temp0, 0
    out     DDRA, temp0 ;ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0 ;Подтяжка на ПортА
    cbi     PORTD, CE
 
    rcall   Del_10t
    in      temp0, PINA ;читаем байт
    sbi     PORTD, CE
    cp      temp0, VAL
;   brne    W27_WBTry
    adiw    YH:YL, 1     ; увеличиваем адрес
    dec  cntL  ; если это не последний байт
    brne    W27_WBNext  ; если флаг Z не установлен, переходим к следующему байту
    ldi     temp0, 0
W27_WBErr:
    rcall   SendChar
    rcall   SendChar
    ret
W27_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    W27_WBTryWrite
    ldi  temp0, 0x77//
    rjmp    W27_WBErr
;-----------------------------------------------------------------
 
 
.equ W27C512_CompSID= 0xDA
.equ W27C512_DevSID =0x08
 
.equ W27C512_HiAdrId0= 0x00 
.equ W27C512_LowAdrId0 =0x00 
.equ W27C512_HiAdrId1= 0x00 
.equ W27C512_LowAdrId1 = 0x01
 
;Skip if not Winbond vendor, product
W27C512_CheckWinBond:
                             cbi        PORTD, PWR ; Vcc=5V  ; fix
                             sbi        PORTD, CE    ;  nCE=1
                             cbi        PORTD, OE    ; turn off +12V  on nOE/Vpp 
                             sbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             ldi YH ,W27C512_HiAdrId0;
                             ldi YL ,W27C512_LowAdrId0;
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t   
                             ldi        temp0, 0
               out      DDRA, temp0     ;ПортА in
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     temp0, PINA     ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
               cpi   temp0, W27C512_CompSID
               brne   W27C512_EraseSubSID_error
 
                ldi YH ,W27C512_HiAdrId1;
                             ldi YL ,W27C512_LowAdrId1;
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t   
                             ldi        temp0, 0
               out      DDRA, temp0     ;ПортА in
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     temp0, PINA     ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
                             cpi     temp0, W27C512_DevSID
                             brne   W27C512_EraseSubSID_error  
                             rjmp   W27C512_OKEraseSub
 
 
W27C512_EraseSubSID_error:
                             sbi        PORTD, PWR ; Vcc=5V
                             cbi        PORTD, CE    ;  nCE=1
                             cbi        PORTD, OE    ; turn off +14V  on nOE/Vpp 
                             cbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             clr        temp0
               out      DDRA, temp0
                             out        PORTA, temp0    ;выставляем данные 0xFF  
                             out        PORTB, temp0     
               out      PORTC, temp0
 
                         ;  rjmp W27C512NotClear27_Erase
                         
                          ; ret
 
 
 
W27C512_EraseSub:
                             
                             rjmp W27C512_CheckWinBond
                            ; ret
 
W27C512_OKEraseSub:
 
 
 
                             cbi        PORTD, PWR ; Vcc=5V
                             sbi        PORTD, CE    ;  nCE=1
                             sbi        PORTD, OE    ; turn off +14V  on nOE/Vpp 
                             sbi        PORTD, Vpe   ; turn off +14V  on nOE/Vpp 
                             ldi        temp0, 0x00
               out      DDRA, temp0
                              
                             ;ldi    cntL, 32
            ; rcall LoadInBuffer
 
                             clr        YH
               clr      YL
                             out        PORTB, YH    
               out      PORTC, YL
                             rcall  Del_10t  
                             ldi        temp0, 0xff
               out      DDRA, temp0     ;ПортА out
                             ldi                     temp0, 0xff
                             out        PORTA, temp0    ;выставляем данные 0xFF
 
 
                             rcall  Del_10t
               rcall    Del_10t 
                             rcall  Del_10t
               rcall    Del_10t
                              
                             cbi        PORTD, CE
                             rcall  Del_100mks  ; pulse nCE=0 100us
                             sbi        PORTD, CE   
                             rcall  Del_10t 
                             cbi        PORTD, Vpe   ; turn off Vpe
                             rcall  Del_10t
                             cbi        PORTD,  OE   ; turn off Vpe
                             rcall  Del_10t
 
                             cbi        PORTD, CE  
                             rcall  Del_10t
                             in     VAL, PINA       ;читаем байт                           
               sbi      PORTD, CE
               rcall    Del_10t
  
                               rcall  W27C512_IsClearAfterErase
                            
                              ret
 
 
 
 W27C512_IsClearAfterErase:
 
                   cbi      PORTD, Vpe ;turn off +14V
    cbi     PORTD, OE  ;turn off +12V                
                  cbi       PORTD, PWR ; Vcc=5V 
                  sbi       PORTD, CE     
 
    ldi     XH, 0xff     ;    ;кладем в пару XH:XL максимальный размер м.сх
    ldi     XL,  0xff ;  
    clr     YH
    clr     YL
                  
    ldi     temp0, 0
    out     DDRA, temp0     ; ПортА на вход
    ldi     temp0, 0xFF
    out     PORTA, temp0        ;Подтяжка на ПортА
    rcall   Del_1ms
     
    
W27C512_ICNext27_Erase :        ; reading 
                  sbi       PORTD, CE  
                  nop
                  nop
    out     PORTB, YH   ;выставляем старший байт
    out     PORTC, YL   ;выставляем младший байт
                  rcall Del_10t
                  cbi       PORTD, CE  ;enable output by nCE=0
    rcall   Del_10t
                  rcall Del_10t
    in      temp0, PINA     ;читаем байт
                  nop
                  sbi       PORTD, CE 
 
    cpi  temp0, 0xFF
    brne    W27C512_NotClear27_Erase    
    adiw    YH:YL, 1        ;счетчик адреса
    sbiw    XH:XL, 1
    brne    W27C512_ICNext27_Erase 
    ldi  temp2, 0x43    ;   clear 
 
W27C512_ICEnd27_Erase :
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret 
 
                    ;выход
 
 W27C512_NotClear27_Erase :
;   ldi             temp2, 0x44  //not clear
;   rjmp    W27C512_ICEnd27_Erase 
ret
С учетом формата команд, предложенного Ковлевым

Добавлено через 8 минут
В Atmega8515 еще осталось достаточно много места ( занято 29...38%) .
Для поддержки больших объемов памяти (посылка адреса по частям 2 раза и больше 16 бит адреса ) схемой, совместимой по кодам , но с регистрами на шинах адреса и данных эта программа с макросами на ввод и вывод может поместиться в Atmega8a(16a),Atmega8515 с доработками, но место быстро закончится и не на все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2019, 08:29
Помогаю со студенческими работами здесь

Как проверить исправность работы USBasp программатора?
Есть програматор. Не получаеться записать HEX файл на мк. Как убедиться что программатор виден для СинаПрог и может без ошибок записать...

512 оперативки и скорость работы приложений
Ребята, телефон LG E612, 512 оперативки. Можно ли как-нибудь его ускорить, отключив сторонние встроенные приложения с помощтю...

4850 512 vs 9800 gtx 512 vs 9800 gtx+512 vs gts250 512
ну вем привет кого не видел из темы всё понятно что предпочтительнее спасибо

Mavr, можно тебе вопрос?
А как в Access'е какому-нибудь контролу назначить свой курсор??? С TreeView разобрался: большое спасибо!

Производительность и безопасность железа, если ставить ОЗУ: 512 - 128 - 512
Отключается компьютер, принёс в магазин, где брал, они его почистили, начал работать, примерно недели ч/з 2-3 начинается опять, приходится...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru