|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.08.2008, 13:21 | #11 |
Пользователь
Регистрация: 30.07.2008
Сообщений: 22
|
Да действительно инициализируется! Хотя не пойму почему к 8-и битным счетчикам обращаемся как к простым регистрам, а к 16-и как с ОЗУ?
Почему тогда например в меге-128 инициализация 16-ти разрядных тайм.счетчиков проще? |
07.08.2008, 17:26 | #12 |
Непрофессионал
Участник клуба
Регистрация: 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. |
07.08.2008, 19:00 | #13 |
Пользователь
Регистрация: 30.07.2008
Сообщений: 22
|
Понял спасибо! Попробую сформировать начальную установку модуля LCD
используя TIMER_COUNTER1. Сформирую задержки согласно даташиту. Думаю должно получиться??? |
11.08.2008, 14:59 | #14 |
Пользователь
Регистрация: 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 |
11.08.2008, 21:20 | #15 |
Пользователь
Регистрация: 23.05.2008
Сообщений: 26
|
Можно, по-моему, сделать двумя вариантами.
Вариант 1: Сохранить строку в SRAM и обязательно не забыть символ конца строки, например 0х00. Потом занести в любую из регистровых пар X, Y или Z адрес первого элемента строки. Организовать цикл с инкриментом адреса и проверкой на конец строки. Код:
Сохранить строку непосредственно в сегменте кода и действовать полностью аналогично предидущему варианту: Код:
|
12.08.2008, 11:37 | #16 |
Пользователь
Регистрация: 30.07.2008
Сообщений: 22
|
Спасибо! А это надо делать в "INIT" или можно гдето в программе?
LDI R30, LOW(TextLine) LDI R31, HIGH(TextLine) ; сохранение адреса начала строки в паре Z |
12.08.2008, 14:28 | #17 |
Пользователь
Регистрация: 30.07.2008
Сообщений: 22
|
Всё, уже не надо. Разобрался, добавил ещё три строки всё получается. Всем огромное спасибо!
|
28.08.2008, 08:59 | #18 |
Пользователь
Регистрация: 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 |
28.08.2008, 22:40 | #19 |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
Код:
либо в ОЗУ можно начинать лишь с адреса 0x100. Код:
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
28.08.2008, 23:34 | #20 |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
Вобщем вот такой код нормально записывает все ваши значения в ОЗУ и затем выводит их в порт B в цикле:
Код:
Надо на железе проверять.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа | ben95 | Общие вопросы Delphi | 1 | 04.01.2008 20:52 |
Программа на С++ | natan | Помощь студентам | 1 | 23.12.2007 15:59 |