Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

"Масивен" проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4854
Страница 1 от 1

Автор:  lz3060 [ Вто Сеп 25, 2007 3:26 am ]
Заглавие:  "Масивен" проблем

Здравейте,

Та значи, управлявам 7-сегментни дисплеи с ATTiny26, използвам avr-gcc. В хедър съм дефинирал:
Код:
#define   SEG_a   0x01
#define   SEG_b   0x02
#define   SEG_c   0x04
#define   SEG_d   0x08
#define   SEG_e   0x10
#define   SEG_f   0x20
#define   SEG_g   0x40
#define   SEG_DOT  0x80

#define   CHAR_0   0xff - (SEG_a+SEG_b+SEG_c+SEG_d+SEG_e+SEG_f      )
#define   CHAR_1   0xff - (      SEG_b+SEG_c                        )
#define   CHAR_2   0xff - (SEG_a+SEG_b+      SEG_d+SEG_e+      SEG_g)
#define   CHAR_3   0xff - (SEG_a+SEG_b+SEG_c+SEG_d+            SEG_g)
#define   CHAR_4   0xff - (      SEG_b+SEG_c+            SEG_f+SEG_g)
#define   CHAR_5   0xff - (SEG_a+      SEG_c+SEG_d+      SEG_f+SEG_g)
#define   CHAR_6   0xff - (SEG_a+      SEG_c+SEG_d+SEG_e+SEG_f+SEG_g)
#define   CHAR_7   0xff - (SEG_a+SEG_b+SEG_c                        )
#define   CHAR_8   0xff - (SEG_a+SEG_b+SEG_c+SEG_d+SEG_e+SEG_f+SEG_g)
#define   CHAR_9   0xff - (SEG_a+SEG_b+SEG_c+SEG_d+      SEG_f+SEG_g)
#define   CHAR_A   0xff - (SEG_a+SEG_b+SEG_c+     +SEG_e+SEG_f+SEG_g)
#define   CHAR_B   0xff - (            SEG_c+SEG_d+SEG_e+SEG_f+SEG_g)
#define   CHAR_C   0xff - (SEG_a+            SEG_d+SEG_e+SEG_f      )
#define   CHAR_D   0xff - (      SEG_b+SEG_c+SEG_d+SEG_e+      SEG_g)
#define   CHAR_E   0xff - (SEG_a+            SEG_d+SEG_e+SEG_f+SEG_g)
#define   CHAR_F   0xff - (SEG_a+                  SEG_e+SEG_f+SEG_g)


В главния файл дефинирам масив inline:
Код:
unsigned char digits[16] = {
   CHAR_0, CHAR_1,   CHAR_2,   CHAR_3,   CHAR_4,   CHAR_5,
   CHAR_6,   CHAR_7,   CHAR_8,   CHAR_9,   CHAR_A,   CHAR_B,
   CHAR_C,   CHAR_D,   CHAR_E,   CHAR_F };


И сега, всеки път като се опитам да използвам стойност от масива получавам 0xFF. Това се вижда на дисплеите (т.е. нищо не се вижда, щото са актив-лоу). За да съм по сигурен пратих данните по RS232, пак получих 16 пъти 255.

Вероятно е нещо адски елементарно, ама доста време се главоблъскам вече. Със сигурност тук има хора, които са се сблъсквали с това. Добри хора, помогнете!

Автор:  setoy [ Вто Сеп 25, 2007 9:34 am ]
Заглавие: 

Пробвай:

#define CHAR_0 (0xff - (SEG_a+SEG_b+SEG_c+SEG_d+SEG_e+SEG_f ) )
....

Автор:  lz3060 [ Вто Сеп 25, 2007 10:15 am ]
Заглавие: 

Тц.

Пробвах всичко за което се сетих, включително
Код:
unsigned char digits[16] = {
   192, 249, 164, 176,
   153, 146, 130, 248,
   128, 144, 136, 131,
   198, 161, 134, 142 };


Пак получавам само 0xff. Интересното е, че дори това:
Код:
unsigned char aString[3] = "bla";


Дава същия резултат. Някаква особеност на компилатора/библиотеката?!

Автор:  Zdrav [ Вто Сеп 25, 2007 12:37 pm ]
Заглавие: 

Не ти се инициализират променливите. Не съм работил с avr-gcc, но изглежда имаш проблем с .data секцията. Или не се линква правилно или не се копира в RAM-а при стартиране на програмата.
А digits[16] трябва ли да е променлива? Защо не я обявиш като const?

Автор:  bobyk [ Вто Сеп 25, 2007 1:02 pm ]
Заглавие: 

и аз не съм запознат в детайли с avr-gcc но проблема е в него, пробвах го на cvavr и си е ОК

Автор:  lz3060 [ Вто Сеп 25, 2007 1:41 pm ]
Заглавие: 

Zdrav, прав си. Използвам темплейтен Makefile, рипнат някъде от нета. Много съм нов още в тези материи, изобщо не съм се загледал:
Код:
PROJECT = sandbox
TARGET = attiny26
CC = avr-gcc
OBJCOPY = avr-objcopy
CFLAGS = -mmcu=$(TARGET) -O2 -Wall $(DEBUG)
INCLUDES = -I.
SRC = $(PROJECT).c
OBJ = $(SRC:.c=.o)
ADUDE_OPTS = -c stk200 -P /dev/parport0 -p t26 -y

# "-c" means compile but don't link
.c.o:
        $(RM) $@
        $(CC) -c $(CFLAGS) $(INCLUDES) $*.c

# Targets...

all: $(OBJ)

hex: $(PROJECT).hex

bin: clean $(PROJECT).bin

$(PROJECT).hex: $(PROJECT).elf
        $(OBJCOPY) -j .text -O ihex $(PROJECT).elf $(PROJECT).hex

$(PROJECT).bin: $(PROJECT).elf
        $(OBJCOPY) -j .text -O binary $(PROJECT).elf $(PROJECT).bin

$(PROJECT).elf: $(OBJ)
        $(CC) $(CFLAGS) -o $(PROJECT).elf -Wl,-Map,$(PROJECT).map $(OBJ)

simulate: $(PROJECT).bin
        simulavr -d atmega16 -P simulavr-disp $(PROJECT).bin

upload: $(PROJECT).hex
        avrdude $(ADUDE_OPTS) -U flash:w:$(PROJECT).hex:i

clean:
        rm -f *.o *.elf *.map *.hex *.bin $(PROJECT)

.PHONY: clean


И по-точно, bin таргета:
Код:
$(PROJECT).bin: $(PROJECT).elf
        $(OBJCOPY) -j .text -O binary $(PROJECT).elf $(PROJECT).bin


-j .text --> копирай само .text секцията.

Много благодаря!

А за const -- такава ще е, но ми се щеше да има данни в нея първо :)

Автор:  Zdrav [ Сря Сеп 26, 2007 5:51 am ]
Заглавие: 

lz3060 написа:
И по-точно, bin таргета:
Код:
$(PROJECT).bin: $(PROJECT).elf
        $(OBJCOPY) -j .text -O binary $(PROJECT).elf $(PROJECT).bin


-j .text --> копирай само .text секцията.

Това е грубо. Не бях се сетил за тази възможност. :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/