www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega32 problem mit if()


Autor: Rocco J. (rocky_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
void  start(const uint32_t steps, uint16_t speed)
{
  if (speed < max_feed)      // max_feed
    speed = max_feed;
  running = 1;
  myprint(0, 0, "running...");
  OCR1A = speed;

  uint8_t rampe = 30;
  uint8_t rampe_res = 10;
  int32_t dummy = 1;

  PORTD |= (1<<stepper_enable);
  TCCR1B |= (1<<CS12)/*|(1<<CS11)|(1<<CS10)*/;

  while(1)
  {
    itoa(lauf, buff0, 10);
    myprint(11, 0, "lauf ");
    myprint(19, 0, buff0);
    itoa(steps, buff0, 10);
    myprint(11, 1, "steps");
    myprint(19, 1, buff0);
    itoa(OCR1A, buff1, 10);
    myprint(11, 2, "OCR1A");
    myprint(19, 2, buff1);
    itoa(dummy, buff1, 10);
    myprint(11, 3, "dummy");
    myprint(19, 3, buff1);
    if (lauf > steps)               // hier ein problem
    {
      lcd_clrscr();
      //steps++;
    }
  }
};

ich habe ein Problem bei der if-abfrage, sie wird nur ausgeführt wenn 
ich die Variable steps durch eine festen Wert z.B. 500 ersetze 
ausgeführt. Die Variable lauf wird im Timer-ISR hochgezählt.

Compileroption "-w -W -Wall -O2 -mmcu=atmega32 -std=c99 
-fF_CPU=8000000UL

mfg rocky_j

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal mehr Code. Was ist lauf für ein Typ und ist die Variable als 
volatile deklariert?

Autor: Rocco J. (rocky_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, der komplette Code
#ifndef  F_CPU
  #define  F_CPU 8000000L
#endif
#ifndef  XTAL
  #define  XTAL F_CPU
#endif


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>

#include "wintek2704.h"

#define stepper_port  PORTD
#define  stepper_clk    PD4
#define stepper_dir    PD5
#define  stepper_enable  PD6
#define  stepper_vh    PD7
#define  f        1    // vor
#define r        0    // rück


char    buff0[10];
char    buff1[10];
volatile  uint32_t    lauf = 0;
uint8_t    running = 0;
uint16_t  max_feed = 100;

// funkt protos
void  timer1_init();
void  stop();
void  start(const uint32_t, uint16_t);
void  vor();
void  rueck();
void  myprint(uint8_t, uint8_t, char *);
void  move(uint32_t, uint8_t, uint32_t, uint16_t);

int main(void)
{
  // erst ports auf low dann richtung
  PORTD &= ~( (1 << stepper_clk) | (1 << stepper_dir) | (1 << stepper_enable) | (1 << stepper_vh));

  DDRD  |= (1 << stepper_clk) | (1 << stepper_dir) | (1 << stepper_enable) | (1 << stepper_vh);
  _delay_ms(500);
  lcd_init(LCD_DISP_ON);
  lcd_puts("init system...\n");

  timer1_init();

  lcd_puts("TIMER1 rdy\n");

  _delay_ms(500);
  lcd_clrscr();
  _delay_ms(500);

  sei();    // interupt an

  //fakt = (vref / 1024000);

  _delay_ms(200);
  lcd_clrscr();

  //PORTD |= (1<< PD6);// | (1 << PD7);
  while(1)
  {/*
    lcd_gotoxy(0, 0);
    itoa(lauf, buff0, 10);
    lcd_puts(buff0);
    lcd_gotoxy(0, 1);
    itoa(TCNT1, buff1, 10);
    lcd_puts(buff1);*/



    {
      Move(100, f, 2000, 500);
      Move(100, r, 2000, 500);/*
      Move(5000, r, 500, 5);
      Move(110, r, 5000, 5);
      Move(1000, f, 50, 100);
      Move(100, r, 5000, 5);
      Move(150, f, 5000, 50);
      Move(1500, f, 200, 500);

      Move(5000, f, 500, 500);
      Move(30000, f, 500, 500);
      Move(10000, 5, 1000, 500);
      Move(500, f, 500, 500);*/

    }


  }
    return 0;
};


void  timer1_init()
{
//TCCR1A |= (1 << WGM11) | (1 << WGM10);
TCCR1B |= (1 << WGM12);// | (1 << WGM13);//  | (1<<CS10)|(1<<CS11);
//ICR1 = 10000;
//OCR1A = 5000;
TIMSK |= /*(1<<TOIE1) |*/ (1<<OCF1A);

};

void  myprint(uint8_t x, uint8_t y, char *txt)
{
  //lcd_clrscr();
  lcd_gotoxy(x, y);
  lcd_puts(txt);
};

void  start(const uint32_t steps, uint16_t speed)
{
  if (speed < max_feed)      // max_feed
    speed = max_feed;
  running = 1;
  myprint(0, 0, "running...");
  OCR1A = speed;

  uint8_t rampe = 30;
  uint8_t rampe_res = 10;
  int32_t dummy = 1;

  PORTD |= (1<<stepper_enable);
  TCCR1B |= (1<<CS12)/*|(1<<CS11)|(1<<CS10)*/;

  while(1)
  {
    itoa(lauf, buff0, 10);
    myprint(11, 0, "lauf ");
    myprint(19, 0, buff0);
    itoa(steps, buff0, 10);
    myprint(11, 1, "steps");
    myprint(19, 1, buff0);
    itoa(OCR1A, buff1, 10);
    myprint(11, 2, "OCR1A");
    myprint(19, 2, buff1);
    itoa(dummy, buff1, 10);
    myprint(11, 3, "dummy");
    myprint(19, 3, buff1);
    if (lauf > steps)
    {
      lcd_clrscr();
      //steps++;
    }
  }


/*  while(1)//(dummy >= 0))
  {
    //if (lauf <= rampe)
    //  OCR1A = speed + ((rampe_res * rampe) - rampe_res * lauf);
*/



};

void  stop()
{
  PORTD &= ~(1<<stepper_enable);
  TCCR1B &= ~((1<<CS10)|(1<<CS11)|(1<<CS12));
  running = 0;
  myprint(0, 0, "stop......");
}
void  rueck()
{
  PORTD |= (1<<stepper_dir);
  myprint(0, 1, "ruek");
};

void  vor()
{
  PORTD &= ~(1<<stepper_dir);
  myprint(0, 1, "vor ");
}


ISR(TIMER1_OVF_vect)
{
  PORTD ^= (1 << stepper_clk);
  _delay_us(5);
  PORTD &= ~(1 << stepper_clk);
  lauf++;
};

ISR(TIMER1_COMPA_vect)
{
  PORTD ^= (1 << stepper_clk);
  _delay_us(5);
  PORTD &= ~(1 << stepper_clk);
  lauf++;
}

void  Move(uint16_t speed, uint8_t dir, uint32_t steps, uint16_t wait)
{
  //OCR1A = speed;
  if (dir == f)
    vor();
  if (dir == r)
    rueck();
  start(steps, speed);
  _delay_ms(wait + 1);
};


mfh rocky_j

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Anhang wärs besser gewesen.
Wie wird denn die Fuktion start(), welche von Move() aufgerufen wird, 
beendet? Ich sehe keine Möglichkeit der Terminierung der while-Schleife.
Weiters greifst du nicht atomar auf lauf zu, was man jedoch machen 
sollte wenn der Datentyp größer als 8 Bit ist und er auch in einer ISR 
verändert wird.

Autor: Rocco J. (rocky_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der if-anweisung hatte ich schon break; drinnen, aber das problem ist 
das
if (lauf > 500)
{
 lcd_clrscr();
}
 funktioniert, aber
if (lauf > steps)
{
 lcd_clrscr();
}
 nicht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void  start(const uint32_t steps, uint16_t speed)

steps ist als const angegeben. Deshalb geht steps++ nicht.

Autor: Rocco J. (rocky_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steps++ ist ja auch auskommentiert und auch ohne const geht es nicht.

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändere mal den Prototyp von move auf Move. Die Funktion heisst ja 
schließlich Move mit großem M. Der erste Parameter ist auch uint16_t und 
nicht uint32_t.
Siehst du bei deiner Ausgabe, ob sich wirklich was ändert?

Autor: Rocco J. (rocky_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thx, jetzt geht es, hatte wohl Tomaten auf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.