#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.