Страница 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 и сброс, т.к. не хватает главного цикла-заглушки:

Код: Выделить всё

LOOP: 
//главный цикл
RJMP LOOP

Re: Дисплей нокии 3310 и atmega8 проблема с кодом

Добавлено: Пт май 17, 2013 22:31:20
pimple2006
ребята,спасибо за упоминание говнокода,я писал про это.Что означает аббривиатура ТС?Если это ТупойСтудент - не обосновано! :evil:

Код: Выделить всё

.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
Тебе достаточно убрать и проверить пошагово, что будет с выполнением программы. Или убери мысленно, и подумай куда программа пойдёт