Witam.
Z tym powyżej jakoś sobie poradziłem i jakoś sie kompiluje, ale nie chce do końca działać. Więc porzuciłem tą koncepcję i chce wstawkę asemblerową rozwiązać w inny sposób ale tu pojawił się kolejny problem. Napisałem wstawkę wg instrukcji z helpa do acr-gcc i kompilator wywalił mi takie coś...
void instr_lcd(unsigned char instr) //przesłanie instrukcji
{
asm volatile (
"push x"
"in r16, PORTC""\n\t"
"ori r16,0b00000001""\n\t"
"out PORTC,r16""\n\t" // linia E w stan wysoki
"in r24, PORTC""\n\t"
"ori r24, 0xF0""\n\t"
"out PORTC, r24""\n\t" // 4 starsze bity danych wyświetlacza
"ori x, 0x0F""\n\t" //; 4 młodsze bity rejestru r16
"in r26, PORTC""\n\t"
"and x, r26""\n\t"
"out PORTC, x""\n\t" //; wynik na wyświetlacz
"in r17,PORTC""\n\t"
"ori r17, 0b00000000""\n\t"
"out PORTC,r17""\n\t" //;linia E w stan niski
"pop x""\n\t" //; odtwórz ze stosu "instr"
"swap x""\n\t" //; zamień połówki "instr"
"nop""\n\t"
"in r16, PORTC""\n\t"
"ori r16,0b00000001""\n\t"
"out PORTC,r16""\n\t"
"in r24, PORTC""\n\t"
"ori r24, 0xF0""\n\t"
"out PORTC, r24""\n\t" // ustaw 4 starsze bity danych wyświetlacza
"ori x, 0x0F""\n\t" //; ustaw 4 młodsze bity "instr"
"in r26, PORTC""\n\t"
"and x, r26""\n\t"
"out PORTC, x""\n\t"
"in r17,PORTC""\n\t"
"andi r17, 0b11111110""\n\t"
"out PORTC,r17""\n\t" //; linia E w stan niski
: "x" (instr)
);
//PORT&=~(1<<lcd_rs);
//PORT|=(1<<lcd_e);
//PORT=(PORT&0x0f)|(instr&0xf0); // starszy pół bajt
//PORT&=~(1<<lcd_e);
//asm("nop");
//PORT|=(1<<lcd_e);
//PORT=(PORT&0x0f)|((instr&0x0f)<<4); // młodszy półbajt
//PORT&=~(1<<lcd_e);
_delay_ms(1);
}
Kod w asemblerze zastępuje to co jest pod nim w komentarzu.
Po kompilacji AVRStudio wywala takie coś:
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s: Assembler messages:
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:30: Error: constant value required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:30: Error: garbage at end of line
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:32: Error: constant value required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:33: Error: constant value required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:35: Error: constant value required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:36: Error: constant value required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:36: Error: register number above 15 required
C:\DOCUME~1\...\USTAWI~1\Temp/ccKa5TPh.s:37: Error: constant value required
(...)
make: *** [lcd.o] Error 1
Build failed with 1 errors and 0 warnings...
Takich linii wyskakuje jeszcze duuuużo...
Kod napisany jest tak jak w helpie, a nie kompiluje się... Czy ktoś wie co jest nie tak?
EDIT- Po usunięciu "\n\t" zostają tylko błędy "constant value required" i "garbage at the end of line" i jest tego 3-4 razy mniej niż jak to jest na końcu każdej linii...