Jag sitter och labbar med att styra en unipolär stegmotor (från en skrivare) med en AVR Attiny26, koden nedan funkar precis som tänkt såhär långt, motorn snurrar medsols konstant.
Nu till problemet, jag tänkte koppla in en potentiometer på ADC3 (PA4) som man kan styra hastigheten med.
Jag försöker köra ADC:n i "free running mode" och uppdatera en global variabel med nya värdet inuti en interrupt, men när jag försöker göra något med denna variabel inuti main och kompilerar koden så ökar storleken på hex-filen från 800 bytes till 14kB (och ryms således inte i MCU:ns flashminne).
Jag förstår inte varför detta händer, om jag förstått saken rätt så beror det på att man gör flyttalsberäkningar med en MCU som inte stöder detta(?) Men det bör ju inte ske i denna kod eller?
Här är koden såhär långt, kompilerar med avr-gcc.
Det är alltså första raden inuti while(1), dly = adcvalue, som ställer till det. Samma sak händer om jag sätter _delay_ms(adcvalue);.
Kod: Markera allt
/*********************************************************************
* Unipolar stepper motor driver test code
*
* Device: attiny26
*********************************************************************/
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
// Speed pot ADC value
uint8_t adcvalue = 0;
// ADC conversion complete interrupt
ISR(ADC_vect)
{
adcvalue = ADCH;
}
int main(void)
{
// Stepper motor outputs on PA0-PA3
DDRA |= (1 << PA0) | (1 << PA1) | (1 << PA2) | (1 << PA3);
// Set all outputs low
PORTA = 0x00;
// Set up ADC
// AVCC as ref
// Left adjust result
// Use ADC3 (PA4)
ADMUX |= (1 << ADLAR) | (1 << MUX1) | (1 << MUX0);
// ADC enable
// Start conversion
// Free running mode
// ADC complete interrupt enable
// 1/128 prescaler
ADCSR |= (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
// Enable global interrupts
sei();
uint8_t dly = 200;
while(1)
{
//dly = adcvalue;
// A 0001 1
PORTA = 0x01;
_delay_ms(dly);
// AB 0011 3
PORTA = 0x03;
_delay_ms(dly);
// B 0010 2
PORTA = 0x02;
_delay_ms(dly);
// BC 0110 6
PORTA = 0x06;
_delay_ms(dly);
// C 0100 4
PORTA = 0x04;
_delay_ms(dly);
// CD 1100 12
PORTA = 0x0C;
_delay_ms(dly);
// D 1000 8
PORTA = 0x08;
_delay_ms(dly);
// DA 1001 9
PORTA = 0x09;
_delay_ms(dly);
}
}
- MaggoT