Страница 1 из 1
Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Чт май 16, 2013 22:15:14
pimple2006
Здравствуйте,ребят я знаю что вы уже все разжевали вдоль и поперек эту тему,но все же прошу помощи.
1.подключил в протеусе через SPI интерфейс
2.стал писать программу в блокноте:
Код: Выделить всё
.include "C:\Appnotes\m8def.inc"
.def Temp=R16
.cseg
.org 0
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,Temp
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
ldi Temp,11111111
rjmp SPI_MasterTransmit
ldi Temp,11111111
rjmp SPI_MasterTransmit
ldi Temp,11111111
rjmp SPI_MasterTransmit
ldi Temp,11111111
rjmp SPI_MasterTransmit
ldi Temp,11111111
rjmp SPI_MasterTransmit
ldi Temp,11111111
rjmp SPI_MasterTransmit
3.Сохранил и поставил на компиляцию,но вылетело аж 8 ошибок(до этого по вашему тутору делал светодиоды на настоящем МК - проблем не было)
4.Ошибки:
DD_MOSI DDR_SPI не прописаны в файле с инструкциями
остальные 6 ошибок связаны с out of range ldi Temp,11111111
Парни,помогите прописать не достающих DD_MOSI DDR_SPI и расскажите почему происходит Out of range
P.S извините за нубский вопрос и за говно код,просто хочу сначала разобраться а потом делать норм код.(я знаю,что код нерабочий)

Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Пт май 17, 2013 08:27:41
ibiza11
ldi Temp,11111111
Вы понимаете, что пытаетесь записать в 8-битную переменную(которая имеет макс значение 255) число 11 миллионов 111 тысяч 111?
DD_MOSI DD_SPI
вместо этого напишите номера битов портов, к которым обращаетесь
Код: Выделить всё
rjmp SPI_MasterTransmit
...
SPI_MasterTransmit:
...
ret
у вас SPI_MasterTransmit определена как функция (поскольку в конце стоит
ret), а обращаетесь вы к ней как к обычной метке. Это приведет к тому, что вы никогда не вернетесь из своей функции в исходное место.
Хорошо бы еще стек проинициализировать - последствия невыполнения этого читайте выше.
Дисплей нокии 3310 и atmega8 проблема с кодом
Плохо вы наш "тутор" читали, раз такие ошибки лепите.
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Пт май 17, 2013 11:11:03
pimple2006
точно,забыл 0b11111111,вчера поздно просто было) лоханулся
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Пт май 17, 2013 11:14:25
orinoko
Тут ещё вопрос, откуда программа стартовать будет, и, мне кажется, явно не оттуда, откуда хочет ТС
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Пт май 17, 2013 11:19:43
Engineer_Keen
Ну откуда стартовать будет известно - с 0-го адреса, и то что программа имеет капитальные структурные косяки и выполнятся будет ровно до первой строки с ret, а дальше поведет себя непредсказуемо (скорее всего сброс) это факт (хотя ТС признает что код не рабочий, но какой тогда смысл?)

1) первой строкой написать RJMP на метку, где начинается инициализация
2) про инициализацию стека уже писали
3) про вызов SPI_MasterTransmit через RCALL, а не RJMP тоже
4) после последней строки программы (если выполнить п.п. 1 - 3) будет что? Последовательный перебор адресов, переполнения PC и сброс, т.к. не хватает главного цикла-заглушки:
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Пт май 17, 2013 22:31:20
pimple2006
ребята,спасибо за упоминание говнокода,я писал про это.Что означает аббривиатура ТС?Если это ТупойСтудент - не обосновано!
Код: Выделить всё
.include "C:\Appnotes\m8def.inc"
.def Temp=R16
.def Temp1=R22
.cseg
.org 0
ldi Temp1,high(RamEnd)
out SPH,Temp1
ldi Temp1,low(RamEnd)
out SPL,Temp1
rcall SPI
Main:
ldi r16,0b00011010
rcall SPI_MasterTransmit
rjmp Main
SPI:
; Set MOSI and SCK output, all others input
ldi r17,0b00101000
out DDRB,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,Temp
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Сб май 18, 2013 09:23:21
orinoko
аббривиатура ТС
это обозначает ТопикСтартер, но ход ваших мыслей мне тоже нравится

Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Сб май 18, 2013 23:10:33
pimple2006
Код: Выделить всё
.include "C:\Appnotes\m8def.inc"
.def Temp=R16
.def Temp1=R22
.cseg
.org 0
ldi Temp1,high(RamEnd)
out SPH,Temp1
ldi Temp1,low(RamEnd)
out SPL,Temp1
rcall SPI
ldi r16,0b00000000
out PINB,r16
ldi r16,0b00100001
rcall SPI_MasterTransmit
ldi r16,0b10010000
rcall SPI_MasterTransmit
ldi r16,0b00100000
rcall SPI_MasterTransmit
ldi r16,0b00000001
out PINB,r16
ldi r16,0b00011111
rcall SPI_MasterTransmit
Main:
rjmp Main
SPI:
; Set MOSI and SCK output, all others input
ldi r17,0b00101001
out DDRB,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,Temp
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
я учел ответы ваши,
посоны я сделал это,нарисовалась в протеусе линия,вопросик зачем нужен бесконечный пустой цикл?
Re: Дисплей нокии 3310 и atmega8 проблема с кодом
Добавлено: Вс май 19, 2013 08:31:24
orinoko
Тебе достаточно убрать и проверить пошагово, что будет с выполнением программы. Или убери мысленно, и подумай куда программа пойдёт