PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitte darum den Code zu überprüfen! Schrittmotor!



Boozer99
11.01.2009, 17:26
Hallo erstmal,

ich hab hier einen Code/Funkton geschrieben für meine Schrittmotoransteuerung über den RN Stepp 297

Das Programm soll 552 einzelne Schritte ausführen!



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


extern uint16_t* volatile s; /*Externe veränderliche Pointervariable S=Schritt im 16bit register! 65530Zeichen!*/

void auffuellen(void)
{
volatile int i; /*Counter Variable*/
unsigned int zaehler=0;

for(*s=0;*s<=552;*s++) /*Schrittmotor soll 552 einzelne Schritte tun*/
{
PORTD &= ~(1<<PD0); /*PIN 1 wird auf Low gesetzt,Motor dreht sich noch nicht!*/
PORTD |= (1<<PD1); /*PIN 2 wird auf High gesetzt, für Drehrichtung gg. Uhrzeigersinn*/

/*Taktgebung*/
TCCR0 |=(1<<CS02); /* CPU Takt / 256*/
TIMSK |=(1<<OCIE1A);
OCR1=8; /*Bei 8 wird das Interrupt ausgelöst! Counter beginnt bei 0*/
sei();
if (i==4)
{zaehler++;
i=0;}
/*Motor bewegt sich um einen Schritt*/
if(zaehler=1)
{
PORTD |=(1<<PD0);}
if(zaehler=2)
{
PORTD &= ~(1<<PD0);}

}/*for-Schleife zu*/
}/*auffüllen ende*/



Wird das so laufen?
muss ich die externe Variable noch irgendwie miteinbinden, in den Programmblock? Die sollte am schluss den Wert 552 haben und auch behalten!
Letzte dumme Frage, wo kann ich das Programm testen?? AVR Studio?

MFG BOOZer

Besserwessi
11.01.2009, 18:30
Die initialisierung des Timers gehört vor die For-Schleife, das braucht man ja nur einmal. Da fehlt noch die ISR für den Timer. Es ist auch nicht klar wie sich I und Zaehler ändern. die Zaehler variable geht immer nur hoch, nie wieder auf 0 zurück.
So wie es jetzt ist wird das noch nicht funktionieren.

Wenn man das Schreiben in AVRstudio macht, kann man das auch zur simulation nutzen. Unter Debug sollte man den Simulator starten können. Es braucht aber etwas Zeit bis man den Simulator verstanden hat.

Am ende fehlt noch eine Endlosschleife.

Boozer99
11.01.2009, 22:39
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>


volatile uint16_t *s; /*Externe veränderliche Pointervariable S=Schritt im 16bit register! 65530Zeichen!*/

void auffuellen (void)
{
volatile int i=0; /*Counter Variable*/
unsigned int zaehler=0;
*s=0;

PORTD |= (1<<PD1); /*Drehrichtung*/

/*Taktgebung*/
TCCR0 |= (1<<CS02); /* CPU Takt / 256*/
TIMSK |= (1<<OCIE0);
OCR0=8; /*Bei 8 wird das Interrupt ausgelöst! Counter beginnt bei 0*/

for(*s=0;*s<=552;*s++) /*Schrittmotor soll 552 einzelne Schritte tun*/
{
PORTD &= ~(1<<PD0); /*PIN 1 wird auf Low gesetzt,Motor dreht sich noch nicht!*/

sei();
if (i==4)
{zaehler++;
i=0;}
/*Motor bewegt sich um einen Schritt*/
if(zaehler==1)
{
PORTD |=(1<<PD0);}
if(zaehler==2)
{
PORTD &= ~(1<<PD0);
zaehler=0;
}
}
ISR (TIMER0_COMP_vect)
{
i++;
}
}


Compiler gibt mir noch immer ein Fehler bei der ISR aus! Was mach ich falsch??

Grüsse

Boozer99
16.01.2009, 19:43
Hab jetzt den Fehler!
Thy