Реанимация древних машин. На фанерке.
Re: Реанимация древних машин. На фанерке.
тогда по-моему SPI не будет.....
то есть при старте системы должен отрабатываться PD5 (17 вывод). если он в единице, то пойдет инициализация UART.
если он в нуле, то в регистр MCUCR должно записаться
MCUCR = (1<<SPIPS);
и пойти инициализация SPI
то есть при старте системы должен отрабатываться PD5 (17 вывод). если он в единице, то пойдет инициализация UART.
если он в нуле, то в регистр MCUCR должно записаться
MCUCR = (1<<SPIPS);
и пойти инициализация SPI
Не стоит прислушиваться к моему мнению- оно бывает ошибочным.
Re: Реанимация древних машин. На фанерке.
Егор, давай без домыслов и аналогий. USART работает по инструкции из даташита, SPI инициализирова по даташиту, функция передачи по SPI тоже из шиита. Теперь посмотри сам есть ли там приведенные тобой инструкции. В даташитах тоже не все гладко бывает, ну, так пишут... Спроси у Регрессора, он силён в прогерстве.
Re: Реанимация древних машин. На фанерке.
Komrad... Я в коде вижу только это:
Больше в коде обращений к MCUCR я не нашел. Биты 0,1 ставятся в 1 это нормально, а вот выставляемый в 1 бит 2 в даташите отсутствует.
И да - бит 7 (SPIPS) не выставляется. Может бажные дефайны ?
Опа. Меня терзают смутные сомнения.... А ведь 0b111 это 7... Komrad, а скажи ты можешь посмотреть у себя как определено значение SPIPS ? Если SPIPS не маска, а номер бита, то и получается такой очешуенный код. По идее тогда правильно будет
MCUCR |=(1 << SPIPS);
Посмотрел все еще раз внимательно. Komrad, это и есть бага. Можно смело менять MCUCR |=SPIPS; на MCUCR |=(1 << SPIPS);
Код: Выделить всё
in r24, MCUCR ; MCU Control Register
ori r24, 0b111 ; IVCE = 1 (enable Interrupt Vector Change)
; IVSEL = 1 (Interrupt Vector Select)
; XXX = 1 (What the fuck ???)
out MCUCR, r24 ; MCU Control Register
И да - бит 7 (SPIPS) не выставляется. Может бажные дефайны ?
Опа. Меня терзают смутные сомнения.... А ведь 0b111 это 7... Komrad, а скажи ты можешь посмотреть у себя как определено значение SPIPS ? Если SPIPS не маска, а номер бита, то и получается такой очешуенный код. По идее тогда правильно будет
MCUCR |=(1 << SPIPS);
Посмотрел все еще раз внимательно. Komrad, это и есть бага. Можно смело менять MCUCR |=SPIPS; на MCUCR |=(1 << SPIPS);
Re: Реанимация древних машин. На фанерке.
спсибо
сорри, но все-таки может
MCUCR = (1<<SPIPS);
т.е. без вертикальной черты. я так понимаю она ставится когда идет перечисление...ну тип а так (это пример)
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
Не стоит прислушиваться к моему мнению- оно бывает ошибочным.
Re: Реанимация древних машин. На фанерке.
Срочно учить матчасть!
Вертикальная черта означает операцию логического или (OR). Соответственно в С строчка
MCUCR |= (1<<SPIPS); означает
MCUCR = MCUCR | (1<<SPIPS);
Т.е. мы устанавливаем в 1 только один единственный бит - 7ой. Все остальные биты остаются как есть.
Запись вида MCUCR = (1<<SPIPS); приведет к записи в регистр 7 нулей и 1 единицы и все значения что там были будут перезаписаны.
Не стоит этого делать.
З.Ы. MCUCR |= SPIPS дает в результате MCUCR = MCUCR | 7 В результате биты с 0 по 2 будут равны 1.
Оператор << сдвигает первый операнд (1) на SPIPS битов (7) и в итоге дает число 128 (что битами будет 10000000).
egor1, рекомендую изучить с лупой вот эту статью: https://learnc.info/c/bitwise_operators.html
Битовые операции это базис в программировании микроконтроллеров - без их понимания будет грустно и непонятно.
Как мне сейчас грустно глядеть на некоторые части схемы без понимания как оно работает
Вообще я думаю сообща у нас знаний в электронике и программировании хватит, чтобы фанерку до ума довести...
Вертикальная черта означает операцию логического или (OR). Соответственно в С строчка
MCUCR |= (1<<SPIPS); означает
MCUCR = MCUCR | (1<<SPIPS);
Т.е. мы устанавливаем в 1 только один единственный бит - 7ой. Все остальные биты остаются как есть.
Запись вида MCUCR = (1<<SPIPS); приведет к записи в регистр 7 нулей и 1 единицы и все значения что там были будут перезаписаны.
Не стоит этого делать.
З.Ы. MCUCR |= SPIPS дает в результате MCUCR = MCUCR | 7 В результате биты с 0 по 2 будут равны 1.
Оператор << сдвигает первый операнд (1) на SPIPS битов (7) и в итоге дает число 128 (что битами будет 10000000).
egor1, рекомендую изучить с лупой вот эту статью: https://learnc.info/c/bitwise_operators.html
Битовые операции это базис в программировании микроконтроллеров - без их понимания будет грустно и непонятно.
Как мне сейчас грустно глядеть на некоторые части схемы без понимания как оно работает
Вообще я думаю сообща у нас знаний в электронике и программировании хватит, чтобы фанерку до ума довести...
Последний раз редактировалось Regressor 25 окт 2017, 08:19, всего редактировалось 2 раза.
Re: Реанимация древних машин. На фанерке.
Вот и даташит, мать его. Говорил мне папа - не вірь написаному. Однако интерес возраждается...
Re: Реанимация древних машин. На фанерке.
то есть в прошиве альтернативный порт правильно прописан?
Не стоит прислушиваться к моему мнению- оно бывает ошибочным.
Re: Реанимация древних машин. На фанерке.
Нет, в прошиве сейчас бит SPIPS не меняется и соответственно альтернативка не задается. В даташите ошибка - он тупо не совпадает с константами в среде программирования.
Re: Реанимация древних машин. На фанерке.
Komrad, самое смешное в данной ситуации то, что когда я ковырял прошивку в начале этого года я ведь заметил в этом месте, что какая-то ерундистика происходит и биты меняются, отсутствующие в даташите. Но решил, что я что-то не так отреверсил, поставил коммент "XXX = 1 (What the fuck ???)" И пошел дальше ковырять. Надо будет посмотреть базу на предмет других похожих комментариев...
Re: Реанимация древних машин. На фанерке.
и много там таких?
Не стоит прислушиваться к моему мнению- оно бывает ошибочным.