Forum: Mikrocontroller und Digitale Elektronik AVR446 (Schrittmotorsteuerung) auf ATmega328P


von hansi haus (Gast)


Lesenswert?

Hallo,

hat hier schonmal jemand die Atmel Application Note "AVR446: Linear 
speed control of stepper motor on tinyAVR and megaAVR devices" auf den 
ATmega328P umgeschrieben?

Würde die ganz gerne im Betrieb versuchen zu verstehen, habe mir auch 
schon die Application Note durchgelesen, dann aber festgestellt, dass 
sie aufgrund der fehlenden Include-Dateien und des älteren Compilers 
nicht einfach übersetzt werden kann.....

Also hat jemand das Ganze auf den 328P umgeschrieben und würde es hier 
zur Verfügung stellen?

Lieben Dank im Voraus ;)
hansi haus

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

hansi haus schrieb:
> Also hat jemand das Ganze auf den 328P umgeschrieben und würde es hier
> zur Verfügung stellen?

 Warum ?
 AVR446 ist schon für M48 geschrieben, was brauchst du da für M328
 umzuschreiben ?

von hansi haus (Gast)


Lesenswert?

weil es die Datei ioavr.h nicht gibt (No such file or directory)
und inavr.h auch nicht. Ich verwende AtmelStudio 7
Beim kompilieren gibt es die o.g. Fehler.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

hansi haus schrieb:
> weil es die Datei ioavr.h nicht gibt (No such file or directory)
> und inavr.h auch nicht. Ich verwende AtmelStudio 7
> Beim kompilieren gibt es die o.g. Fehler.

 Die sind für IAR, für GCC nimmt man ganz einfach:
 #include <avr/io.h>

von hansi haus (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es jetzt versucht anzupassen und bekomme keine Fehler mehr. Im 
AtmelStudio Simulator läuft es auch, aber nicht richtig.

Selbst wenn ich nur 10 Schritte vorgebe, bleibt das Programm im 
Endlosmodus und es wird permanent ein weiterer Schritt gemacht.

Dann habe ich es auf meine Testschaltung geflasht und mit dem Oszi an 
den Pins gemessen. -> Es passiert nichts.....

Wo kann der Fehler sein?

von AVR446 (Gast)


Lesenswert?

void main(void)
{
  // Number of steps to move.
  int steps = 10;
  // Accelration to use.
  int acceleration = 10;
  // Deceleration to use.
  int deceleration = 10;
  // Speed to use.
  int speed = 400;
  // Tells if the received string was a valid command.
  char okCmd = FALSE;

  Init();

  speed_cntr_Move(steps, acceleration, deceleration, speed);
  okCmd = TRUE;

  while(1){} // !! LEERER LOOP !!
}

main enthält einen leeren Loop
********************************
Der uC macht schlicht gar nichts
********************************

von hansi haus (Gast)


Lesenswert?

vorher wird speed_cntr_Move() aufgerufen. Das ist im Simulator aus zu 
sehen. Und ein Breakpoint beim Setzen des Ausgangs zeigt auch, dass 
diese Stelle nicht mehr verlassen wird und ständig ein Schritt gemacht 
wird.....

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

hansi haus schrieb:
> Wo kann der Fehler sein?
 Vielleicht weil du die Frequenz nicht angepasst hast ?
 Mega48 läuft mit 3,68MHz, somit ist T1_FREQ total falsch und alle
 daraus folgenden kalkulationen auch..

von hansi haus (Gast)


Lesenswert?

Frequenz habe ich auch angepasst. Einmal mit internen 8 MHz, und auch 
einmal auf anderem Aufbau mit 16 MHz. Leider keine Besserung.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

hansi haus schrieb:
> Frequenz habe ich auch angepasst. Einmal mit internen 8 MHz, und auch
> einmal auf anderem Aufbau mit 16 MHz. Leider keine Besserung.

 Leider zu viel Code fur genaues durchlesen.
 Dein Programm auf das notwendigste runterstrippen und langsam von
 vorne anfangen ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.