Очень странное программирование поведения gpio ATtiny25v с avr-gcc и avrdude через raspberry pi

#raspberry-pi #avr #avr-gcc #avrdude

#raspberry-pi #avr #avr-gcc #avrdude

Вопрос:

У меня есть ATtiny25v, подключенный к raspberry pi через SPI.

Я использую avr-gcc для компиляции своего кода. Затем я использую avrdude для загрузки.

Но я сталкиваюсь с очень странным явлением: основная функция не вызывается, и вместо этого первые инструкции первой функции оказывают влияние на gpio…

У меня есть светодиод, подключенный к порту b4.

… Я пробовал с несколькими чипами одной и той же модели, и все они ведут себя одинаково (за исключением одного с ошибкой)

…Кто-нибудь может это объяснить?

ПРИМЕЧАНИЕ: Я не стал подробно описывать это, но ни компилятор (с -Wall -pedantic ), ни avrdude (с -v -v ) не выдают никаких ошибок.

как в kcuzner, так и в вышестоящей версии (исправлен linux_gpiohttp://savannah.nongnu.org/bugs/?47550 ) дает те же результаты. kcuzner, использующий linuxspi-программатор, ведет себя точно так же.

это :

 #include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB amp;= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}
  

… загорается светодиод при запуске.

 #include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB3);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB amp;= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}
  

… Индикатор не горит

и этот :

 #include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB ^= B(PORTB4);
   PORTB ^= B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB amp;= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}
  

… также индикатор не горит.

 #include <avr/io.h>
#include <avr/interrupt.h>

#define B(b) (1 << b)

void ledT(){
   PORTB = PORTB | B(PORTB3);
   PORTB = PORTB | B(PORTB4);
}

void led(uint8_t s){
   if(s)
      PORTB |= B(PORTB4);
   else {
      PORTB amp;= ~B(PORTB4);
   }
}

int main(){
   PORTB = 0;
   DDRB = 0;
   USISR = 0;
   USIDR = 0;
   while(1);
   //return 0;
}
  

… Загорается светодиод

Комментарии:

1. Не могли бы вы просто включить один светодиод, прежде чем переходить к while (1). Вы должны установить битовый регистр DDR на логический на желаемом бите (где находится ваш светодиод), чтобы использовать его в качестве выходного сигнала.

2. можете ли вы предоставить дизассемблирование (обычно это файл .lss в каталоге «debug», если вы используете Atmel Studio). Мое предположение, что у вас неправильно выбран MCU.