0 / 0 / 0
Регистрация: 10.05.2024
Сообщений: 12
1

Инструкция CPSE неисправна. AVR

12.08.2024, 22:40. Показов 833. Ответов 12

Author24 — интернет-сервис помощи студентам
Написал код на ASM, не работал. Команда CPSE должна была сравнить первую РОН с нулем и перепрыгнуть через следующую инструкцию, но вместо этого оказывалась на дальней метке, явно продолжая выполнять инструкции. Исправил заменив:
CPSE r17, r19 ;r19 равно Нулю
...
на
CPI r17, 0
BRBS SREG_Z, zero ;Если Ноль, перепрыгиваем к zero.
...
zero
...
Все заработало.
Но никак не пойму как эта ошибка вызывается!!.А вот тема где началась проблема, но читать необязательно, тут повторю код
SPI на AVR через ASSEMBLER
Течение этой ошибки:
Наш контроллер включает SPI в режиме Slave, получает сообщение от MASTER, ставит HIGH на P7, перезагружается, естественно сбрасывая r17 и P7, а дальше чудо, стоит Даже пальцем дотронуться до контактов MOSI, MISO или SCLK он каким то образом попадает на метку funf и там выставляется HIGH на P7 (ключ), проигнорировав этапы проверки пароля на активацию. Funf находится на 0x3A что выходит за рамки прерываний и вообще виновата логика, если добавить еще кода он все равно переходит на метку.
Пробывал в 3-х контроллерах!
Сразу говорю, чтобы пройти поэтапные проверки символов r17 должен себе присвоить число больше >7 - 0bxxxxx000. Я предполагал что он с выставлением флагов тоже себе пробивал эти флаги. Но сделав проверку r17 на наличие числа, он оказался пуст. Как он оказывается на метке funf? или почему ставится P7 лишь одним соприкасанием с SCLK?
Slave:
Кликните здесь для просмотра всего текста
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
rjmp main
 
.org $22
SPItran:
;LDI R20, $00
;OUT SPDR, r20          ; Пакет отправляется в SPDR до Прерывания SPE и до 9-го Такта!!!
                        ; Иначе не успевает перестроиться с Повторения на Пакет
in r16, SPDR
 
; Следующая программа сравнивает полученные коды, если не совпало,
;сново возвращается к первому значению, пока не совпадет весь порядок букв кода (предложения).
; Как код подойдет загорается Лампочка на PD7.
 
cpse r17, r19           ;КОММАНДА Глючная! Допускает прыжок до метки funf
                    ;Если равен нулевому Этапу проверки кода, то идем к проверке символа
rjmp zwei                   ;Если уже имеется следующая буква кода, то перепрыгиваем к другим Этапам кода
CPI r16, 's'                ;Первая буква кода
BRBc SREG_Z, end            ;Не Совпала буква кода, то снова Аннулируемся до нулевого этапа
LDI r17, 0b00000001     ;Идем дальше
reti
zwei:                       ;Другие буквы предложения...
SBRS r17, 0
rjmp drei
CPI r16, 'f'            ;s
BRBc SREG_Z, end
LDI r17, 0b00000010     ;Идем дальше
reti
drei:
SBRS r17, 1
rjmp vier
CPI r16, 'e'            ;f
BRBc SREG_Z, end
LDI r17, 0b00000100     ;Идем дальше
reti
vier:
SBRS r17, 2
rjmp funf
CPI r16, 'r'            ;e
BRBc SREG_Z, end
LDI r17, 0b00001000         ;Идем дальше
funf:
SBI portd, 7                ;Код прочитался, Выставляем P7
end:                ; Аннулирование этапов проверки Предложения
CLR r17
reti
 
main:
SBI DDRB, 5         ;SCLK   
СBI DDRB, 4            ;MISO
SBI DDRB, 3         ;MOSI
SBI DDRB, 2         ;SS
    SBI DDRD, 7     ;Место лампочки, подтверждающая получение пакета
    
LDI r16, $C0            ; А теперь включаю приемку
OUT SPCR, r16
LDI R20, $00            ; Чтобы не словить Мастеру пакет $80. В первом такте
OUT SPDR, r20           ; Slave находится в простое с Поднятой у себя линией MISO.
sei
                        ; Во время SPI PinB прочитать невозможно.
start:
    rjmp start          ;Ждем наполнения (SPIF)


Master:
Кликните здесь для просмотра всего текста
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
rjmp main
.org $22
income:
 
 SBI PORTB, 2
 delay3:                    ;Прожимаем SS для восставноления коллизии приема SLAVE.
 inc r18                    ;Но это еще не Хеш сумма проверяющая правильность пакетов.
 BRBC SREG_Z,  delay3
 CBI PORTB, 2
 
again:                      ;Начинаем по очереди загружать байты в SPDR
;CPI r17, 0
;BRBS SREG_Z, zero
CPSE r17, r19       ;КОММАНДА Глючная! тут может перестать отправлять символы выходя на метку end
rjmp zwei
;zero:
LDI r16, 's'
OUT SPDR, r16
LDI r17, 0b00000001     ;Идем дальше
reti
zwei:
SBRS r17, 0
rjmp drei
LDI r16, 'f'
OUT SPDR, r16
LDI r17, 0b00000010     ;Идем дальше
reti
drei:
SBRS r17, 1
rjmp vier
LDI r16, 'e'
OUT SPDR, r16
LDI r17, 0b00000100     ;Идем дальше
reti
vier:
SBRS r17, 2
rjmp end
LDI r16, 'r'
OUT SPDR, r16
LDI r17, 0b00001000     ;Идем дальше
reti
end:
 
CLR r17
rjmp income
 
reti
 
main:
SBI DDRB, 5
CBI DDRB, 4
SBI DDRB, 3
SBI DDRB, 2         ; Обязательно ставить на вывод! иначе переключится с MSTR на SLAVE
 
 delay:             ;Время на инициализацию SLAVE в Proteus
 inc r18
 BRBC SREG_Z,  delay
 
LDI r16, $D3
OUT SPCR, r16       ;Включаем SPI MSTR на /128 (64 такта SCLK в положение ↑, другая половина ↓).
sei
rcall income        ; Но для срабатывания прерывания надо сначало что то отправить,
                    ; из за этого идем сразу в прерывание
start:
     rjmp start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2024, 22:40
Ответы с готовыми решениями:

Неисправна ОП
На микросхеме приплавленная поверхность. Как такое возможно?

Мышь неисправна
Здравствуйте. Около трех месяцев назад у меня начал перетираться кабель моей мыши. В один...

GF 6600 неисправна?
Перестал загружаться комп. Механических повреждений не было, гарью не пахло, конденсаторы везде...

Неисправна Функция BitBlt
Подскажите пожалуйста , нужно скопировать изображение на windows form из pictureBox1 в pictureBox2....

12
Просто Лис
Эксперт Python
5961 / 3724 / 1097
Регистрация: 17.05.2012
Сообщений: 10,775
Записей в блоге: 9
13.08.2024, 19:56 2
Если честно, мне комбинация команд cpse + rjmp не нравится. Зачем вам безусловный переход, если есть условный?

На мой взгляд, команда cpse создана для реализации условного сложения, например.

Assembler
1
2
3
cpse r17, r19
inc r17
nop
Добавлено через 18 минут
Ещё мне не нравится, как у вас сделана таблица прерываний. Может такое произойти, что у вас срабатывается какое-то необратываемое прерывание.

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
; Векторы прерываний в ATmega128
.org $0000  ; RESET
    rjmp RESET
 
.org $0022  ; Завершение последовательной передачи интерфейсом SPI
    rjmp SPI_STC
 
RESET:
    SBI DDRB, 5         ;SCLK   
    СBI DDRB, 4            ;MISO
    SBI DDRB, 3         ;MOSI
    SBI DDRB, 2         ;SS
    SBI DDRD, 7     ;Место лампочки, подтверждающая получение пакета
 
    LDI r16, $C0            ; А теперь включаю приемку
    OUT SPCR, r16
    LDI R20, $00            ; Чтобы не словить Мастеру пакет $80. В первом такте
    OUT SPDR, r20           ; Slave находится в простое с Поднятой у себя линией MISO.
    sei
                        ; Во время SPI PinB прочитать невозможно.
start:
    rjmp start          ;Ждем наполнения (SPIF)
 
SPI_STC:
    ;LDI R20, $00
    ;OUT SPDR, r20          ; Пакет отправляется в SPDR до Прерывания SPE и до 9-го Такта!!!
                            ; Иначе не успевает перестроиться с Повторения на Пакет
    in r16, SPDR
     
    ; Следующая программа сравнивает полученные коды, если не совпало,
    ;сново возвращается к первому значению, пока не совпадет весь порядок букв кода (предложения).
    ; Как код подойдет загорается Лампочка на PD7.
     
    cpse r17, r19           ;КОММАНДА Глючная! Допускает прыжок до метки funf
                        ;Если равен нулевому Этапу проверки кода, то идем к проверке символа
    rjmp zwei                   ;Если уже имеется следующая буква кода, то перепрыгиваем к другим Этапам кода
    CPI r16, 's'                ;Первая буква кода
    BRBc SREG_Z, end            ;Не Совпала буква кода, то снова Аннулируемся до нулевого этапа
    LDI r17, 0b00000001     ;Идем дальше
    reti
    
zwei:                       ;Другие буквы предложения...
    SBRS r17, 0
    rjmp drei
    CPI r16, 'f'            ;s
    BRBc SREG_Z, end
    LDI r17, 0b00000010     ;Идем дальше
    reti
    
drei:
    SBRS r17, 1
    rjmp vier
    CPI r16, 'e'            ;f
    BRBc SREG_Z, end
    LDI r17, 0b00000100     ;Идем дальше
    reti
    
vier:
    SBRS r17, 2
    rjmp funf
    CPI r16, 'r'            ;e
    BRBc SREG_Z, end
    LDI r17, 0b00001000         ;Идем дальше
    
funf:
    SBI portd, 7                ;Код прочитался, Выставляем P7
end:                ; Аннулирование этапов проверки Предложения
    CLR r17
    reti
Добавлено через 3 минуты
И стек не проинициализирован, хотя вы используете его (при прерываниях). упс!

Assembler
1
2
3
4
5
RESET:
    ldi r16, high(RAMEND)
    out SPH, r16 
    ldi r16, low(RAMEND)
    out SPL, r16
1
3968 / 2512 / 422
Регистрация: 09.09.2017
Сообщений: 11,108
14.08.2024, 09:51 3
Цитата Сообщение от Sferus Посмотреть сообщение
Инструкция CPSE неисправна.
Пример кода в студию. Минимальный, на котором ваша ошибка воспроизводится.
0
0 / 0 / 0
Регистрация: 10.05.2024
Сообщений: 12
14.08.2024, 22:02  [ТС] 4
Очень приятно увидеть новый код.
имею дело с Atmega328p и вроде у всех Mega уже выставлено известное число оперативной памяти Stack Point. У меня 3 маленьких добуцу Atmega328p.
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
И стек не проинициализирован, хотя вы используете его (при прерываниях). упс!
И вот попробовал новый код с Наоборот стоящей инициализацией, Теперь P7 загорается без инструкции CPSE. Нули на R17, а он все равно до него доходит до метки funf. Как, если все, кроме spi, прерывания выключены ( ̄ヘ ̄)┌?
Кликните здесь для просмотра всего текста
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
.org $0000  ; RESET
    rjmp RESET
 
.org $0022  ; Завершение последовательной передачи интерфейсом SPI
    rjmp SPI_STC
 
RESET:
    SBI DDRB, 5         ;SCLK   
    CBI DDRB, 4            ;MISO
    SBI DDRB, 3         ;MOSI
    SBI DDRB, 2         ;SS
    SBI DDRD, 7     ;Место лампочки, подтверждающая получение пакета
 
    LDI r16, $EB ; PRR кроме SPI
    STS PRR, r16
    ldi r16, high(RAMEND)
    out SPH, r16 
    ldi r16, low(RAMEND)
    out SPL, r16
    ldi r16, $80
    out ACSR ,r16
    LDI r16, $C0            ; А теперь включаю приемку
    OUT SPCR, r16
    LDI R20, $00            ; Чтобы не словить Мастеру пакет $80. В первом такте
    OUT SPDR, r20           ; Slave находится в простое с Поднятой у себя линией MISO.
    sei
                        ; Во время SPI PinB прочитать невозможно.
start:
    rjmp start          ;Ждем наполнения (SPIF)
 
SPI_STC:
    ;LDI R20, $00
    ;OUT SPDR, r20          ; Пакет отправляется в SPDR до Прерывания SPE и до 9-го Такта!!!
                            ; Иначе не успевает перестроиться с Повторения на Пакет
    in r16, SPDR
     
    ; Следующая программа сравнивает полученные коды, если не совпало,
    ;сново возвращается к первому значению, пока не совпадет весь порядок букв кода (предложения).
    ; Как код подойдет загорается Лампочка на PD7.
                         ;Начинаем по очереди загружать байты в SPDR
CPI r17, 0
BRBS SREG_Z, zero      ;Вместо CPSE
rjmp zwei
zero:         ;КОММАНДА Глючная! Допускает прыжок до метки funf
                        ;Если равен нулевому Этапу проверки кода, то идем к проверке символа
    rjmp zwei                   ;Если уже имеется следующая буква кода, то перепрыгиваем к другим Этапам кода
    CPI r16, 's'                ;Первая буква кода
    BRBc SREG_Z, end            ;Не Совпала буква кода, то снова Аннулируемся до нулевого этапа
    LDI r17, 0b00000001     ;Идем дальше
    reti
    
zwei:                       ;Другие буквы предложения...
    SBRS r17, 0
    rjmp drei
    CPI r16, 'f'            ;s
    BRBc SREG_Z, end
    LDI r17, 0b00000010     ;Идем дальше
    reti
    
drei:
    SBRS r17, 1
    rjmp vier
    CPI r16, 'e'            ;f
    BRBc SREG_Z, end
    LDI r17, 0b00000100     ;Идем дальше
    reti
    
vier:
    SBRS r17, 2
    rjmp funf
    CPI r16, 'r'            ;e
    BRBc SREG_Z, end
    LDI r17, 0b00001000         ;Идем дальше
    
funf:
    SBI portd, 7                ;Код прочитался, Выставляем P7
end:                ; Аннулирование этапов проверки Предложения
    CLR r17
    reti


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пример кода в студию. Минимальный, на котором ваша ошибка воспроизводится.
Уже попробовал алгоритмы с CPSE и там все работало. А код выше каким то образом выполняет инструкцию за меткой funf.
А ведь ошибка пропадала когда я менял CPSE на SBRS инструкцию.
0
Просто Лис
Эксперт Python
5961 / 3724 / 1097
Регистрация: 17.05.2012
Сообщений: 10,775
Записей в блоге: 9
15.08.2024, 16:04 5
Ты предлагаешь нам без отладчика понять, что происходит в твоём коде? Упрости код, пока он не станет соответствовать твоим ожиданиям, а потом усложняй.

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
.include "m328pdef.inc"
 
; .def tmp = r16
 
.cseg
.org $0000  ; RESET
    rjmp RESET
 
.org $0022  ; SPI serial transfer complete
    rjmp SPI_STC
 
RESET:
    ; инициализация указателя стека
    ldi r16, LOW(RAMEND)
    out SPL, r16
    ldi r16, HIGH(RAMEND)
    out SPH, r16
 
    ; порт с "лампочкой"
    ldi r16, (1 << DDRD7)
    out DDRD, r16
    ldi r16, (0 << PORTD7)
    out PORTD, r16
 
    ; Analog Comparator Control and Status Register
    ; ldi r16, (1 << ACD)
    ; out ACSR, r16
 
    ; Power Reduction Register
    ; ldi r16, (1 << PRTWI)
    ; out PRR, r16
 
SPI_SlaveInit:
    ; Set MISO output, all others input
    ldi r16, (1 << DD_MISO)
    out DDR_SPI, r16
    
    ; SPI Control Register
    ; * SPI Interrupt Enable
    ; * SPI Enable
    ; * Master/Slave Select
    ldi r16, (1 << SPIE) | (1 << SPE) | (0 << MSTR)
    out SPCR, r16
 
    ; LDI R20, $00            ; Чтобы не словить Мастеру пакет $80. В первом такте
    ; OUT SPDR, r20           ; Slave находится в простое с Поднятой у себя линией MISO.
    
    sei
    
start:
    rjmp start
 
SPI_STC:
    ldi r16, (1 << PORTD7)
    out PORTD, r16
    reti
1
0 / 0 / 0
Регистрация: 10.05.2024
Сообщений: 12
15.08.2024, 19:32  [ТС] 6
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Упрости код, пока он не станет соответствовать твоим ожиданиям, а потом усложняй.
Я просто уже не знал в какую сторону упрощать. Попался на том что после прошивания Загрузчик очищает РОН, а после перезагрузки РОНы могут быть чем то заполнены.

CPSE исправна, проблема решена: По перепрошиванию МК - Загрузчик очищает РОН ячейки. А после обычного запуска МК - загрузчик запихивает левые значения в РОН. В регистре r19 были левые значения.

И это у меня atmega328p и троя они у меня разных производителей а загрузчики одинаковые. Меня еще эмулятор запутал, там пытался выяснить.
0
3968 / 2512 / 422
Регистрация: 09.09.2017
Сообщений: 11,108
15.08.2024, 20:36 7
А на основании чего вы полагали, что в регистрах будут нули?
И, кстати, надеюсь, вы не ожидаете, что оперативка при включении также содержит нули.
Цитата Сообщение от Sferus Посмотреть сообщение
Загрузчик очищает РОН
Какой еще загрузчик? Свежекупленная микросхема никаких загрузчиков не содержит.
1
0 / 0 / 0
Регистрация: 10.05.2024
Сообщений: 12
15.08.2024, 21:37  [ТС] 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Свежекупленная микросхема никаких загрузчиков не содержит.
Извиняюсь! плата Arduino с atmega
0
11 / 11 / 0
Регистрация: 23.01.2019
Сообщений: 67
16.08.2024, 07:46 9
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Если честно, мне комбинация команд cpse + rjmp не нравится.
Мне тоже ))
Если на "0" проверять, то вместо CPSE наверное лучше tst использовать. И не нужно дополнительный регистр задействовать.
Assembler
1
2
    tst R16
    breq куда_нибудь;     если 0 или минус, то переходим
1
3968 / 2512 / 422
Регистрация: 09.09.2017
Сообщений: 11,108
16.08.2024, 12:09 10
Цитата Сообщение от shonty Посмотреть сообщение
Если на "0" проверять, то вместо CPSE наверное лучше tst использовать.
Если на любую константу, то cpi
Цитата Сообщение от shonty Посмотреть сообщение
breq куда_нибудь; если 0 или минус, то переходим
breq это "строго равно"
1
Просто Лис
Эксперт Python
5961 / 3724 / 1097
Регистрация: 17.05.2012
Сообщений: 10,775
Записей в блоге: 9
16.08.2024, 13:58 11
Цитата Сообщение от Sferus Посмотреть сообщение
после перезагрузки РОНы могут быть чем то заполнены.
Непроинициализированная переменная. Классика!
1
3968 / 2512 / 422
Регистрация: 09.09.2017
Сообщений: 11,108
16.08.2024, 15:16 12
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Непроинициализированная переменная. Классика!
Ладно еще переменные, тот же Си гарантирует, что некоторые "неинициализированные" переменный будут инициализированы нулями. Но как можно ожидать нахождения какого-либо значения в регистрах?!
1
0 / 0 / 0
Регистрация: 10.05.2024
Сообщений: 12
21.08.2024, 11:28  [ТС] 13
Цитата Сообщение от shonty Посмотреть сообщение
tst R16
breq куда_нибудь; если 0 или минус, то переходим
А я перепутал TEST AI32 с TST AVR, думал такой мнемоники уже нет, вот и не компилировался
0
21.08.2024, 11:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2024, 11:28
Помогаю со студенческими работами здесь

Неисправна sim-карта
Объясните возможно ли такое. Знаю что симка точно исправна, работает на Soni xpreia, но когда...

Неисправна оперативная память
Всем здравствуйте! Память CRUCIAL CT102464BA1339 DDR3- 8Гб 1333 Проблема значит вот какая, при...

неисправна сетевая карта
соединение по adsl, dhcp, модем в бридже, сессию подымает сам сервер, через некоторое время...

Неисправна оперативна память
Добрый день, хотел бы спросить насчет странной вещи - взял чинить компьютер друга, требовалась...

AVR JTAG mkI + avarice + avr-gdb + Linux
По какой то неведомой причине мне причине не могу нормально подключится к серверу avarice через...

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru