Forum: Mikrocontroller und Digitale Elektronik Programmierung Problem Mikrocontroller XC886


von Julian Reimer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich habe ein Trainingsboard mit dem XC886 Mikrocontroller. Ich möchte 
folgendes Programm verwenden, siehe Anhang. Mein Problem ist das die if 
Schleife usw. nicht funktionieren. Ich möchte wenn die LED auf Low ist 
die Schleife starten. Das funktioniert jedoch nicht. Habe ich einen 
Fehler im Programm? Vielen Dank!

PS: Das Programm ist für ein selbstgebauten Timelapse Slider :)

MfG Julian

//********************************************************************** 
************************************************************************ 
***
// Projekt Timelapse Slider
// Name: Julian Reimer
// Status: V1.2
// Datum: 29.03.2012
// Noch offen: Ausgabe LCD Infos und richtige Darstellung
//********************************************************************** 
************************************************************************ 
***
#include <xc866.h>
//********************************************************************** 
************************************************************************ 
***
// LCD Funktionen :
extern void lcd_init(void);    // Init LCD
extern void lcd_clr(void);     // LCD Lˆschen
extern void lcd_byte(char);    // Ausgabe unsigned char  => 3 stellig
extern void lcd_str(char *ptr);  // Ausgabe String
extern void lcd_curs(char);    // Cursor setzen
extern void asc_out(char);       // Ausgabe eines ASCII Zeichens

// ADC Funktionen :
extern void adc_init(void);
extern unsigned int adc_in(unsigned char);

// eigene Funktionen :
void init();
void adc(void);
void linkslauf(void);
void rechtslauf(void);
void init_port3(void);
void wait(void);
void wait2(unsigned char);
void wait3(unsigned char);
void wait4(void);
void wait_lcd(void);
void bildzaehler(void);
void stop(void);
void lcd(void);
void lcd_startup(void);

//****LOKALE_VARIABLEN************************************************** 
************************************************************************ 
*******************
unsigned int i,wert;
sbit P0_3 = P0_DATA^3;
sbit P0_4 = P0_DATA^4;
sbit P0_5 = P0_DATA^5;
sbit P0_7 = P0_DATA^7;

sbit P1_2 = P1_DATA^2;
sbit P1_3 = P1_DATA^3;
sbit P1_4 = P1_DATA^4;

sbit P3_0 = P3_DATA^0;
sbit P3_1 = P3_DATA^1;
sbit P3_2 = P3_DATA^2;
sbit P3_3 = P3_DATA^3;
sbit P3_4 = P3_DATA^4;
sbit P3_5 = P3_DATA^5;
sbit P3_6 = P3_DATA^6;
sbit P3_7 = P3_DATA^7;

unsigned char stufe1, stufe2;

//****MAIN************************************************************** 
************************************************************************ 
*******
void main(void)
{
  init();
//  bildzaehler();
  lcd_startup();
  wait_lcd();
  wait_lcd();
  wait_lcd();
  lcd_clr();
  lcd();

  while(P0_3 == 1) // PORT 0.3    = START & STOP
  {
  if(P0_4 == 1)    // PORT 0.4    = RECHTS WENN LED = 1
    {
      rechtslauf();
    }

  if(P0_4 == 0)    // PORT 0.4     = LINKS WENN LED = 0
    {
      linkslauf();
    }
  }

  if(P0_5 == 0)    // PORT 0.7    = MOTOR MANUELL AKTIVIEREN
  {
    P3_0 = 1;
    P3_1 = 1;
  }

  if(P3_6 == 0)    // PORT 0.7    = MOTOR STOPPEN WENN DER SCHLITTEN AM 
ENDE IST
  {
    stop();
  }

  if(P3_7 == 0)    // PORT 0.7    = MOTOR STOPPEN WENN DER SCHLITTEN AM 
ENDE IST
  {
    stop();
  }

}
//****INIT************************************************************** 
************************************************************************ 
*******

void init(void)
{
  TMOD = TMOD & 0xF0;
  TMOD = TMOD | 0x01;
  lcd_init();
  lcd_clr();
  adc_init();
  init_port3();

  for(i=0; i<2; i++)
  {
    P3_0 = 1;
    P3_1 = 0;
    P3_2 = 1;
    P3_3 = 0;
    P3_4 = 1;
    P3_5 = 0;
    P3_6 = 1;
    P3_7 = 0;
    wait4();
    P3_0 = 0;
    P3_1 = 1;
    P3_2 = 0;
    P3_3 = 1;
    P3_4 = 0;
    P3_5 = 1;
    P3_6 = 0;
    P3_7 = 1;
    wait4();
  }
  P3_DATA = 0;
}

//****LCD_STARTUP******************************************************* 
************************************************************************ 
*********

void lcd_startup(void)
{
  lcd_str("Julian R.");
  lcd_curs(40);
  lcd_str("STARTUP");
  lcd_curs(79);
}

//****LCD*************************************************************** 
************************************************************************ 
******

void lcd(void)
{
  lcd_str("TIMELAPSE");
  lcd_curs(40);
  lcd_byte(adc_in(4));
  lcd_curs(46);
  lcd_byte(adc_in(5));
  lcd_curs(79);
//  lcd_str("TIMELAPSE SLIDER");
//  lcd_curs(20);
//  lcd_str("Motor_V: ");
//  lcd_byte(platzhalter);
//  lcd_curs(40);
//  lcd_str("Intervall: ");
//  lcd_byte(platzhalter);
//  lcd_curs(60);
//  lcd_str("Bilder: ");
//  lcd_byte(platzhalter);
//  lcd_curs(68);
//  lcd_str("Richtung: ");
//  lcd_byte(platzhalter);
}
//****INIT_PORT_0+3***************************************************** 
************************************************************************ 
****************

void init_port3(void)
{
    wert = 0;
    P3_DIR = 0xFF;
    P0_DIR = 0xff;

    P0_5 = 1;
    P0_4 = 1;
  P0_3 = 1;
  P1_2 = 0;
  P1_3 = 0;
  P1_4 = 0;
}

//****RECHTSLAUF******************************************************** 
************************************************************************ 
*************
// BELICHTUNGS/PAUSE VERHƒLTNIS SOLLTE 50:50 sein!
void rechtslauf(void)
{
  stufe1 = adc_in(4);
  stufe2 = adc_in(5);
  P3_DATA = 0x00;
  wait();       //TEST!!! Verzˆgerungszeit
  wait3(stufe2);   //Timer Belichtungszeitpause
  P3_DATA = 0x02;
  wait2(stufe1);   //Motorlaufzeit
  P3_DATA = 0x00;
  wait();       //Timer Belichtungszeitpause
  P3_DATA = 0x08;
  wait3(stufe2);   //Kameraauslˆse-Signalzeit  (Belichtung)
  wait3(stufe2);
}

//****LINKSLAUF********************************************************* 
************************************************************************ 
************
// BELICHTUNGS/PAUSE VERHƒLTNIS SOLLTE 50:50 sein!
void linkslauf(void)
{
  stufe1 = adc_in(4);
  stufe2 = adc_in(5);
  P3_DATA = 0x00;
  wait();
  P3_DATA = 0x01;
  wait2(stufe1);
  P3_DATA = 0x00;
  wait();
  P3_DATA = 0x08;
  wait3(stufe2);
  wait3(stufe2);
}

//*****STOP************************************************************* 
************************************************************************ 
*******

void stop(void)
{
  P3_DATA = 0x00;
}

//*****WAIT_FUNKTIONEN************************************************** 
************************************************************************ 
******************

void wait3(unsigned char k) // Kameraauslˆse-Signalzeit
{
  unsigned char i=0;
  for(i=0; i<k; i++)
  {
    TF0 = 0;
    TH0 = 20;  //125
    TL0 = 40;  //202
     TR0 = 1;
    while(TF0 == 0);
    TR0 = 0;
  }
}

void wait2(unsigned char j) //Motorlaufzeit
{
  unsigned char i=0;
  for(i=0; i<j; i++)
  {
    TF0 = 0;
    TH0 = 125;    //1 Microsekunde
    TL0 = 202;
     TR0 = 1;
    while(TF0 == 0);
    TR0 = 0;
  }
}

void wait() //Timer Belichtungszeitpause...
{
  unsigned char i=0;
  for(i=0; i<200; i++)
  {
    TF0 = 0;
    TH0 = 125;
    TL0 = 202;
     TR0 = 1;
    while(TF0 == 0);
    TR0 = 0;
  }
}

void wait_lcd()
{
  unsigned char i=0;
  for(i=0; i<200; i++)
  {
    TF0 = 0;
    TH0 = 20;
    TL0 = 40;
     TR0 = 1;
    while(TF0 == 0);
    TR0 = 0;
  }
}

void wait4()
{
  unsigned char i=0;
  for(i=0; i<50; i++)
  {
    TF0 = 0;
    TH0 = 20;
    TL0 = 40;
     TR0 = 1;
    while(TF0 == 0);
    TR0 = 0;
  }
}

void bildzaehler()
{
//  unsigned int b;
//  if(P3_3 == 1)
//  {
//    P0_3 = 1;
//    b++;
//    asc_out(b);
//  }
}

//****ENDE************************************************************** 
************************************************************************ 
*******

von forever (Gast)


Lesenswert?

Als Erstes benötigst Du eine Endlosschleife. Deine if Abfragen werden 
einmal durchlaufen und dann ... ?

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.