Zdravím zdejší. Jsem programovací lama. Píšu program pro Atmegu8. Jde mi o zobrazení digitálního kompasu na CRT v PAL. Dostat nějaké data do CRT není problém a děje se tak skrz SPI potažmo 8bit registr SPDR. Font je dosovský a v podstatě potřebuju vykreslit jen čísla 0-9, SZJV a znaménko %. procesor běží na 16MHz. Jednotlivé znaky jsou uloženy v tabulce. např:
D1:
Data 0 , 16 , 48 , 240 , 48 , 48 , 48 , 48 , 48 , 120 , 0
vykreslí znak 1. (font je 8x11). V podstatě k vykreslení se posílá do SPDR bajt po bajtu (0, pak 16, pak 48, ...) až to vykreslí do určeného řádku znak.
Problém je že klasický postup kdy ve stringu kdy chci jen zkušebně na obrazovku dostat "123456789" jsou tak šílený režie na procesorový čas že to prostě zobrazuje úplný nesmysly. Takže by to chtělo nějaký triky v ASM
V céčku který samozřejmě totálně neovládám to mají vyřešený přes pgm_Read_byte který když rozškatulkuju až do kódu tak to vypadá následovně:
#define __lpm_enhanced__(addr) \
__extension__({ \
Uint16_t __addr16 =(uint16_t)(addr) ; \
Uint8_t __result ; \
__asm__ \
( \
"lpm %0, Z" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
); \
__result; \
}))
Je mi jasný že je zde použitý assembler. Problém mi dělá jakýsi překlad toho do bascomu který používám.
toto: Uint16_t __addr16 =(uint16_t)(addr) ; \ zde je mi jasný dimenzování lokální proměnné addr16 typu word, zbytek bude asi přiřazení proměnné addr taktéž typu word číli addr16 = addr
pak bude dimenzování: local result as byte
ale tohle už prostě nedokážu přelouskat:
"lpm %0, Z" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
LPM jsem si ještě dohledal, ale v basomu prostě ty přípony (/n /t) k tomu nejsou a navíc to %0 co si pod tím mám tak představit?
"=r" (__result) - co to proboha je? kde se tu vzalo jaký r? Jedná se snad o R0?
"z" (__addr16) - Z tuším že je součástí LPM čili nositel hodnoty který se pak přepíše do addr16
jinak v tom C je úryvek toho programu který se snažím plagiátovat:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "vgafont.h"
#define HSYNC PORTB=0;
#define BLACK PORTB=1;
#define COLUMN(r) SPDR=pgm_read_byte(&font[(uint8_t)text[textrow][r]][fontline]);
/* This is our text buffer. Populate this as you please. */
char *text[17] =
{
"************************************",
"* *",
"* ATmega NTSC Video Text Generator *",
"* Version 0.9 *",
"* *",
"* For more info please visit *",
"* http://jmp.no/…; *",
"* *",
"************************************",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" Cool!",
};
Může mě někdo něják nasměrovat? Prostě narážím na nedostatek zkušeností s touto problematikou. Jinak to co chci zobrazit na CRT vypadá následovně.
S J Z
| | |
------------------------------------------------------------ 100%