Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2008, 13:21   #11
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Да действительно инициализируется! Хотя не пойму почему к 8-и битным счетчикам обращаемся как к простым регистрам, а к 16-и как с ОЗУ?
Почему тогда например в меге-128 инициализация 16-ти разрядных тайм.счетчиков проще?
hobin вне форума Ответить с цитированием
Старый 07.08.2008, 17:26   #12
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Дело совсем не в разрядности счётчика, а именно в адресах его управляющих и других регистров. В Mege128 инициализация 16-ти разрядных счётчиков потому и проще, что они находятся в адресном пространстве портов ввода\вывода, куда можно адресоваться командами in и out. А команды in и out могут адресоваться только к первым 64-м ячейкам памяти, расположенным за адресом 0x20 (до 0x20 находятся РОН).

В вашем случае (на Mege48) - адреса счётчиков такие:

(0xB4) OCR2B Timer/Counter2 Output Compare Register B 147
(0xB3) OCR2A Timer/Counter2 Output Compare Register A 147
(0xB2) TCNT2 Timer/Counter2 (8-bit) 147
(0xB1) TCCR2B FOC2A FOC2B - - WGM22 CS22 CS21 CS20 146
(0x8B) OCR1BH Timer/Counter1 - Output Compare Register B High Byte 129
(0x8A) OCR1BL Timer/Counter1 - Output Compare Register B Low Byte 129
(0x89) OCR1AH Timer/Counter1 - Output Compare Register A High Byte 129
(0x88) OCR1AL Timer/Counter1 - Output Compare Register A Low Byte 129
(0x87) ICR1H Timer/Counter1 - Input Capture Register High Byte 129
(0x86) ICR1L Timer/Counter1 - Input Capture Register Low Byte 129
(0x85) TCNT1H Timer/Counter1 - Counter Register High Byte 129
(0x84) TCNT1L Timer/Counter1 - Counter Register Low Byte 129
(0x82) TCCR1C FOC1A FOC1B - - - - - - 128
(0x81) TCCR1B ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 127
(0x80) TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11 WGM10 125
(0x70) TIMSK2 - - - - - OCIE2B OCIE2A TOIE2 148
(0x6F) TIMSK1 - - ICIE1 - - OCIE1B OCIE1A TOIE1 130
(0x6E) TIMSK0 - - - - - OCIE0B OCIE0A TOIE0 100
0x28 (0x48) OCR0B Timer/Counter0 Output Compare Register B
0x27 (0x47) OCR0A Timer/Counter0 Output Compare Register A
0x26 (0x46) TCNT0 Timer/Counter0 (8-bit)
0x25 (0x45) TCCR0B FOC0A FOC0B - - WGM02 CS02 CS01 CS00
0x24 (0x44) TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 07.08.2008 в 17:30.
Ulex вне форума Ответить с цитированием
Старый 07.08.2008, 19:00   #13
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Понял спасибо! Попробую сформировать начальную установку модуля LCD
используя TIMER_COUNTER1. Сформирую задержки согласно даташиту. Думаю должно получиться???
hobin вне форума Ответить с цитированием
Старый 11.08.2008, 14:59   #14
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Опять небольшая проблема. как можно эффективнее упростить подпрограмму. Получается это одна строка, а их четыре. выходит много строк. Есть у кого чего предложить?
ldi tmp,'H';1
out PORTB,tmp
rcall strob
ldi tmp,'E';2
out PORTB,tmp
rcall strob
ldi tmp,'L';3
out PORTB,tmp
rcall strob
ldi tmp,'L';4
out PORTB,tmp
rcall strob
ldi tmp,'O';5
out PORTB,tmp
rcall strob
ldi tmp,' ';6
out PORTB,tmp
rcall strob
ldi tmp,'P';7
out PORTB,tmp
rcall strob
ldi tmp,'R';8
out PORTB,tmp
rcall strob
ldi tmp,'O';9
out PORTB,tmp
rcall strob
ldi tmp,'G';10
out PORTB,tmp
rcall strob
ldi tmp,'R';12
out PORTB,tmp
rcall strob
ldi tmp,'A';13
out PORTB,tmp
rcall strob
ldi tmp,'M';14
out PORTB,tmp
rcall strob
ldi tmp,'M';15
out PORTB,tmp
rcall strob
ldi tmp,'A';16
out PORTB,tmp
rcall strob
hobin вне форума Ответить с цитированием
Старый 11.08.2008, 21:20   #15
Sharaevsky_Vitaly
Пользователь
 
Регистрация: 23.05.2008
Сообщений: 26
По умолчанию

Можно, по-моему, сделать двумя вариантами.
Вариант 1:
Сохранить строку в SRAM и обязательно не забыть символ конца строки, например 0х00. Потом занести в любую из регистровых пар X, Y или Z адрес первого элемента строки. Организовать цикл с инкриментом адреса и проверкой на конец строки.
Код:
   LDI R30, LOW(TextLine)
   LDI R31, HIGH(TextLine)   ; сохранение адреса начала строки в паре Z

 DispLineCycles:
   LD R16, Z+   ; загрузка очередного элемента строки с постинкрементом Z
   OR R16, R16
      BREQ EndDispLineCycles   ; если очередной элемент строки==0 - выход из цикла
   RCALL Strob
   RJMP  DispLineCycles

 EndDispLineCycles:
Вариант 2:
Сохранить строку непосредственно в сегменте кода и действовать полностью аналогично предидущему варианту:
Код:
.CSEG
   ......
   TextLine:  .DB  "Hello programma", 0x00
   .....
   LDI R30, LOW(TextLine)
   LDI R31, HIGH(TextLine)   ; сохранение адреса начала строки в паре Z

   LSL R30
   ROL R31   ; Z=Z*2 для перехода от адресации слов к адресации байт в памяти программ

 DispLineCycles:
   LPM R16, Z+   ; загрузка очередного элемента строки с постинкрементом Z
   OR R16, R16
      BREQ EndDispLineCycles   ; если очередной элемент строки==0 - выход из цикла
   RCALL Strob
   RJMP  DispLineCycles

 EndDispLineCycles:
Не самый оригинальный способ, но все что могу посоветовать
Sharaevsky_Vitaly вне форума Ответить с цитированием
Старый 12.08.2008, 11:37   #16
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Спасибо! А это надо делать в "INIT" или можно гдето в программе?

LDI R30, LOW(TextLine)
LDI R31, HIGH(TextLine) ; сохранение адреса начала строки в паре Z
hobin вне форума Ответить с цитированием
Старый 12.08.2008, 14:28   #17
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Всё, уже не надо. Разобрался, добавил ещё три строки всё получается. Всем огромное спасибо!
hobin вне форума Ответить с цитированием
Старый 28.08.2008, 08:59   #18
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Кто поможет!? При выводе в порт семисегментного кода всё получатся
нормально, а если через СОЗУ или flash, косвенная или непосредственная адресация, появляются какие-то иероглифы.
Причем код на выводах при эмуляции полностью соответствуют заданным
значениям. Что я не правильно делаю?
.def eepromL = R15
.def tmp = R16;
.def ed = R17
.def des = R18
.def temp1 = R19
.def temp2 = R20
.equ drb = DDRB
.equ pib = PINB
.equ prb = PORTB
.equ drd = DDRD
.equ pid = PIND
.equ prd = PORTD
.equ drc = DDRC
.equ pic = PINC
.equ prc = PORTC

rjmp init;
;===========
.eseg
.cseg
;===========
.org 16
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
.tseg
.cseg
.org 100;
.DB $40,$79,$24,$30,$19,$12,$02,$78,$00 ,$10,$3F ;0;1;2;3;4;5;6;7;8;9
init:

;инциализация стека
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi tmp,HIGH(RAMEND)
out SPH,tmp
;установка портов
ldi tmp,0xFF
out DDRB,tmp
out DDRD,tmp
out PINC,tmp
out PORTC,tmp
ldi R17,0x40
out PORTD,R17
sbi PORTB,0
;запись в СОЗУ
setup:
ldi tmp,0x40
sts 0x65,tmp
ldi tmp,0x79
sts 0x66,tmp
ldi tmp,0x24
sts 0x67,tmp
ldi tmp,0x30
sts 0x68,tmp
ldi tmp,0x19
sts 0x69,tmp
ldi tmp,0x12
sts 0x6A,tmp
ldi tmp,0x02
sts 0x6B,tmp
ldi tmp,0x78
sts 0x6C,tmp
ldi tmp,0x00
sts 0x6D,tmp
ldi tmp,0x10
sts 0x6E,tmp
ldi tmp,0x3F
sts 0x6F,tmp
ldi tmp,low(0x6C)
rjmp loop

compare:
ldi r30, 0x65
st Y,R0
eprom_reg_set:
ld XL,Y+
ld tmp, Z
st Z+,XL
cp R17,tmp
breq inc_ed
rjmp eprom_reg_set
inc_ed:
ld R17,Z
out PORTD,R17
rjmp setup
loop:
rcall key
rjmp loop
key: ;кнопка
sbic PINC,0
ret
rcall delay
rjmp key_out
key_out:
sbis PINC,0
rjmp key_out
rcall delay
rcall compare
delay: ;задержка
ldi tmp,0x0F
m20msec:
dec tmp
cpi tmp,00
brne m20msec
ret
hobin вне форума Ответить с цитированием
Старый 28.08.2008, 22:40   #19
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Код:
setup:
ldi tmp,0x40
sts 0x65,tmp
ldi tmp,0x79
sts 0x66,tmp
ldi tmp,0x24
Это я так понимаю, пытались записать значения семисегментного кода в ОЗУ. Ну опять таки по адресам смотрим - последний адрес расширенного пространства портов ввода\вывода 0xFF, соответственно писать чего-
либо в ОЗУ можно начинать лишь с адреса 0x100.

Код:
setup:
ldi tmp,0x40
sts 0x100,tmp
ldi tmp,0x79
sts 0x101,tmp
ldi tmp,0x24
sts 0x102,tmp
; ну и т.д.
Кстати, у меня на отладчике вообще ваша программа ничего в порт не выводит (ну тут может я ещё и сам не до конца разобрался).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 28.08.2008, 23:34   #20
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вобщем вот такой код нормально записывает все ваши значения в ОЗУ и затем выводит их в порт B в цикле:

Код:
init: 
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi tmp,HIGH(RAMEND)
out SPH,tmp 
ldi tmp,0xFF
out DDRB,tmp
out DDRD,tmp
out PINC,tmp
out PORTC,tmp
ldi R17,0x40
out PORTD,R17
sbi PORTB,0
setup:
ldi tmp,0x40
sts 0x100,tmp
ldi tmp,0x79
sts 0x101,tmp
ldi tmp,0x24
sts 0x102,tmp
ldi tmp,0x30
sts 0x103,tmp
ldi tmp,0x19
sts 0x104,tmp
ldi tmp,0x12
sts 0x105,tmp
ldi tmp,0x02
sts 0x106,tmp
ldi tmp,0x78
sts 0x107,tmp
ldi tmp,0x00
sts 0x108,tmp
ldi tmp,0x10
sts 0x109,tmp
ldi tmp,0x3F
sts 0x10A,tmp

loop_set:
ldi r16, 0
ldi r30, low(0x100)
ldi r31, high(0x100)

loop:
ld	r17, Z+
out	PORTB, r17
nop
nop
nop
inc	r16
cpi	r16, 10
brsh loop_set
rjmp loop
ret
Правда тут для меня одна непонятная вещь осталась, на PORTB3 никак еденичка устанавливаться не хочет (может быть проблема в эмуляторе).
Надо на железе проверять.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа ben95 Общие вопросы Delphi 1 04.01.2008 20:52
Программа на С++ natan Помощь студентам 1 23.12.2007 15:59