PinBoard в руках Чайника - Assembler и LCD

AVR
Не прошло и дня, а Чайники опять достают Вас новой писаниной. В прошлой статейке PinBoard в руках Чайника — MicroPascal и LCD, мы рассмотрели управление LCD при помощи встроенных библиотек MikroPascal`я. В этой мы обойдемся целиком ассемблером. Сделаем это для сравнения результатов.
И так, мы помним, что наш текстовый lcd подключен к плате PinBoard по сл. схеме:

PB0 - E (6) 
PB1 - RW (5) //// Можно кинуть на GND
PB2 - RS (4) 
 
PB4 - DB4 (11) 
PB5 - DB5 (12) 
PB6 - DB6 (13) 
PB7 - DB7 (14) 


Библиотеку для LCD «стырим» из demo-rts16 из документации PinBoard. Вот что наваял Чайник:

			.include "m16def.inc"	; Используем ATMega16
			.include "WH\lcd4_macro.inc"

			.DSEG
			
			.CSEG

reset:		CLI
			LDI 	R17,low(RAMEND) 		; Инициализируем стек
			OUT 	SPL,R17 
			LDI     R17,High(RAMEND)
			OUT		SPH,R17


			INIT_LCD	///заводим lcd ))
			LCDCLR      ///чистим экран

			LDI		ZL,low(txt1*2)  ///адрес первой строки в Z
			LDI		ZH,High(txt1*2)
			LDI		R16,16			//длина строки 16 символов
			RCALL 	StrOut			//выводим первую строку
			LCD_COORD 0,1			//переводим курсор на вторую строку
			LDI		ZL,low(txt2*2)  ///адрес второй строки в Z
			LDI		ZH,High(txt2*2)
			LDI		R16,16			
			RCALL 	StrOut			//выводим вторую строку


	
loop:		jmp loop			//курим бамбук до усерачки


StrOut:		PUSH 	R16				//будем его портить, поэтому сохраним
			LPM		R17,Z+			//Берем байтик, грузим его в R17 и увеличиваем Z
			CPI 	R17,192			//Если код символа меньше 192, 
			brlo    nothing			//то ничего не делаем

			PUSH	R31   //сохраняем Z
			PUSH	R30
			
			////////процедурка конвертации///////
			LDI		ZL,low(rusTable*2)
			LDI		ZH,High(rusTable*2)

			SUBI	R17,192
			ADD		R30,R17
			CLR		R16
			ADC		R31,R16
			LPM 	R17,Z
			/////////////////////////////////////
			POP		R30
			POP		R31			
 
nothing:	RCALL   DATA_WR			; 
			POP 	R16
			DEC		R16			
			BRNE	StrOut
			RET


txt1:		.db "2011 PinBoard   "
txt2:		.db "Пример русиша:-)"
rusTable:	.db 0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8
			.db 0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1
			.db 0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE
			.db 0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7
			
			.include "WH\lcd4.asm"


Подводим итоги.

Написание программы на паскале менее затратное по времени, но ощутимо бьет по ресурсам МК. В паскале мы не задумываемся о стеке, о сохранности регистров после процедур и т.п. В ассемблере все наоборот, мы становимся параноиками и боимся за каждый важный регистр, но результатом будет более компактный код, мало требовательный к ресурсам.
Скомпилированный проект на Микро паскале занял 1591 байт флэша, на ассемблере занял 398 байт. Разница существенная.
Но я считаю, что паскаль применим там где нужно быстро сделать что то без болячек на свою 5ю точку. Или скажем для обучения, так как он интуитивно и логически понятен.
Добавлено:
Как правильно выразился Di Halt, это Топорное сравнение. Но в заголовке написано «Чайник», а Чайнику не до дзеновских высот, он осваивает азы и ему интересно быстро и работоспособно.

Скачать готовый проект
  • +2
  • 22 марта 2011, 09:54
  • Episcop

Комментарии (7)

RSS свернуть / развернуть
Дело в том, что в микропаскале в либах куда больше функций чем тут. Если же на том же паскале (или Си) реализовать работу с дисплеем самому, написав свои функции, даже не применяя ассемблерных вставок можно уложиться в 600 байт. Так что я бы не сравнивал так топорно.
0
Я ожидал подобной фразы — «топорное сравнение»
Знаю что так оно и есть — топорное сравнение. Я не стал вдаваться в подробности. Сравнение делалось для двух проектов «быстрого старта Pinboard». Вдумайтесь во фразу — быстрый старт, я чайник и мне не до дзеновского программирования. Вот где то так)))
Хотя я не чайник в программировании, 15 лет стажа вроде)
0
Да не сказал бы я, что их сильно много. Кроме того, у него умный линкер, а значит лишние функции выкидываются. RW он тупоигнорит. Так что размер библиотеки все же несколько великоват.

За стеком кстати и в mP следить надо. Если слишком увлечься вложением функций (а это единственный метод реализации принципа «разделяй и властвуй» там) и заводить в них слишком много локальных переменных — можно запросто сорвать стек (его размер указывается после компиляции как dynamic RAM). В mP кстати есть полезная функция — окошко статистики скомпиленного кода. Помимо прочего, там есть полное дерево вызовов, где можно оценить их вложенность.
0
а где взять макрос «WH\lcd4_macro.inc»
а то я чет туплю ))))))))
0
  • avatar
  • oss
  • 29 марта 2011, 00:13
Это ж из дихальтовской библиотеки для LCD. Где-то на EE валялась, в одноименном посте. Еще есть демка для пинборда, с ртос, которая на ЖК выводит показания АЦП. Там оно же.
0
спасибо нашел
0
Ступил я видимо и в архив не засунул)) Сейчас подправлю.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.