Come da soggetto, vorrei pilotare un servo sulla Z, nel mio Uno c'è il GRBL, e tutto funge,
ora ho trovato questo progettino che in teoria non riesco a capire perchè non deve funzionarmi :-(((((,
Ho preo giu sia il compilato che il sorgente, usato un ATtiny25, prelevato le librerie e messe nella cartella hardware nella cartella degli sketch, e tutto funziona, col mio nano ho messo lo sketch ISP,
fatto tutto il circuitino nella bred board, selezionato ATtiny 8Mhz e caricato il bootloader nel ATtiny,
e tuuto a funzionato, poi per verificare ho caricato il blink nell'ATtini 8Mhz, e tutto funziona anche il tempo
di clok ad occhio :-))) direi che blippa ogni secondo, ed ora attraverso AVRDude ho messo l' .hex
nel ATtiny, ma quando l'ho provato qualcosa fa, ma lungi da funzionare, gli stepper X Y vanno a scatti
cioè prendono il comando si muovono, ma quando tocca alla Z ils ervo fa qualcosa si muove dove gli pare
e il tempo che X Y eseguano un altra riga di comando è molto alto, come se la frequenza di clok
non fosse giusta, ho l'interrupt sul pin dell'ATtiny non funzionasse, ho cambiato anche il PIC con un altro,
ho provato con un ATtiny85, ho prelevato il datasetcompleto dell'ATtiny per vedere se qualcosa non fosse apposto, ma mi pare tutto OK, la libreria delay.h, riporta quanto segue:
/** \defgroup util_delay <util/delay.h>: Convenience functions for busy-wait delay loops
\code
#define F_CPU 1000000UL // 1 MHz
//#define F_CPU 14.7456E6
#include <util/delay.h>
\endcode
\note As an alternative method, it is possible to pass the
F_CPU macro down to the compiler from the Makefile.
Obviously, in that case, no \c #define statement should be
used.
dato che io sto compilando con la IDE di Arduino, i makefile non c'è,
e perciò ho aggiunto alla libreria .
#define F_CPU 8000000UL //8 Mhz
=====================================
sorgente:
//***************************************
//* Pins: *
//* ______ *
//* RESET-| |-+5V *
//* HOME_Z-|ATTiny|-STEP *
//* -|25/85 |-DIR *
//* GND-|______|-Servo signal *
//* *
//* *
//***************************************#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#define SERVO_PIN PB0
#define DIRECTION_PIN PB1
#define HOME_PIN PB3//DO NOT CHANGE STEP_PIN
#define STEP_PIN PB2//Uncomment if you're using the Z-Axis for a pen and want to move it up when homing
#define REVERSE_Z_BEHAVIOUR//Experiment until you find the values for servo completely up or down.
//Default values should work OK when using a pen and reversed Z axis
#define PWM_MIN 50
#define PWM_MAX 400//Changes "sensivity" of servo movement per step
#define PWM_RESOLUTION 20
volatile int pwm;void delayus(int useconds)
{
for (int _temp=0;_temp<useconds;_temp++)
{
_delay_us(1);
}}
void init (void)
{
//IO-Ports setup
DDRB |=(1<<SERVO_PIN) |(1<<HOME_PIN);
//PORTB |=(1<<DIRECTION_PIN)|(1<<STEP_PIN);//Falling-edge Interrupt on PB2
MCUCR |=(1<<ISC01);
GIMSK |=(1<<INT0);//Timer0 setup
TCCR0A |=(1<<WGM01); //CTC mode, set OC0A on match
TCCR0B |=(1<<CS02)|(1<<CS00); //Prescaler 1024TIMSK |=(1<<OCIE0A); //CTC Interrupt enable
OCR0A= (8000000/(1024*50)-1); //Set Timer to ~100Hz
//Set Z-servo to max
pwm=PWM_MAX;}
int main (void)
{
init();
sei();
while(1)
{#ifdef REVERSE_Z_BEHAVIOUR
if (pwm<=PWM_MIN)
{
pwm=PWM_MIN;}
if (pwm <PWM_MAX)
{PORTB |=(1<<HOME_PIN);
}if (pwm>=PWM_MAX)
{
pwm=PWM_MAX;
PORTB &= ~(1<<HOME_PIN);
}#else
if (pwm<=PWM_MIN)
{
pwm=PWM_MIN;
PORTB &= ~(1<<HOME_PIN);
}if (pwm >PWM_MIN)
{PORTB |=(1<<HOME_PIN);
}if (pwm>=PWM_MAX)
{
pwm=PWM_MAX;}
#endif
}return 0;
}//Software PWM
ISR(TIMER0_COMPA_vect)
{
PORTB |=(1<<SERVO_PIN); //Servo pin on_delay_us(550); //Wait for PWM to finish
delayus(pwm);PORTB &=~(1<<SERVO_PIN); //Servo pin off
}
//Falling edge interrupt
ISR(INT0_vect)
{
if (!(PINB & (1<< DIRECTION_PIN)))
{
pwm-=PWM_RESOLUTION;
}
else
{
pwm+=PWM_RESOLUTION;
}
}
====================================================
per compilarlo sotto IDE Arduino ho modificato
void init(void)
in
void setup(void)
poi
int main(void)
in
void loop(void)
ho commentato la chiamata a init()
//init()
e ho commentato in fondo
//return(0)
il sorgente si compila e funziona, ma esattamente come l'hex che ha distribuito
l'autore :-(((((.
se qualcuno capisco piu di mè e vuole darmi una mano è il ben venuto :-)),
io sono un principiantino :-((((((.
la cosa mi sarebbe utile per fare un plotterino per disegnare i PCB :-)))
tipo questo:
Dirk ha distribuito anche il suo Firmware, ma anche questo non mi funziona
per niente, non muove niente, ma proprio niente :-((((
Ciao!