3

ATtinyチップのプログラミングは初めてです。Arduinoでこれと同等のプログラムを実行しましたが、動作しましたが、ATtiny2313で実行すると、エラーメッセージは表示されませんが、プログラムがフリーズしているように見えます。すべてのPORTBはLEDに接続されており、プログラムの実行時に代替LEDが点灯しますが、その後は交換せずに点灯したままになります。

私は、makeFile、AVRdude、およびUSBtinyISPプログラマーを使用してATtinyをプログラムしています。

プログラムに少し問題があるに違いないと思います。助けていただければ幸いです。

ありがとう

スティーブン

#include <avr/io.h>
#include <util/delay.h>

void myFunction(int status){
  if(status==1){
    PORTB = 0b10101010;
  }else{
    PORTB = 0b1010101;
  }
  int i;
  for(i=0; i<100; i++){
    _delay_ms(10);
  }
  return;
}

int main(void){
    DDRB = 0xFF;
    while(1){
        myFunction(1);
        myFunction(0);
    }
    return 0;
}

私のMakefileは:

DEVICE     = atmega8
CLOCK      = 8000000
PROGRAMMER = #-c stk500v2 -P avrdoper
OBJECTS    = main.o
FUSES      = -U lfuse:w:0xe4:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m

# ATMega8 fuse bits used above (fuse bits for other devices are different!):
# Example for 8 MHz internal oscillator
# Fuse high byte:
# 0xd9 = 1 1 0 1   1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000)
#        ^ ^ ^ ^   ^ ^ ^------ BOOTSZ0
#        | | | |   | +-------- BOOTSZ1
#        | | | |   +---------- EESAVE (set to 0 to preserve EEPROM over chip erase)
#        | | | +-------------- CKOPT (clock option, depends on oscillator type)
#        | | +---------------- SPIEN (if set to 1, serial programming is disabled)
#        | +------------------ WDTON (if set to 0, watchdog is always on)
#        +-------------------- RSTDISBL (if set to 0, RESET pin is disabled)
# Fuse low byte:
# 0x24 = 0 0 1 0   0 1 0 0
#        ^ ^ \ /   \--+--/
#        | |  |       +------- CKSEL 3..0 (8M internal RC)
#        | |  +--------------- SUT 1..0 (slowly rising power)
#        | +------------------ BODEN (if 0, brown-out detector is enabled)
#        +-------------------- BODLEVEL (if 0: 4V, if 1: 2.7V)
#
# For computing fuse byte values for other devices and options see
# the fuse bit calculator at http://www.engbedded.com/fusecalc/


# Tune the lines below only if you know what you are doing:

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

# symbolic targets:
all:    main.hex

.c.o:
    $(COMPILE) -c $< -o $@

.S.o:
    $(COMPILE) -x assembler-with-cpp -c $< -o $@
# "-x assembler-with-cpp" should not be necessary since this is the default
# file type for the .S (with capital S) extension. However, upper case
# characters are not always preserved on Windows. To ensure WinAVR
# compatibility define the file type manually.

.c.s:
    $(COMPILE) -S $< -o $@

flash:  all
    $(AVRDUDE) -U flash:w:main.hex:i

fuse:
    $(AVRDUDE) $(FUSES)

# Xcode uses the Makefile targets "", "clean" and "install"
install: flash fuse

# if you use a bootloader, change the command below appropriately:
load: all
    bootloadHID main.hex

clean:
    rm -f main.hex main.elf $(OBJECTS)

# file targets:
main.elf: $(OBJECTS)
    $(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
    rm -f main.hex
    avr-objcopy -j .text -j .data -O ihex main.elf main.hex
    avr-size --format=avr --mcu=$(DEVICE) main.elf
# If you have an EEPROM section, you must also create a hex file for the
# EEPROM and add it to the "flash" target.

# Targets for code debugging and analysis:
disasm: main.elf
    avr-objdump -d main.elf

cpp:
    $(COMPILE) -E main.c

これはデフォルトのファイルで、元の設定は変更していません。

4

2 に答える 2

2

あなたのコードは正しいようです。最も可能性の高い問題は、正しくビルドされていないことですが、これに対処するには、Makefile を確認する必要があります。

以下のリンク (リンクを投稿できないため、自分でコピー/貼り付けする必要があります) は、あなたと非常によく似た問題を抱えている人による投稿です。彼はコンパイル済みのオブジェクト ファイルをリンカーを介して実行していなかったことが判明しました。その結果、重要なライブラリが欠落しており、PIC が無限にループし、無効なオペコード (命令) を実行しようとしていました。

efreedom dot com/Question/E-27081/Using-Avr-Gcc-Delay-Ms-Causes-Chip-Freeze

これで問題が解決しない場合は、Makefile を投稿してみてください。

また、_delay_ms(10) を 100 回呼び出す必要はありません。_delay_ms(1000) を直接呼び出すことができます。より低い解像度が使用されます。

編集: Makefile を見た後、クロック速度が正しく設定されていないようです。CLOCK 設定は、AVR を実行している速度を指定します。それがかなりオフに設定されている場合 (8MHz で PIC が 1MHz で実行されている場合)、遅延ループは、1 時間かかると予想されるときに 8 秒かかります。 LED がフリーズしているように見えますが、十分に長く待つと実際に変化します。-DF_CPU=$(CLOCK) ステートメントを削除してみて、違いが生じるかどうかを確認してください。

それとは別に、あなたの Makefile には多くの未使用/不要なものがあり、現在 avr-gcc のセットアップが機能していないため、理解するのが難しいため、次のように Makefile を単純化してみると役立ちます。問題が発生した場合は、以下にコメントしてください。

DEVICE     = attiny2313
CLOCK      = 8000000
OBJECTS    = main.o

# Tune the lines below only if you know what you are doing:

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

# symbolic targets:
all:    main.hex

flash:  all
    $(AVRDUDE) -U flash:w:main.hex:i

clean:
    rm -f main.hex main.elf $(OBJECTS)

main.elf: $(OBJECTS)
    $(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
    rm -f main.hex
    avr-objcopy -j .text -j .data -O ihex main.elf main.hex
    avr-size --format=avr --mcu=$(DEVICE) main.elf
于 2013-01-27T13:19:19.667 に答える
0

Makefile の最初の行で間違ったチップが指定されています。

于 2013-01-27T16:14:27.610 に答える