logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

program do atemga16 z wyświetlaczem lcd

kliwer19 04 Lut 2010 17:26 848 1
REKLAMA
  • #1 7642888
    kliwer19
    Poziom 10  
    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);
    }
  • REKLAMA
  • #2 7643224
    Krauser
    Poziom 26  
    Znajdź lepszy przykład w napisany w C bez wstawek asemblerowych i na pewno więcej z niego zrozumiesz albo tylko zamień tą wstawkę z ticks używając _delay_us
REKLAMA