Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335

PIC12F675: программная очередь состоящая из адресов функций и её применение (asm)

20.01.2016, 14:10. Показов 2255. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Сегодня задался одним очень интересным вопросом. Чувствую что реализовать как-то можно, но не знаю как)

В чём суть: я хочу сделать очередь из адресов функций. К примеру у меня есть задача: вызвать функции в определённой последовательности: А->Г->Г->Е->Ф->А. Я думал выделить раздел памяти и в этом разделе памяти записать по очереди адреса функций, к примеру так:
20h = [А=адрес функции А]
21h = [Г=адрес функции Г]
22h = [Г=адрес функции Г]
23h = [Е=адрес функции Е]
24h = [Ф=адрес функции Ф]
25h = [А=адрес функции А]
Соответственно задавая эту очередь, я её предполагаю использовать так:
1 - выполнить функцию А,
2 - в конце функции сделать call next_func, где next_func = 21h = [Г=адрес функции Г]
3 - выполнить функцию Г,
4 - в конце функции сделать call next_func, где next_func = 21h = [Г=адрес функции Г]
5 - ...
next_func, по сути, регистр или несколько спаренных регистров которые хранят адрес точки входа в функцию.


Вопрос теперь в том, как узнать адрес точек входа моих функций или как их точно можно задать, чтобы потом поставить на место next_func их адреса в виде регистров.

Да и вообще можно ли это сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2016, 14:10
Ответы с готовыми решениями:

Применение адресов и указателей при возврате из функций нескольких значений
#include <stdio.h> #include <math.h> #include <conio.h> float A ={-5.1 , 2.8 , -7.9, 4.6, 8.3, 0.4}, B ={-3.6 , 4.9 , 5.8,...

Pic12F675. asm не мигает светодиод:)
Всем привет! нашел в инете такое: http://arduinokit.ru/itistronics/mic...nking-tid.html заливаю в свой pic12f675 прошивку с...

Управление светодиодами с кнопок (ASM, Proteus, PIC12F675)
Добрый день! У меня вот такое задание, светодиоды HL1 и HL2 погашены, когда нажимаем на клавишу S1 - начинает мигать светодиод HL2, а...

13
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.01.2016, 14:29
C
1
2
3
4
5
6
7
8
9
10
void f1() { }// функция 1
void f2() { }// функция 2
 
void (*pf)();// Указатель на функцию 
 
pf = &f1;
pf();// вызов F1
 
pf = &f2;
pf();// вызов F2
Как то так
К своему случаю сами приведите.
1
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 14:56  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
Как то так
К своему случаю сами приведите.
конечно класс) но я пишу на ассемблере. на си я бы давно написал)))
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.01.2016, 15:38
А косвенный переход в 12 пике есть? Типа JMP [BX+смещение] А то 12 серия вроде имела ограничение даже по сравнению с 16 серией
Если есть то можно написать, но громозко получится.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 15:51  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
А косвенный переход в 12 пике есть? Типа JMP [BX+смещение] А то 12 серия вроде имела ограничение даже по сравнению с 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
;====================================================================
; библиотека функций
;====================================================================
A   EQU     0x0020
G   EQU     0x0040
E   EQU     0x0080
F   EQU     0x00A0
 
ORG 0x0020
; код функции A
    ...
    return
 
ORG 0x0040
; код функции G
    ...
    return
 
ORG 0x0080
; код функции E
    ...
    return
 
ORG 0x00A0
; код функции F
    ...
    return
 
 
;====================================================================
; пример вызова такой функции
call    A
 
; пример моей очереди A-Г-Г-Е-Ф-А
call    A
call    G
call    G
call    E
call    F
call    A
Сейчас попробую подебажить на предмет того как будет себя вести код. Это же я в продолжение своей старой темы делаю: PIC12F675: диалог с расширителем портов PCF8574 через i2c (Протеус) - реализую I2C так, чтобы у меня не терялась производительность МК)

Только вот теперь за памятью надо глаз да глаз.. в любом случае весь код программы должен быть за пределами крайней функции: где-то за ORG 0x00С0 (если удастся последнюю функцию всунуть в 20 инструкций)
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.01.2016, 16:00
Очередь динамически меняется или постоянна?
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 17:43  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
Очередь динамически меняется или постоянна?
Трудно сказать. Давайте подумаю. Изначально очередь делалась для создания функции. То есть функция размыта во времени, она состоит из подфункций которые так же последовательно должны выполняться по времени - собственно очередь и состоит из подфункций.

К примеру я вызываю функцию, делаю очередь, настраиваю очередь (настраиваю подфункции очереди, а значит настраиваю их регистры: сколько раз выполняется подфункция, какие параметры в ней используются, что с чем складывается и тп.). После я на очередь вешаю что-то на подобие головки машины тьюринга, смотрит она значит на первый элемент очереди.

После этого я запускаю таймер (вся эта муть сделана для I2c, таймер здесь выдаёт такты на линии scl) и выхожу из функции. Всё.

Происходит прерывание: открывается обработчик прерывания и просто смотрит в регистр где лежит адрес выполняемой функции - то есть как головка машины тьюринга, смотрит куда идти дальше. Вызывает подфункцию (это на самом старте будет наша подфункция А по адресу 0x0020), она к примеру выполняется один раз, значит в конце подфункции мы смещаем головку на следующий адрес - всё.

Происходит прерывание: обработчик смотрит в головку и видит, что теперь ему надо вызвать функцию Г, передаёт управление ей. Предположим что функция Г должна передать на линию SDA 8 бит данных (адрес slave-устройства, того же PCF8474). Функция Г выполняется, изменяет состояние своих управляющих регистров и НЕ СМЕЩАЕТ головку.

Происходит прерывание: попадаем в функцию Г, смотрим на состояние регистров, исходя из состояния передаём второй бит на линию SDA.

Ну и в подобном духе. Получается что очередь не динамическая, но в теории я могу её править где и как хочу)
Короче вот такую я придумал херовину. Суть вообще сего замеса была в том, что между прерываниями процессор до это модели тупо висел в задержках и не мог выполнять совершенно другой код. Теперь он может)

Добавлено через 1 час 6 минут
Только вот я пока не знаю как перейти к примеру на инструкцию 0x02AA.

Можно так:
Assembler
1
call 0x02AA
А надо сделать через регистр, как-то так:
Assembler
1
call next_adr
Но регистр то 8 бит, в него 0x02AA не засунуть. Можно как-то обойти это ограничение?
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.01.2016, 17:45
Цитата Сообщение от Gudsaf Посмотреть сообщение
Но регистр то 8 бит, в него 0x02AA не засунуть. Можно как-то обойти это ограничение?
Цитата Сообщение от Витальич Посмотреть сообщение
А косвенный переход в 12 пике есть? Типа JMP [BX+смещение]
????
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 18:08  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
Сообщение от Витальич
А косвенный переход в 12 пике есть? Типа JMP [BX+смещение]
????
Нет, джампов нет - только call и goto: больше вообще нет не каких типов переходов (не считая прерывания). Я пока решил проблему по-костыльному, вроде работает:

Assembler
1
2
3
4
adr EQU 0x000E
;...
call    0x0100+adr
;...
В результате в общем-то я попадаю на 0x010E, но это дерьмовое решение.
Да и как я понял в pic12f инструкция 13 бит. в теории наверное можно сложить два регистра, сейчас проверю:
Assembler
1
2
3
;...
call    reg1+reg2
;...
А вообще там есть раздел целый про адресацию - он по идее должен как-то мне помочь, но я нихрена не понимаю что там написано.
Миниатюры
PIC12F675: программная очередь состоящая из адресов функций и её применение (asm)  
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 18:31  [ТС]
не работает как надо:
Assembler
1
2
3
;...
call    reg1+reg2
;...
Добавлено через 14 минут
добился перехода на 0x010E вот таким образом:
Assembler
1
2
3
4
     movlw  b'00000001' ; это выходит старший бит
     movwf  PCLATH 
     movlw  b'00001110' ; это младший
     movwf  PCL            ; эта команда перекинет на 0000000100001110 = 0x010E
Добавлено через 23 секунды
магия какая-то
0
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
20.01.2016, 18:42
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ORG 0x0020
; код функции A
    ...
    return
 
ORG 0x0040
; код функции G
    ...
    return
 
ORG 0x0080
; код функции E
    ...
    return
 
ORG 0x00A0
; код функции F
    ...
    return
Посмотрите карту памяти контроллера, с 0х20 адреса начинаются регистры общего назначения, по сути оперативная память контроллера. А вы пытаетесь туда программный код запихать.

Есть такая вещь как метка. Посмотрите примеры, и почитайте хелп по мплабу.
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 19:57  [ТС]
Цитата Сообщение от russo turisto Посмотреть сообщение
Посмотрите карту памяти контроллера, с 0х20 адреса начинаются регистры общего назначения, по сути оперативная память контроллера. А вы пытаетесь туда программный код запихать.
Есть такая вещь как метка. Посмотрите примеры, и почитайте хелп по мплабу.
Я использую протеус. Да, вы правы, я ещё раз внимательно посмотрел даташит на PIC12F675 - если оставить как есть, то я займу своим кодом регистры общего назначения. Сейчас перекинем адреса, начну их с 0xE0.

Одно только: я не понимаю зачем вы предлагаете мне использовать метки в условиях моей задачи - они же не потянут. Или вы хотите сказать, что я могу метку (а точнее адрес на который она указывает) передавать в регистр _metka_reg и потом делать call _matka_reg? Да ну нет, не это точно вы хотели мне предложить.
0
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
20.01.2016, 20:48
В качестве примера, код эмулятора таксофонной карты на 12F629, она же лифтовая
обратите внимание на метки и подпрограммы

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
;----------------------------------------------------
; eSLE 4436, ver 2.0         by POL, RUSSIA ' 01.2005
;----------------------------------------------------
        
    LIST    P=PIC12F629, R=HEX, W=1
        #include <p12f629.inc> 
 
DTA equ 0x00    ; GP0
CLK equ 0x02    ; GP2
RST equ 0x03    ; GP3
 
    cblock  0x20                                         
        bit
        block_byte
        work    
        state   ;->b0 - флаг системной области
    endc        ;  b1 - флаг AKT-69
                ;  b2 - флаг WC
                ;  b4 - флаг 64
 
#define BANK0   bcf STATUS,RP0
#define BANK1   bsf STATUS,RP0
 
;***************************************
;             макросы
;---------------------------------------
WR_EEPROM macro
        BANK1
    bsf EECON1,WREN                          
    movlw   0x55
        movwf   EECON2
        movlw   0xAA
        movwf   EECON2
        bsf     EECON1,WR                                         
;   btfsc   EECON1,WR   
;   goto    $-1
        endm
;---------------------------------------
WAIT_1  macro
    BANK0
    btfsc   GPIO,RST    
    goto    rst     ; RST=0/1 при ожидании поднятия CLK 0/1              
    btfss   GPIO,CLK
        goto    $-3         
    endm        
;---------------------------------------
WAIT_0  macro
    BANK0
    btfsc   GPIO,RST    
        goto    rst             ; RST=0/1 при ожидании спада CLK 1/0
    btfsc   GPIO,CLK            
    goto    $-3         
    endm        
;***************************************
 
    org     0x00
 
;=================================================================
;     используем время Vdd ... RESET для загрузки дампа. 
;     считываем кредит:
;-----------------------------------------------------------------
        BANK1                   
    movlw   0x0A            ; EEADR=0A
    movwf   EEADR                 
    bsf EECON1,RD                        
        clrf    state                       
    movf    EEDATA,w
    movwf   0x3A            ; 0A-> в FSR
 
    incf    EEADR,F         ; EEADR=0B     
    bsf EECON1,RD                        
        clrf    0x38        ; старший (8 byte) кредита (00 00 xx xx xx)
    movf    EEDATA,w
        movwf   0x3B            ; 0B-> в FSR
 
    incf    EEADR,F         ; EEADR=0C     
    bsf EECON1,RD                        
        clrf    0x39            ; старший (9 byte) кредита (00 00 xx xx xx)
    movf    EEDATA,W
        movwf   0x3C            ; 0C-> в FSR
;-----------------------------------------------------------------
; проверка кредита -> смена меньше 8 ед.,(0x0C не проверяем, карта 
; не обнуляется до конца => меньше вероятность попасть в стоп-лист).
;-----------------------------------------------------------------
    movf    0x3B,F
    btfss   STATUS,Z    ; Z=1, кредит 0B=0
    goto    @@              ; еще есть -> на работу
    movf    0x3A,F
    btfsc   STATUS,Z    ; Z=1, кредит 0A=0
    goto    smena           ; нет -> smena
;---------------------------------------
@@
    BANK0   
        movlw   0x07
    movwf   CMCON
        movlw   0x20    
    movwf   T1CON       ; TMR1 - 1:4  
 
;------------- damp --------------------                  
    movlw   0xD2        ; 1 byte! -> если 1 байт 0xE9 -> ставить 0xD2 (если 0xE8 -> 0xD0)            
    movwf 0x30         
    movlw   0x22            ; 2 byte     остальные байты (2...16) - без изменений
    movwf 0x31         
    movlw   0xEE            ; 3 byte
    movwf 0x32            
    movlw   0x44            ; 4 byte
    movwf 0x33          
    movlw   0x55            ; 5 byte
    movwf 0x34         
    movlw   0x66            ; 6 byte
    movwf 0x35          
    movlw   0x77            ; 7 byte
    movwf 0x36         
    movlw   0x88            ; 8 byte    
    movwf 0x37         
;----------------------------------------
; кредит 00 00 0x3A 0x3B 0x3C уже считан
;----------------------------------------
    movlw    0xFF           ; 14 byte   FF  
    movwf 0x3D      
;   movlw    0xFF           ; 15 byte   FF (или CRC)  
    movwf 0x3E              
;   movlw    0xFF           ; 16 byte   FF (или CRC)
    movwf 0x3F              
;---------- damp end --------------------   
 
    BANK1   
    bcf TRISIO,0x00 ; настроить GP0 на выход
reset
    BANK0
    btfsc   GPIO,RST    ; RST 1/0
    goto    $-1
    bsf     GPIO,0x00   ; 1 bit = 1!
    movlw   0x30
    movwf   FSR             ; FSR -> на 1 byte 
    movf    INDF,W
    movwf   work            ; 1 byte -> work-регистр
;----------------------------------------
;           1 байт "системки"  
;----------------------------------------
    movlw   0x07            ; 1 bit был (= 1!), осталось еще 7 
    movwf   bit
byte1
  WAIT_1
    rlf     work,F                  ; готовим DTA
    movf    STATUS,w
  WAIT_0    
        movwf   GPIO                    ; DTA -> на выход
    decfsz  bit,F                   ; все 7 бит?
    goto    byte1
    incf    FSR,F
    movf    INDF,W
    movwf   work
;----------------------------------------------------
; оставшиеся 7 байт "системки"(с "зависанием" при WR)  
;----------------------------------------------------
    movlw   0x07            ; следующий блок байтов (2...8 byte) 
    movwf   block_byte
        bsf     state,0     ; флаг системной области        
        clrf    bit
byte2_8
    bsf     bit,3           ; счетчик бит (8->0)
@byte2_8
  WAIT_1
    rlf     work,F                  ; готовим DTA
    movf    STATUS,W
  WAIT_0    
        movwf   GPIO                    ; DTA -> на выход
    decfsz  bit,F                   ; все 8 бит?
    goto    @byte2_8
    incf    FSR,F
    movf    INDF,W
    movwf   work
    decfsz  block_byte,F            ; все 7 байт "системки"?
    goto    byte2_8
        bcf     state,0     ; вышли из системной области     
;---------------------------------------
;           5 байт кредита
;---------------------------------------
    movlw   0x05            ; очередной блок байтов 
    movwf   block_byte
byte_credit
    bsf     bit,3           ; счетчик бит (8->0)
@byte_credit
  WAIT_1
    rlf     work,F                  ; готовим DTA
    movf    STATUS,W
  WAIT_0    
    bcf state,2             ; CLK прошел без WR => флаг WC можно сбросить
        movwf   GPIO                    ; DTA -> на выход
    decfsz  bit,F                   ; все 8 бит?
over    goto    @byte_credit
    incf    FSR,F
    movf    INDF,W
    movwf   work
    decfsz  block_byte,F            ; все 5 байт кредита?
    goto    byte_credit
;---------------------------------------
;       еще 3 байта (итого 16)
;---------------------------------------
    movlw   0x03                 
    movwf   block_byte
byte_CRC
    bsf     bit,3           ; счетчик бит (8->0)
@byte_CRC
  WAIT_1
    rlf     work,F                  ; готовим DTA
    movf    STATUS,W
  WAIT_0    
        movwf   GPIO                    ; DTA -> на выход
    decfsz  bit,F                   ; все 8 бит?
    goto    @byte_CRC
    incf    FSR,F
    movf    INDF,W
    movwf   work
    decfsz  block_byte,F            ; все 3 байтa? 
    goto    byte_CRC
;---------------------------------------
;     и еще осталось 48 байт (все FF)
;---------------------------------------
    movlw   0x30                ; след. 48 byte 
    movwf   block_byte
byte_FF
    bsf     bit,3           ; счетчик бит (8->0)
        movlw   0x01            ; 64 byte ?
        subwf   block_byte,W        
        btfsc   STATUS,Z        
        bsf state,4             ; флаг 64 byte
@byte_FF
  WAIT_1
  WAIT_0    
        bsf     GPIO,DTA                ; просто DTA=1 все 48 байт :)
    decfsz  bit,f                   ; все 8 бит?
    goto    @byte_FF
    decfsz  block_byte,f            ; все 48 байтa? 
    goto    byte_FF
                bcf     state,4                 ; флаг 64 сброшен
        goto    reset                   ; 16+48=64 byte -> 1 byte
;--------------------------------------
erase   
    addwf   PCL,F
    nop
    retlw   B'11111101'
    retlw   B'11111011'
    retlw   B'11110111'
    retlw   B'11101111'
    retlw   B'11011111'
    retlw   B'10111111' 
    retlw   B'01111111'
    retlw   B'11111110'
;---------------------------------------
WR_WC
        btfsc   state,0                   
    goto    zavisli                 ; -> попытка WR! в "системку" -> zavisli
        btfsc   bit,3               
        decf    FSR                     ; коррекция 1/8 бита при read/wr
    btfsc   state,4                 
    goto    smena                   ; WR/64?
    btfsc   state,2                 
    goto    WC                      ; WR+WR?
    
        clrf    TMR1H        ;;<-- если нет АКТ-69, можно закомментировать этот кусок1 (их 3).         
        clrf    TMR1L        ;; можно оставить, хуже не будет...но см. комментарий "N.B." после end.
        bsf T1CON,0      ;;     ; -> вкл. таймер  TMR1 
 
    movf    bit,W   
        call    erase
        andwf   INDF,F          
    BANK1
    movlw   0x30
    subwf   FSR,W                   ; FSR <-> EEADR
    movwf   EEADR               
        movf    INDF,W          ; INDF -> EEDATA    
    movwf   EEDATA          ; копируем байт параллельно FSR/EEPROM
    WR_EEPROM
 
@U                           ;;<-- если нет АКТ-69,можно закомментировать этот кусок2 (см.в WC тоже)
        BANK0                ;;                      
        btfss   GPIO,CLK     ;;     ; TMR1 -> 1:4 - при 20мгц 1такт = 0,8мкс   
        goto    @@U          ;;     ; если CLK кончится раньше  (AKT=4ms, SmartLab=1...2ms)
    movlw   0x1D         ;;     ; 7500 тактов (6 мс)  
    subwf   TMR1H,W      ;;     ; проверяем только TMR1H (TMR1L малоинформативен)
    btfss   STATUS,C     ;;     ; C=1 - перебор
    goto    @U       ;;     ; крутим ожидание         
        bcf T1CON,0      ;;     ; TMR1 выкл., прошло 6 мс, определяемся ... 
@@U                          ;;
;;;     btfss   GPIO,CLK     ;;         ; при рациональном подходе - лишняя команда ;)
        bsf state,1      ;;     ; CLK закончен -> AKT, выставим флаг АКТ 
        btfsc   GPIO,CLK     ;; 
        bcf state,1      ;;     ; CLK еще идет -> нормальный аппарат
 
;   btfsc   EECON1,WR     ;!<-- а этот раскомментировать! <-- (если нет АКТ-69) 
;   goto    $-1           ;!
;---------------------------------------
WR_end  
    BANK0               
    btfsc   GPIO,RST    
    goto    reset               
    btfsc   GPIO,CLK        
    goto    WR_end              
    bcf     GPIO,0x00   ; по спаду CLK/WR -> DTA=0 
    bsf state,2         ; флаг WC поднять
        btfsc   bit,3       ; коррекция 1/8 бита при read/wr (возврат)
        incf    FSR
    goto    over            ; на след. бит кредита
;---------------------------------------
WC                                                      
    BANK1
    incf    FSR,F
    movlw   0x30
    subwf   FSR,W                   ; FSR <-> EEADR
    movwf   EEADR       
    movlw   0xFF
        movwf   INDF                ; 0xFF -> параллельно FSR/EEPROM
    movwf   EEDATA          
    bcf state,2             ; флаг WC сброшен
 
        btfsc   state,1     ;; <-- если нет АКТ-69, можно закомментировать этот кусок3                                      
        goto    WC_end      ;; -> AKT -> FSR, мимо записи WC/FF в ЕЕПРОМ                
 
    WR_EEPROM 
    btfsc   EECON1,WR   
    goto    $-1
;--------------------------------------
WC_end                          
    decf    FSR,F
        BANK0
    btfsc   GPIO,RST
    goto    reset
        btfsc   GPIO,CLK
        goto    $-3 
        btfsc   bit,3       ; коррекция 1/8 бита при read/wr (возврат)
        incf    FSR
        goto    over        ; по спаду CLK/WR -> на след. бит кредита
;---------------------------------------
zavisli 
    movf    GPIO,F          ; текущий бит -> на выход
    btfsc   GPIO,CLK        
    btfss   GPIO,RST    
    goto    zavisli     ; зависли до RESETa или до снятия Vdd -> org 0x00 -> reset              
    goto    reset               
;---------------------------------------
rst 
        movf    GPIO,W      ; сохранить DTA->W
    bcf GPIO,DTA    ; раз RST=1 => DTA=0
    btfsc   GPIO,CLK     
        goto    reset       ; CLK=1,RST=1 => reset
    btfsc   GPIO,RST    ; CLK=0
    goto    $-3     ; ждем RST=1/0,CLK=0    
        movwf   GPIO        ; восстановить DTA
        btfsc   GPIO,RST     
        goto    rst             ; RST=1 -> rst -> DTA=0 -> по кругу ...
        btfss   GPIO,CLK        ; дождались RST=1/0,CLK=0
        goto    $-3             ; ждем CLK=0/1
    goto    WR_WC           ; CLK=1 ? => WR/WC
;---------------------------------------
smena
;-------------------------------------------------------------------------------------------
; на 20 кгц чтение  16 байт займет 6,4 мс, т.е. времени Vdd хватит (наверняка) только
; на 1 запись, поэтому восстанавливаем только старший счетчик. В 0х0С может остаться 7F...0.
; Экстренная смена кредита -> после удара WR! в SmartLabe по любому биту 64 байта.
;-------------------------------------------------------------------------------------------
        BANK1                   
        movlw   0x0A            ;           (00 FF 3F =  70)
        movwf   EEADR           ;               (07 00 FF = 200)
        movlw   0x7F        ;               (0F 1F 0F = 300) 
    movwf   EEDATA          ;               (7F 3F 0F = 500)
    WR_EEPROM               ; EEADR=0x0A -->(7F 00 7F...00 = 455...448 ед.)
    btfsc   EECON1,WR   ;       ~~~~     ~~
    goto    $-1                                          
 
;       goto    $               ; зациклиться до сброса
    goto    reset
;---------------------------------------
          
 
    org 0x2100  ; из eeproma считываются только 3 байта кредита  (0x0A,0x0B,0x0C)
 
 
    DE 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
    DE 0x00,0x00,0x0F,0x1F,0x0F,0xFF,0xFF,0xFF
        DE '-', '-', '-', '-', '-', '-', '-', '-'
    DE 'e', 'S', 'L', 'E', '4', '4', '3', '6'
    DE ' ', 'b', 'y', ' ', 'P', 'o', 'l', ' '
        DE ' ', 'v', 'e', 'r', ' ', '2', '.', '0'
    DE '-', '-', '-', '-', '-', '-', '-', '-'
        DE 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
        DE 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
    
 
        __config   0x3117   ; конфигурация RCclkout, CP+.(R=3ком,f=20 мГц)
 
 
    end
Добавлено через 1 минуту
Немного сместилась табуляция, взято http://www.hackersrussia.ru/Ca... 9byPOL.zip

Добавлено через 18 минут
MPLAB X IDE. Руководство на русском
описание МПЛАБ

http://www.pic24.ru/lib/exe/fe... atting.pdf

https://yandex.kz/search/?text... id=2186620
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
20.01.2016, 21:27  [ТС]
Цитата Сообщение от russo turisto Посмотреть сообщение
Немного сместилась табуляция, взято http://www.hackersrussia.ru/Ca... 9byPOL.zip
Добавлено через 18 минут
MPLAB X IDE. Руководство на русском
описание МПЛАБ
http://www.pic24.ru/lib/exe/fe... atting.pdf
Вот за это спасибо, особенно за pdf - есть над чем работать)

А по поводу переходов по условию, да, я знаю про них - но используемый pic (pic12f675) не знает про них.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2016, 21:27
Помогаю со студенческими работами здесь

Очередь, состоящая из точек координатной плоскости
Доброго времени суток. Мне необходимо создать очередь, состоящую из пар чисел (х и у) и создать функции удаления, добавления элементов в...

Стопка, Очередь, Куча и их аппаратная и программная реализация
Стопка(Stack) — абстрактный тип данных, представляющий собой набор элементов, организованных по принципу LIFO(Last In, First...

Применение деков (двусторонняя очередь, double ended queue)
Назовите, пожалуйста применение деков (двусторонних очередей) в реальной жизни. Из примеров знаю только железнодорожный разъезд: вагоны...

Создать массив адресов функций
Помогите пожалуйста создать массив адресов функций. Не могу понять как записать это //вид функции bool MyFunc() { ... } ...

Получение адресов функций OpenGL
Решил пойти по стопам товарища, что писал на чистом WinApi (то есть без всяких freeglut'ов и GLWF'ов) и наткнулся на одну проблему. Я...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru