witam. Pisze program do obsługi wyświetlacza LCD podłączonego do atmega16. Korzytsam z ksiażki A. Witkowski - Mikrokontrolery AVR - programowanie w j ęzyku C. przykłady zastosowań. i mam problem z plikiem który zawiera dwie funkcje lcd_write i lcd_write_nibble. wiem ze w tej książce są błędy i właśnie przy kompilowaniu wyskoakują mi dwa błędy "../lcd_write.c:62: error: expected '(' before ')' token i
../lcd_write.c:62: error: undefined named operand 'ticks'" jestem w tym trochę nowy i nie mam pojęcia jak się ich pozbyć bo nie wiem skąd się biorą;/ czy ktoś mogłby mi pomóc w tym? to jest kod programu:
#include <avr/io.h>
#include "lcd_conf.h"
#define swap(reg) asm volatile( \
"swap %[r]" "\n\t" \
: [r] "+r" (reg) : )
#define short_delay(cnt) { \
uint8_t tmp; \
asm volatile ( \
"ldi %0, %[ticks]" "\n" \
"1: dec %0" "\n\t" \
"brne 1b" "\n\t" \
: "=d" )tmp) \
:[ticks] "M" (cnt) );}
uint8_t lcd_write_nibble(uint8_t data);
uint8_t lcd_write_nibble(uint8_t data)
{
LCD_DATA4_PORT &= ~_BV(LCD_DATA4_PIN);
LCD_DATA5_PORT &= ~_BV(LCD_DATA5_PIN);
LCD_DATA6_PORT &= ~_BV(LCD_DATA6_PIN);
LCD_DATA7_PORT &= ~_BV(LCD_DATA7_PIN);
asm volatile(
"sbrc %[data], 4" "\n\t"
"sbi %[port4], %[pin4]" "\n\t"
"sbrc %[data], 5" "\n\t"
"sbi %[port5], %[pin5]" "\n\t"
"sbrc %[data], 6" "\n\t"
"sbi %[port6], %[pin6]" "\n\t"
"sbrc %[data], 7" "\n\t"
"sbi %[port7], %[pin7]" "\n\t"
:[data] "+r" (data)
:[port4] "M" (_SFR_IO_ADDR(LCD_DATA4_PORT)),
[pin4] "M" (LCD_DATA4_PIN),
[port5] "M" (_SFR_IO_ADDR(LCD_DATA5_PORT)),
[pin5] "M" (LCD_DATA5_PIN),
[port6] "M" (_SFR_IO_ADDR(LCD_DATA6_PORT)),
[pin6] "M" (LCD_DATA6_PIN),
[port7] "M" (_SFR_IO_ADDR(LCD_DATA7_PORT)),
[pin7] "M" (LCD_DATA7_PIN)
);
LCD_E_PORT |= _BV(LCD_E_PIN);
asm volatile ( ".rept %[cnt]" "\n\t"
"nop" "\n\t"
".endr" "\n\t"
::[cnt] "M" (3));
LCD_E_PORT &=~_BV(LCD_E_PIN);
return data;
}
void lcd_write (uint8_t data)
{
data=lcd_write_nibble(data);
swap(data);
lcd_write_nibble(data);
short_delay(LCD_SMALL_DELAY);
}
../lcd_write.c:62: error: undefined named operand 'ticks'" jestem w tym trochę nowy i nie mam pojęcia jak się ich pozbyć bo nie wiem skąd się biorą;/ czy ktoś mogłby mi pomóc w tym? to jest kod programu:
#include <avr/io.h>
#include "lcd_conf.h"
#define swap(reg) asm volatile( \
"swap %[r]" "\n\t" \
: [r] "+r" (reg) : )
#define short_delay(cnt) { \
uint8_t tmp; \
asm volatile ( \
"ldi %0, %[ticks]" "\n" \
"1: dec %0" "\n\t" \
"brne 1b" "\n\t" \
: "=d" )tmp) \
:[ticks] "M" (cnt) );}
uint8_t lcd_write_nibble(uint8_t data);
uint8_t lcd_write_nibble(uint8_t data)
{
LCD_DATA4_PORT &= ~_BV(LCD_DATA4_PIN);
LCD_DATA5_PORT &= ~_BV(LCD_DATA5_PIN);
LCD_DATA6_PORT &= ~_BV(LCD_DATA6_PIN);
LCD_DATA7_PORT &= ~_BV(LCD_DATA7_PIN);
asm volatile(
"sbrc %[data], 4" "\n\t"
"sbi %[port4], %[pin4]" "\n\t"
"sbrc %[data], 5" "\n\t"
"sbi %[port5], %[pin5]" "\n\t"
"sbrc %[data], 6" "\n\t"
"sbi %[port6], %[pin6]" "\n\t"
"sbrc %[data], 7" "\n\t"
"sbi %[port7], %[pin7]" "\n\t"
:[data] "+r" (data)
:[port4] "M" (_SFR_IO_ADDR(LCD_DATA4_PORT)),
[pin4] "M" (LCD_DATA4_PIN),
[port5] "M" (_SFR_IO_ADDR(LCD_DATA5_PORT)),
[pin5] "M" (LCD_DATA5_PIN),
[port6] "M" (_SFR_IO_ADDR(LCD_DATA6_PORT)),
[pin6] "M" (LCD_DATA6_PIN),
[port7] "M" (_SFR_IO_ADDR(LCD_DATA7_PORT)),
[pin7] "M" (LCD_DATA7_PIN)
);
LCD_E_PORT |= _BV(LCD_E_PIN);
asm volatile ( ".rept %[cnt]" "\n\t"
"nop" "\n\t"
".endr" "\n\t"
::[cnt] "M" (3));
LCD_E_PORT &=~_BV(LCD_E_PIN);
return data;
}
void lcd_write (uint8_t data)
{
data=lcd_write_nibble(data);
swap(data);
lcd_write_nibble(data);
short_delay(LCD_SMALL_DELAY);
}