TOIE1 + TICIE1 + OCIE1A + OCIE1B ???
ich tippe mal auf TICIE1
TOIE1 + TICIE1 + OCIE1A + OCIE1B ???
ich tippe mal auf TICIE1
Jein:
TICIE = Input Change (zum Vermessen von externen Rechtecksignalen)
OCIEA, B = bereits von den Steppern verbraucht
TOIE = Overflow -> geht noch!!
Mit welcher Frequenz kommen denn Overflow-Interrupts rein?
Quarztakt: 8MHz
Taktteiler: Timer1-Frequenz= 1/8 Quarzfrequenz
Timertakte bis Überlauf= 2^16 (=65536)
na mit ca 15,2587890625 Hz ![]()
siehste doch auf den falschen getippt
mfg maik
Richtisch ![]()
...und das ist für das LED-Geblinke doch optimal!
Also dreh mal noch den Overflow-Interrupt in der init_stepper()-Funktion an
und schreib
ISR (TIMER1_OVF_vect)
{
Flags |= (1<<IND);
}
in dein ehemaliges DC-Motor File.
Dadurch sollte der LED-Kram schon wieder laufen.
anbei mein aktueller Stand...
Und schon ist das Vorgeplenkel wieder erledigt und es geht an die Motoren selbst!
Die wesentliche Änderung ist eigentlich nur, dass wir keine Pattern mehr ausgeben sondern nur noch Takte.
-> Raus mit der Schritt-Tabelle!
also habe die zeile am ende des codes gestzt
und mal durchlaufen lassen
er kommt dort nicht an.
weil er in diesen zeilen hängen bleibt.
while (delay != 0)
{
_delay_us(32);
delay--;
}
mfg maik
mit schritt-tabelle meinst du bestimmt diese??
const uint8_t Step[] PROGMEM = { //halfsteps
0b00010001,
0b00110011,
0b00100010,
0b01100110,
0b01000100,
0b11001100,
0b10001000,
0b10011001,
0b00010001
};
so ist es.
Was sagt der Compiler?
muhaha:P
FEHLER in init_stepper
"step" wurde nicht deklariert
muss also noch geschehen. richtig ??
und wo überall?
(Auf die Meldung draufklicken...)
in der lib-stepper.c ???
Auf "../lib_stepper.c:80: error: 'Step' undeclared....." draufklicken!
dann führt er mich auf diese zeile in der lib_stepper.c
tmpA= pgm_read_byte(&Step[(--X.Pos &7)]); //move through full range (open loop)
hier wird wohl "step" als erstes benutzt ??
mfg maik
bingo!
Und dort müssen wir nun stattdessen die Pulse setzen.
Was macht die Funktion bislang:
Es werden für beide Achsen getrennt die Pattern gebildet und dann zusammengeführt.
Brauchen wir nicht mehr:
Setz einfach die Clockpins für Deine Stepper HI.
und vor dem Delay wieder LO.
//postion reset (homing)
uint16_t delay;
X.Pos= (X_MAX +20);
Y.Pos= (Y_MAX +20);
while ((X.Pos != 0) || (Y.Pos != 0))
{
if (X.Pos > 0)
{
if (PIND &(1<<PD4))
{
--X.Pos;
PORTA |= (1<<PA?); //setze Clock-Pins
}
else X.Pos= 0; //Anschlag detected (closed loop reference)
}
if (Y.Pos > 0)
{
if (PIND &(1<<PD5))
{
--Y.Pos;
PORTA |= (1<<PA?);
}
else Y.Pos= 0;
}
delay= (0xFF -ACC);
PORTA &= ~(1<<PA?); //setze Clock Pins zurück
PORTA &= ~(1<<PA?);
while (delay != 0)
{
_delay_us(32);
delay--;
}
}
Display More
(Müssen die Richtungspins für "gegen den Uhrzeigersinn eigentlich HI oder LO sein?)
also wenn ich das richtig sehe ist das die homing fahrt und er fährt bis an PD4 ein signal kommt oder er alle schritte gefahren hat ??
wie soll ich die pins setzen ? oder anders was soll raus und was muss rein??
so gut bin ich noch nicht?(
ahh du warst schneller:D
oki ist geschehen.
der erste pin ist PA6 und der 2te PA4
nun zum nächsten fehler wieder in der lib_stepper.c
uint8_t step= pgm_read_byte(&Step[(X.Pos &7)]); //get new X pattern
Ansonsten ist DIR= LO für rückwerts fahren??
den nächsten Fehler behandelst Du genauso:
Am Anfang HI gehen, dann etwas rechnen am Ende wieder LO gehen.
(So bekommen wir die Pulslänge von 1us hin ![]()
jo können wir erstmal machen, kann ich ja immernoch ändern .
zur not den motor andersherum anklemmen:D
ich denke mal dort schaut er welche pins grade an sind (welcher step grade ist)
um den nächst richtigen zu nehemen??
mfg maik
nochwas ich denke mal diese zeile kann raus??
uint8_t tmp, tmpA= 0, tmpB= 0;
oder brauchen wir die noch??
Nö:
Er liest den kompletten Port ein, überschreibt das eigene Pattern mit dem neuen und haut das ganze dann wieder raus ![]()
Die tmps beim Homing können natürlich weg.
Hier die Lösung für die anderen Clocks: