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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2008, 15:56   #1
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
Вопрос Программа инициализации ЖК индикатора РС1604

Если кто может выдать программу инициализации ЖК индикатора РС1604
а также запись и чтение на ассемблере в AVR? Очень надо! Сколько мучаюсь ничего не получается.
hobin вне форума Ответить с цитированием
Старый 30.07.2008, 16:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Сколько мучаюсь ничего не получается.
Показывай, сколько мучаешся.

И кстати отлаживал по шагам?
Ошибки приведи если есть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2008, 10:58   #3
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию Вообще я "дуб" но учусь быстро. Это инициализация ЖК.

Код:
;Автор;Имя         Геннадий    
;Отчество    Леонидович  
;Фамилия     Хобин       
;Год         2008      
  ;Месяц       июнь        
 
;Тема:       Управление ЖК-индикацией 
;Контроллер  ATmega48        
;Тактовая    Z= 4mgZ        
;ПОДКЛЮЧЕНИЯ;
 .DEVICE     ATmega48 .NOLIST             
 .INCLUDE     C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes"m48def.inc"
 .LIST                
 ;КОМЕНТАРИИ:
;************ 
 ;AO     = PORTD0 = Регистр для линии выбора операций
 ;RW     = PORTD1 = Регистр для линии выбора региста
 ;E      = PORTD2 = Регистр для стробирования
 ;PORTB0 = Порт вывода данных включения символа
 ;PORTB1 = Порт вывода данных включения символа
 ;PORTB2 = Порт вывода данных включения символа
 ;PORTB3 = Порт вывода данных включения символа
 ;PORTB4 = Порт вывода данных включения символа
 ;PORTB5 = Порт вывода данных включения символа
 ;PORTB6 = Порт вывода данных включения символа
 ;PORTB7 = Порт вывода данных включения символа 

;ОБЬЯВЛЕНИЯ:  .DEF   TMP    = R16  ;Регистр для записи временных данных
 .DEF   COUNT1 = R17
 .DEF   COUNT2 = R18
 .DEF   COUNT3 = R19
 .DEF   COUNT4 = R20
;ИНИЦИАЛИЗАЦИЯ СТЕКА. ЕСЛИ ЭТОГО НЕ СДЕЛАТЬ, ТО ВЫЗОВ ПДПРОГРАММЫ
;ИЛИ ПРЕРЫВАНИЯ НЕ ВНРНЁТ УПРАВЛЕНИЕ ОБРАТНО. 
;УКАЗАТЕЛЬ НА КОНЕЦ СТЕКА УСТАНАВЛИВАЕТСЯ НА ПОСЛЕДНИЙ АДРЕС ВНУТ-
;РЕННЕГО ОЗУ-RAMEND
;******************
;******************
BEGIN
  ldi     TMP,low(RAMEND)
  out     spl,TMP
  ldi     TMP,high(RAMEND)
  out     sph,TMP
;ОЧИСТКА РЕГИСТОВ  clr    ZL           ;Очищаем ZL
  clr    ZH           ;Очищаем ZH

 CLEARLOOP;В ЭТОМ СЕКТОРЕ ПРОИСХОДИТ ОЧИСТКА ВСЕХ РАБОЧИХ РЕГИСТРОВ, ПУТЁМ ПЕРЕСЫЛКИ
;СОДЕРЖИМОГО ОЧИЩЕННОГО РЕГИСТРА В ДРУГИЕ РЕГИСТРЫ.		
  st     Z,ZH         ;Пересылаем содержимое регистра "ZH" в регистр "Z"
  inc    ZL           ;Переходим к следующему адресу
  cpi    ZL,30        ;Сравниваем ZL c "30"
  brne   CLEARLOOP    ;Переходим к CLEARLOOP если ZL <> 30

  ldi     TMP,0XFF    ;Устанавливаем подтяжку регистров
  out     DDRD,TMP    ;Устанавливаем подтяжку регистров
  out     DDRB,TMP    ;Устанавливаем подтяжку регистров
  rjmp    START_A     ;Устанавливаем подтяжку регистров
START_A:;НАЧАЛО ИНИЦИАЛИЗАЦИИ ИНДИКАТОРА
  ldi      TMP,(1<<4) | (1<<5) 
  out      PORTD,TMP
  rjmp     DELAY0_A
DELAY0_A:
  ldi      COUNT1,30
DELAY1_A:
  ldi      COUNT2,50
DELAY2_A:
  ldi      COUNT3,100
DELAY3_A:
  dec      COUNT3
  brne     DELAY3_A
  dec      COUNT2
  brne     DELAY2_A
  dec      COUNT1
  brne     DELAY1_A
  rjmp     START_B
START_B:
  clr      COUNT1
  clr      COUNT2
  clr      COUNT3
  ldi      TMP,(1<<4) | (1<<5)
  out      PORTD,TMP 
  rjmp     DELAY0_B
DELAY0_B:
  ldi      COUNT1,30
DELAY1_B:
  ldi      COUNT2,40
DELAY2_B:
  ldi      COUNT3,50
DELAY3_B:
  dec      COUNT3
  brne     DELAY3_B
  dec      COUNT2
  brne     DELAY2_B
  dec      COUNT1
  brne     DELAY1_B
  rjmp     START_C
START_C:
  clr      COUNT1
  clr      COUNT2
  clr      COUNT3
  ldi      TMP,(1<<4) | (1<<5)
  out      PORTD,TMP 
  rjmp     DELAY0_C
DELAY0_C:
  ldi      COUNT1,30
DELAY1_C:
  ldi      COUNT2,40
DELAY2_C:
  ldi      COUNT3,50
DELAY3_C:
  dec      COUNT3
  brne     DELAY3_C
  dec      COUNT2
  brne     DELAY2_C
  dec      COUNT1
  brne     DELAY1_C
  rjmp     PROG
;УСТАНОВКА ПАРАМЕТРОВ
PROG:
  ldi      TMP,0X38
  out      PORTD,TMP
  rjmp     START_D
START_D:
  clr      COUNT1
  clr      COUNT2
  clr      COUNT3
  rjmp     DELAY0_D
DELAY0_D:
  ldi      COUNT1,30
DELAY1_D:
  ldi      COUNT2,40
DELAY2_D:
  ldi      COUNT3,50
DELAY3_D:
  dec      COUNT3
  brne     DELAY3_D
  dec      COUNT2
  brne     DELAY2_D
  dec      COUNT1
  brne     DELAY1_D
  rjmp     EN_DISPL

;ВЫКЛЮЧЕНИЕ ДИСПЛЕЯ
;****************** 
EN_DISPL:
  ldi      TMP,0X08
  out      PORTD,TMP
  rjmp     START_E
START_E:
  clr      COUNT1
  clr      COUNT2
  clr      COUNT3
  rjmp     DELAY0_E
DELAY0_E:
  ldi      COUNT1,30
DELAY1_E:
  ldi      COUNT2,40
DELAY2_E:
  ldi      COUNT3,50
DELAY3_E:
  dec      COUNT3
  brne     DELAY3_E
  dec      COUNT2
  brne     DELAY2_E
  dec      COUNT1
  brne     DELAY1_E 
  rjmp     CLEARDISPLAY
;***************
;ОЧИСТКА ДИСПЛЕЯ
;***************
CLEARDISPLAY:
  ldi      TMP,0X01 
  out      PORTD,TMP
  rjmp     START_F
START_F:
  clr      COUNT1
  clr      COUNT2
  clr      COUNT3
  rjmp     DELAY0_F
DELAY0_F:
  ldi      COUNT1,30
DELAY1_F:
  ldi      COUNT2,40
DELAY2_F:
  ldi      COUNT3,50
DELAY3_F:
  dec      COUNT3
  brne     DELAY3_F
  dec      COUNT2
  brne     DELAY2_F
  dec      COUNT1
  brne     DELAY1_F 
  rjmp     SETUP
;УСТАНОВКА ВВОДА РЕЖИМА ДАННЫХ
SETUP:
  clr      TMP
  out      PORTD,TMP
  ldi      TMP,0X06
  out      PORTD,TMP
  rjmp     ENTER
ENTER:
  nop
  rjmp     ENTER

Последний раз редактировалось B_N; 31.07.2008 в 13:57.
hobin вне форума Ответить с цитированием
Старый 31.07.2008, 11:29   #4
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

В AVRstudio компилирую, ошибки не выдаёт. Но ATmega48 начинает накаляться! Может надо что-то делать по другому? Если да, то с чего начать?
hobin вне форума Ответить с цитированием
Старый 02.08.2008, 22:13   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вообще нагрев контроллера связан с программой косвенно.
Причины нагрева в вашем случае я вижу в следующем -
1. Контроллер уже вышел из строя и продолжает себе дальше нагреваться в результате внутренних тепловых пробоев (маловероятно)
2. Конфликт по портам с какой нибудь мощной периферией. У контроллеров фирмы Atmel достаточно высокие токи по выходным портам (по давней памяти что-то примерно 20 ma на ногу), поэтому если какое-то устройство (микросхема), работающее с данным контроллером захочет установить на выводе порта кон-ра нолик, а контроллер будет с этим "не согласен", то тут что называется кто кого. К слову я не увидел первичной инициализации (именно инициализации а не настройки) порта B - который по всей видимости является параллельной шиной данных.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 02.08.2008, 23:37   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А я бы вам предложил такую схему построения программ. ВНИМАНИЕ - контоллер ATmega103:

Код:
;Модуль:  	Управляющий процессор имитатора внешнего оборудования
;MCU ATmega103 (5,5296 МГц)
.nolist
.include "M103DEF.INC"		;определения стандаpтных адpесов ОМЭВМ
.include "CONST.ASM"		;опpеделения для пpогpаммы контроллера (все equ. -сюда)
.list
;	Вектоpы пpеpываний
	JMP	RESET		;обработчик сброса процессора
	JMP	EXT_INT0	;обработчик прерывания INT0
	JMP	EXT_INT1	;обработчик прерывания INT1
	JMP	EXT_INT2	;обработчик прерывания INT2
	JMP	EXT_INT3	;обработчик прерывания INT3
	JMP	EXT_INT4	;обработчик прерывания INT4
	JMP	EXT_INT5	;обработчик прерывания INT5
	JMP	EXT_INT6	;обработчик прерывания INT6
	JMP	EXT_INT7	;обработчик прерывания INT7
	JMP	TIM2_COMP	;обработчик сравнения таймера 2
	JMP	TIM2_OVF	;обработчик переполнения таймера 2
	JMP	TIM1_CAPT	;обработчик захвата таймера 1
	JMP	TIM1_COMPA	;обработчик сравнения A таймера 1
	JMP	TIM1_COMPB	;обработчик сравнения B таймера 1
	JMP	TIM1_OVF	;обработчик переполнения таймера 1
	JMP	TIM0_COMP	;обработчик сравнения таймера 0
	JMP	TIM0_OVF	;обработчик переполнения таймера 0
	JMP	SPI_COMPLET	;обработчик завершения пересылки SPI
	JMP	USART1_RX	;обработчик завершения приема UART
	JMP	UART_DRE	;обработчик пустого регистра данных
	JMP	main_tx		;обработчик завершения передачи UART
	JMP	ADC_INT		;обработчик завершения преобразования АЦП
	JMP	EE_RDY		;обработчик готовности EEPROM
	JMP	ANA_COMP	;обработчик срабатывания аналового компаратора
;	Обработчик прерывания INT0
EXT_INT0:
	RETI
;	Обработчик прерывания INT1
EXT_INT1:
	RETI
;	Обработчик прерывания INT2
EXT_INT2:
	RETI
;	Обработчик прерывания INT3
EXT_INT3:
	RETI
;	Обработчик прерывания INT4
EXT_INT4:
	RETI
;	Обработчик прерывания INT5
EXT_INT5:
	reti
;	Обработчик прерывания INT6
EXT_INT6:
	RETI
;	Обработчик прерывания INT7
EXT_INT7:
	reti
;	Обработчик сравнения таймера 2
TIM2_COMP:
	reti
;	Обработчик переполнения таймера 2
TIM2_OVF:
	RETI
;	Обработчик захвата таймера 1
TIM1_CAPT:
	RETI
;	Обработчик сравнения A таймера 1
TIM1_COMPA:
	reti
;	Обработчик сравнения B таймера 1
TIM1_COMPB:
	RETI
;	Обработчик переполнения таймера 1
TIM1_OVF:
	RETI
;	Обработчик сравнения таймера 0 (системный таймер)
TIM0_COMP:
	reti
;	Обработчик переполнения таймера 0
TIM0_OVF:
	RETI
;	Обработчик завершения пересылки SPI
SPI_COMPLET:
	reti
;	Обработчик завершения приема UART
USART1_RX:
	reti
;	Обработчик пустого регистра данных
UART_DRE:
	RETI
;	Обработчик завершения передачи UART от [23 - ] 
main_tx:	
	reti
;	Обработчик завершения преобразования АЦП
ADC_INT:
	RETI
;	Обработчик готовности EEPROM
EE_RDY:
	RETI
;	Обработчик срабатывания аналового компаратора
ANA_COMP:
	RETI
;=====================================================================
;	Обработчик сброса процессора
RESET:
;***** Сброс и запрет сторожевого таймера (если надо)
	WDR ;сбросить сторожевой таймер
	LDI	wrk_tmp1,$1F
	OUT	WDTCR,wrk_tmp1
	LDI	wrk_tmp1,$17
	OUT	WDTCR,wrk_tmp1
;***** Инсталяция указателя стека
	LDI	wrk_tmp1,high(RAMEND)
	OUT	SPH,wrk_tmp1
	LDI	wrk_tmp1,low(RAMEND)
	OUT	SPL,wrk_tmp1
;Установка направления портов
	ldi	wrk_tmp1,$00   ;0000 0000
	out	DDRA,wrk_tmp1  ;запись данных из регистра в порт
	ldi	wrk_tmp1,0b01110111
	out	DDRB,wrk_tmp1
	ldi	wrk_tmp1,0b00000001
	out	DDRD,wrk_tmp1
;Начальная установка портов
	ldi	wrk_tmp1,$00    ;1111 1111
	out	PORTA,wrk_tmp1
	ldi	wrk_tmp1,0b01110111   ;0111 1011
	out	PORTB,wrk_tmp1
	ldi	wrk_tmp1,0b00000000
	out	PORTD,wrk_tmp1
SETUP:
;Hачальная установка - здесь первоначальные настройки всех ваших таймеров,
;аналоговых компараторов, АЦП, уровней фронтов по прерываниям, собственно прерываний
; (маскируемые и тд), набортного интерфейса - USART, SPI и т.д., и всех ваших переменных
	ldi	wrk_tmp1, $00
	mov	zero, wrk_tmp1
	ldi	wrk_tmp1, $01
	mov	one, wrk_tmp1	
; очистка ОЗУ
	ldi	ZH, $00
	ldi	ZL, $60
reset_sram:	
	st	Z+, zero
	cpi	ZL, $20
	brne	reset_sram
	cpi	ZH, $0B
	brne	reset_sram
;***** Инсталяция SPI
	ldi	wrk_tmp1, $D0		;ведущий, частота = 1/4
	out	SPCR, wrk_tmp1
;***** Инсталяция UART
	ldi	wrk_tmp1,2		;установка скорости 115 200 бод
	out	UBRR,wrk_tmp1
	ldi	wrk_tmp1,$D8
	out	UCR,wrk_tmp1		;разрешение UART на прием и передачу
;***** Инсталяция таймера T0
	ldi	wrk_tmp1,0
	out	TCNT0,wrk_tmp1
	ldi	wrk_tmp1,$D8
	out	OCR0,wrk_tmp1		;период прерывания 2,5 мсек
	ldi	wrk_tmp1,$0C		;коэф.деления = 1/64
	out	TCCR0,wrk_tmp1		;запуск таймера T0
	ldi	wrk_tmp1,$02		
	out	TIMSK,wrk_tmp1
;***** Инсталяция прерываний INT5, INT7
	ldi	wrk_tmp1,$FF		; |INT7 | INT5 |
	out	EICR,wrk_tmp1		; | _/~ |  _/~ |
	ldi	wrk_tmp1,$A0
	out	EIMSK,wrk_tmp1		;. INT7, INT5
	sei				;общее разрешение прерываний
WAIT:	
;	Рабочий цикл (т.н. Монитор) - собственно ваша программа
	rjmp	WAIT

;	Дополнительные модули пpогpаммы
.include "macro.asm"
.include "main_function.asm"
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 04.08.2008, 17:58   #7
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

Спасибо! Во многих ATмегах есть дополнительные 16-ти разрядные, а как их можно заинсталировать?
hobin вне форума Ответить с цитированием
Старый 05.08.2008, 18:38   #8
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Дополнительные 16-ти разрядные....... Кто ?

Если вы имеете в виду таймеры/счётчики, то так:

Код:
;***** Инсталяция таймера T1

:первоначальная очистка счётчика
ldi	wrk_tmp1,0
out	TCNT1H,wrk_tmp1 
out	TCNT1L,wrk_tmp1

;установить период прерывания (здесь 500 мксек) он также будет зависеть от
;коэффициента деления, установленного в TCCR1B
ldi	wrk_tmp1,$0A
out	OCR1AH,wrk_tmp1	
ldi	wrk_tmp1,$CC
out	OCR1AL,wrk_tmp1

;настройка частоты таймера и периода его срабатывания                                                                    
;запрет таймеру аппаратно трогать ноги контроллера и запрет ШИМ (TCCR1A)
;коэф.деления = 1/1 и разрешить счётчику самому очищаться по совпадению (TCCR1B)
;запуск таймера T1                                                     
ldi	wrk_tmp1,$00	
out	TCCR1A,wrk_tmp1	
ldi	wrk_tmp1,$09	
out	TCCR1B,wrk_tmp1	

;разрешение прерывания по совпадению таймера счётчика T1
;для канала А таймера 1
in	wrk_tmp1, TIMSK
ori	wrk_tmp1,$10
out	TIMSK,wrk_tmp1
Перед началом "монитора" не забудьте установить флаг общего разрешения прерываний (sei).
Ну и обработку этого таймера соответственно в обработчике прерывания надо писать.
Кстати, а документация - то на контроллер у вас есть? Если нет, то надо достать -
написать на контроллер программу без документации просто нереально.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 06.08.2008, 17:40   #9
hobin
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 22
По умолчанию

В том-то и дело что у меня получается на меге48 при
ldi wrk_tmp1,$00
out TCCR1A,wrk_tmp1
ldi wrk_tmp1,$09
out TCCR1B,wrk_tmp1
выдаёт
C:\Program Files\Atmel\ArhivAVR\Laboratoria\La boraija.asm(334): error: Operand 1 out of range: 0x80
hobin вне форума Ответить с цитированием
Старый 06.08.2008, 23:02   #10
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Пример который я вам привёл ориентирован на Megu103-128.
Отличия конечно будут:
1. Во первых - вектора прерывания у Mega48 8-ми разрядные, отсюда следует что применять команду jmp в таблице векторов нельзя (пользуйтесь rjmp со всеми вытекающими).
2. По таймеру 1 -
На этом контроллере вы не можете адресоваться к регистрам счётчика 1 командами in, out (посмотрите диапазон адресов этих команд и адрес TCCR1A). Адресуйтесь к ним как к ОЗУ:

Код:
ldi wrk_tmp1,$00       
sts TCCR1A,wrk_tmp1    
ldi wrk_tmp1,$09       
sts TCCR1B,wrk_tmp1
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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



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