www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik zwei programme in einer if schleife


Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

mein problem ist folgendes

ich habe zwei programme die auf zwei identischen boards laufen. das eine 
board ist master und das andere slave. jetzt möchte ich aber, beide 
programme zusammenfassen, sodas ich nurnoch ein programm habe, beidem 
ich vorher über taster auswählen kann ob es master oder slave sein soll. 
ich habe versucht das mit einer if else schleife zu realisieren, hat 
aber nicht geklappt. so langsam bin ich mit meinem latain am ende. ich 
hoffe ihr könnt mir helfen.

danke schonmal im vorraus.

lg

henning

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.
http://www.if-schleife.de
2.
Ohne Code wird das hier eine Ratestunde.
:-)

Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Link ist gut XD

hier die codes. danke schonmal

Der Code für Master:

/*****************************************************************
 ****************                              *******************
 ****************          BTM-222             *******************
 ****************        Master_Modus          *******************   
 ****************     Baudrate 19200 Baud      *******************
 ****************                              *******************
 *****************************************************************/


#define  F_CPU      16000000UL   
#define  OSCSPEED   16000000         // in Hz


#include "util/delay.h"
#include "avr/io.h"
#include "lcd.c"
#include "EB128_BBS2.h"


const char info1[]PROGMEM = " Bluetooth -> Master";

char Line[40];                      // String mit maximal 39 zeichen
char display_buffer[21];

  
uint8_t EmpfangZeichen;

//-------------------------------------------------------------------

void UART_Init(uint32_t Baud)
 {
   unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1;   //BaudRate
   
 
   UBRR1L = (unsigned char) BaudRate;
   UBRR1H = (unsigned char) (BaudRate>>8);
   
   UCSR1C |= 0x06;           // 8 Data , 1 Stoppbit , keine Parität
   UCSR1B |= 0x18;           // Freigabe RxD und TxD
 }

//-------------------------------------------------------------------


void USART1_Transmit (unsigned char data)
 {
   
  while ( ! ( UCSR1A & (1<<UDRE1)));//Warte bis Transmit-Speicher leer
   {
     UDR1 = data;
   }
 }

//-------------------------------------------------------------------


int uart_putc(unsigned char c)
 {
    while (!(UCSR1A & (1<<UDRE1)))    // warten bis Senden möglich 
     {
     }                             
 
     UDR1 = c;                        // sende Zeichen 
     return 0;
 }



void uart_puts (char *s)
 {
    while (*s)
    {  
        uart_putc(*s);                // solange s ungleich '\0' 
        s++;
    }
 }

//-------------------------------------------------------------------

uint8_t uart_getc(void)
 {
    //while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfügbar
        
    return UDR1;                   
 }


 
void uart_gets( char* Buffer, uint8_t MaxLen )
 {
   uint8_t NextChar;
 
 
   NextChar = uart_getc();         

   while( NextChar != 0x0D) 
    {
     *Buffer++ = NextChar;
   
     NextChar = uart_getc();
    }
                                  
   *Buffer = '\0';
  }

//-------------------------------------------------------------------


int main()

 {

    DDRA=0xFF;
  DDRB=0xFF;
  DDRC=0xFF;
  DDRE=0x00;
  DDRG=0x00;

    lcd_init( LCD_DISP_ON );
    G_DISPLAY = (1<<BELEUCHTUNG);  
    lcd_init( LCD_DISP_ON );
  lcd_puts_p(info1);             // Ausgabe Überschrift
 
    UART_Init(19200);              // Baudrate 19200 Baud
    _delay_ms(200);

   
//-----------------------------------------------------------------------

    uart_puts ("ATR0\r");         // Master oder Slave Master=0; Slave=1
    _delay_ms(1000);

  uart_puts ("ATO0\r");         // automatische Verbindung  Enable=0
    _delay_ms(1000);


    uart_puts ("ATD=00126F09B37C\r"); //automatische Verbindung  Enable=0
    _delay_ms(3000);

  uart_puts ("ATP=1234\r");       // Passwort Standard ist 1234
    _delay_ms(1000);

//-----------------------------------------------------------------------



   while(1)
    {
    
  /*  uart_putc(0x01);
    lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_1 = AN");
     

    _delay_ms(3000);


    uart_putc(0x02);
    lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_2 = AN");


    _delay_ms(3000);


    uart_putc(0x03);
      lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_3 = AN");


    _delay_ms(3000);*/

//--------------------------------------------


       if(PINE & (1<<PE0)) 
        {
          uart_putc(0x01);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED1 -> EIN");
      }

       if(PINE & (1<<PE1)) 
        {
          uart_putc(0x02);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED2 -> EIN");
      }

       if(PINE & (1<<PE2))
        {
          uart_putc(0x03);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED3 -> EIN");
      }  

//---------------------------------------------

    }  
  
}  
   

Der Code für Slave:

/*****************************************************************
 ****************                              *******************
 ****************          BTM-222             *******************
 ****************        Slave-Modus          *******************   
 ****************     Baudrate19200 Baud       *******************
 ****************                              *******************
 *****************************************************************/


#define  F_CPU      16000000UL   
#define  OSCSPEED   16000000         // in Hz


#include "util/delay.h"
#include "avr/io.h"
#include "lcd.c"
#include "EB128_BBS2.h"


const char info1[]PROGMEM = " Bluetooth -> Slave";

char Line[40];                      // String mit maximal 39 zeichen
char display_buffer[21];

  
uint8_t EmpfangZeichen;

//-------------------------------------------------------------------

void UART_Init(uint32_t Baud)
 {
   unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1;   //BaudRate
   
 
   UBRR1L = (unsigned char) BaudRate;
   UBRR1H = (unsigned char) (BaudRate>>8);
   
   UCSR1C |= 0x06;           // 8 Data , 1 Stoppbit , keine Parität
   UCSR1B |= 0x18;           // Freigabe RxD und TxD
 }

//-------------------------------------------------------------------


void USART1_Transmit (unsigned char data)
 {
   
  while ( ! ( UCSR1A & (1<<UDRE1)));//Warte bis Transmit-Speicher leer
   {
     UDR1 = data;
   }
 }

//-------------------------------------------------------------------


int uart_putc(unsigned char c)
 {
    while (!(UCSR1A & (1<<UDRE1)))    // warten bis Senden möglich 
     {
     }                             
 
     UDR1 = c;                        // sende Zeichen 
     return 0;
 }



void uart_puts (char *s)
 {
    while (*s)
    {  
        uart_putc(*s);                // solange s ungleich '\0' 
        s++;
    }
 }

//-------------------------------------------------------------------

uint8_t uart_getc(void)
 {
    //while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfügbar
        
    return UDR1;                   
 }


 
void uart_gets( char* Buffer, uint8_t MaxLen )
 {
   uint8_t NextChar;
 
 
   NextChar = uart_getc();         

   while( NextChar != 0x0D) 
    {
     *Buffer++ = NextChar;
   
     NextChar = uart_getc();
    }
                                  
   *Buffer = '\0';
  }

//-------------------------------------------------------------------


int main()

 {

    DDRA=0xFF;
  DDRB=0xFF;
  DDRC=0xFF;
  DDRE=0x00;
  DDRG=0x00;

    lcd_init( LCD_DISP_ON );
    G_DISPLAY = (1<<BELEUCHTUNG);  
    lcd_init( LCD_DISP_ON );
  lcd_puts_p(info1);             // Ausgabe Überschrift
 
    UART_Init(19200);              // Baudrate 19200 Baud
    _delay_ms(200);

   
//-----------------------------------------------------------------------
    uart_puts ("ATR1\r");         // Master oder Slave Master=0; Slave=1
    _delay_ms(1000);

  uart_puts ("ATO0\r");         // automatische Verbindung  Enable=0
    _delay_ms(1000);


  uart_puts ("ATE0\r");         // Echo ausschalten
    _delay_ms(1000);


//-----------------------------------------------------------------------


   while(1)
    {

      EmpfangZeichen = uart_getc();  
      

    if(EmpfangZeichen == 0x01)
     {
       PORTA = 0x01;
     lcd_gotoxy(5,2);  
         lcd_puts("LED1 = EIN");
    }


      if(EmpfangZeichen == 0x02)
     {
       PORTA = 0x02;
     lcd_gotoxy(5,2);  
         lcd_puts("LED2 = EIN");
    }
     

    if(EmpfangZeichen == 0x03)
     {
       PORTA = 0x04;
     lcd_gotoxy(5,2);  
         lcd_puts("LED3 = EIN");
    }


//--------------------------------------------

/*    switch(EmpfangZeichen)
      {

        case 0x01: PORTA = 0x01;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_1 = AN");
             break;

              
          case 0x02: PORTA = 0x02 ;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_2 = AN");
             break;


      case 0x03: PORTA = 0x04;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_3 = AN");
             break;   

        }  */ 

    }

  }

//-------------------------------------------------------------------


Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frage: Hat dein Slave überhaupt Taster?

Ansonsten würd ichs ganz einfach so machen, dass ein Pin (Pullup aktiv), 
je nachdem ob Master oder Slave mit einem Jumper/Lötbrücke auf Masse 
gezogen oder offen gelassen wird.

Dann würde ich das Programm etwa so formulieren:
//Initialisierung ...
//übriger Mist vor der Hauptschleife

 if(Auswahlpin)
   while(true)
   {
     //Mastercode
   }
 else
   while(true)
   {
     //Slavecode
   }

Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, slave hat keine taster (das board an sich schon, nur für das 
programm werden diese nicht gebraucht). der empfängt nur und gibt aus.

aber der code sieht ja schon vielversprenchend aus :-)

ich werde den mal ausprobieren danke :-)

Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir siehts jetzt so aus:
#include "avr/io.h"

int main (void)
 {

if(PINE & (1<<PE5)) 
  while(true)
        {
         //Hier steht das Masterprogramm 

 else
   while(true)
   {
     //Hier steht das Slaveprogramm
   }
}


und ich bekomme immernoch 60 errors. ich mach das zwar noch nicht ganz 
so lange aber das stößt bei mir auf unverständnis.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zähl ,mal deine Klammern;) Es muss eine gerade Zahl herauskommen.

Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die klammern in meinem richtigen code stimmen alle, ich hab hier nur 
eine vergessen.
#include "avr/io.h"

int main (void)
 {

if(PINE & (1<<PE5)) 
  while(true)
        {
    
/*****************************************************************
 ****************                              *******************
 ****************          BTM-222             *******************
 ****************        Master_Modus          *******************   
 ****************     Baudrate 19200 Baud      *******************
 ****************                              *******************
 *****************************************************************/


#define  F_CPU      16000000UL   
#define  OSCSPEED   16000000         // in Hz


#include "util/delay.h"
#include "avr/io.h"
#include "lcd.c"
#include "EB128_BBS2.h"


const char info1[]PROGMEM = " Bluetooth -> Master";

char Line[40];                      // String mit maximal 39 zeichen
char display_buffer[21];

  
uint8_t EmpfangZeichen;

//-------------------------------------------------------------------

void UART_Init(uint32_t Baud)
 {
   unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1;   //BaudRate
   
 
   UBRR1L = (unsigned char) BaudRate;
   UBRR1H = (unsigned char) (BaudRate>>8);
   
   UCSR1C |= 0x06;           // 8 Data , 1 Stoppbit , keine Parität
   UCSR1B |= 0x18;           // Freigabe RxD und TxD
 }

//-------------------------------------------------------------------


void USART1_Transmit (unsigned char data)
 {
   
  while ( ! ( UCSR1A & (1<<UDRE1)));//Warte bis Transmit-Speicher leer
   {
     UDR1 = data;
   }
 }

//-------------------------------------------------------------------


int uart_putc(unsigned char c)
 {
    while (!(UCSR1A & (1<<UDRE1)))    // warten bis Senden möglich 
     {
     }                             
 
     UDR1 = c;                        // sende Zeichen 
     return 0;
 }



void uart_puts (char *s)
 {
    while (*s)
    {  
        uart_putc(*s);                // solange s ungleich '\0' 
        s++;
    }
 }

//-------------------------------------------------------------------

uint8_t uart_getc(void)
 {
    //while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfügbar
        
    return UDR1;                   
 }


 
void uart_gets( char* Buffer, uint8_t MaxLen )
 {
   uint8_t NextChar;
 
 
   NextChar = uart_getc();         

   while( NextChar != 0x0D) 
    {
     *Buffer++ = NextChar;
   
     NextChar = uart_getc();
    }
                                  
   *Buffer = '\0';
  }

//-------------------------------------------------------------------


int main()

 {

    DDRA=0xFF;
  DDRB=0xFF;
  DDRC=0xFF;
  DDRE=0x00;
  DDRG=0x00;

    lcd_init( LCD_DISP_ON );
    G_DISPLAY = (1<<BELEUCHTUNG);  
    lcd_init( LCD_DISP_ON );
  lcd_puts_p(info1);             // Ausgabe Überschrift
 
    UART_Init(19200);              // Baudrate 19200 Baud
    _delay_ms(200);

   
//-----------------------------------------------------------------------

    uart_puts ("ATR0\r");         // Master oder Slave Master=0; Slave=1
    _delay_ms(1000);

  uart_puts ("ATO0\r");         // automatische Verbindung  Enable=0
    _delay_ms(1000);


    uart_puts ("ATD=00126F09B37C\r"); //automatische Verbindung  Enable=0
    _delay_ms(3000);

  uart_puts ("ATP=1234\r");       // Passwort Standard ist 1234
    _delay_ms(1000);

//-----------------------------------------------------------------------



   while(1)
    {
    
  /*  uart_putc(0x01);
    lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_1 = AN");
     

    _delay_ms(3000);


    uart_putc(0x02);
    lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_2 = AN");


    _delay_ms(3000);


    uart_putc(0x03);
      lcd_gotoxy(0,2);  
      lcd_puts("Slave -> LED_3 = AN");


    _delay_ms(3000);*/

//--------------------------------------------


       if(PINE & (1<<PE0)) 
        {
          uart_putc(0x01);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED1 -> EIN");
      }

       if(PINE & (1<<PE1)) 
        {
          uart_putc(0x02);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED2 -> EIN");
      }

       if(PINE & (1<<PE2))
        {
          uart_putc(0x03);
        lcd_gotoxy(0,2);  
          lcd_puts("Slave -> LED3 -> EIN");
      }  

//---------------------------------------------

    }  
  
}  
   
}

else
   while(true)
   {
   
/*****************************************************************
 ****************                              *******************
 ****************          BTM-222             *******************
 ****************        Slave-Modus          *******************   
 ****************     Baudrate19200 Baud       *******************
 ****************                              *******************
 *****************************************************************/


#define  F_CPU      16000000UL   
#define  OSCSPEED   16000000         // in Hz


#include "util/delay.h"
#include "avr/io.h"
#include "lcd.c"
#include "EB128_BBS2.h"


const char info1[]PROGMEM = " Bluetooth -> Slave";

char Line[40];                      // String mit maximal 39 zeichen
char display_buffer[21];

  
uint8_t EmpfangZeichen;

//-------------------------------------------------------------------

void UART_Init(uint32_t Baud)
 {
   unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1;   //BaudRate
   
 
   UBRR1L = (unsigned char) BaudRate;
   UBRR1H = (unsigned char) (BaudRate>>8);
   
   UCSR1C |= 0x06;           // 8 Data , 1 Stoppbit , keine Parität
   UCSR1B |= 0x18;           // Freigabe RxD und TxD
 }

//-------------------------------------------------------------------


void USART1_Transmit (unsigned char data)
 {
   
  while ( ! ( UCSR1A & (1<<UDRE1)));//Warte bis Transmit-Speicher leer
   {
     UDR1 = data;
   }
 }

//-------------------------------------------------------------------


int uart_putc(unsigned char c)
 {
    while (!(UCSR1A & (1<<UDRE1)))    // warten bis Senden möglich 
     {
     }                             
 
     UDR1 = c;                        // sende Zeichen 
     return 0;
 }



void uart_puts (char *s)
 {
    while (*s)
    {  
        uart_putc(*s);                // solange s ungleich '\0' 
        s++;
    }
 }

//-------------------------------------------------------------------

uint8_t uart_getc(void)
 {
    //while (!(UCSR1A & (1<<RXC1)))   // warten bis Zeichen verfügbar
        
    return UDR1;                   
 }


 
void uart_gets( char* Buffer, uint8_t MaxLen )
 {
   uint8_t NextChar;
 
 
   NextChar = uart_getc();         

   while( NextChar != 0x0D) 
    {
     *Buffer++ = NextChar;
   
     NextChar = uart_getc();
    }
                                  
   *Buffer = '\0';
  }

//-------------------------------------------------------------------


int main()

 {

    DDRA=0xFF;
  DDRB=0xFF;
  DDRC=0xFF;
  DDRE=0x00;
  DDRG=0x00;

    lcd_init( LCD_DISP_ON );
    G_DISPLAY = (1<<BELEUCHTUNG);  
    lcd_init( LCD_DISP_ON );
  lcd_puts_p(info1);             // Ausgabe Überschrift
 
    UART_Init(19200);              // Baudrate 19200 Baud
    _delay_ms(200);

   
//-----------------------------------------------------------------------
    uart_puts ("ATR1\r");         // Master oder Slave Master=0; Slave=1
    _delay_ms(1000);

  uart_puts ("ATO0\r");         // automatische Verbindung  Enable=0
    _delay_ms(1000);


  uart_puts ("ATE0\r");         // Echo ausschalten
    _delay_ms(1000);


//-----------------------------------------------------------------------


   while(1)
    {

      EmpfangZeichen = uart_getc();  
      

    if(EmpfangZeichen == 0x01)
     {
       PORTA = 0x01;
     lcd_gotoxy(5,2);  
         lcd_puts("LED1 = EIN");
    }


      if(EmpfangZeichen == 0x02)
     {
       PORTA = 0x02;
     lcd_gotoxy(5,2);  
         lcd_puts("LED2 = EIN");
    }
     

    if(EmpfangZeichen == 0x03)
     {
       PORTA = 0x04;
     lcd_gotoxy(5,2);  
         lcd_puts("LED3 = EIN");
    }


//--------------------------------------------

/*    switch(EmpfangZeichen)
      {

        case 0x01: PORTA = 0x01;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_1 = AN");
             break;

              
          case 0x02: PORTA = 0x02 ;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_2 = AN");
             break;


      case 0x03: PORTA = 0x04;
                 lcd_gotoxy(5,2);  
                     lcd_puts("LED_3 = AN");
             break;   

        }  */ 

    }

  }

}

}


Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
btw ich hab nurnoch 20 errors xD

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst nicht einfach 2 Programme 'zusammenführen' indem du mit 
Copy&Paste das eine Programm so wie es ist, ins andere einfügst.

Am besten gehst du so an die Dinge ran:

Du schreibst grundsätzlich ein komplett neues Programm
Du übernimmst den eigentlichen funktionalen Programmteil aus dem einen 
Programm
Du übernimmst den eigentlich funktionalen Programmteil aus dem anderen 
Programm

Aber grundsätzlich schreibst du ein komplett neues Programm und du 
mischt aus den Einzelprogrammen die Teile zusammen, die du brauchst.

Beitrag #2329572 wurde von einem Moderator gelöscht.
Beitrag #2329651 wurde von einem Moderator gelöscht.
Beitrag #2329654 wurde von einem Moderator gelöscht.
Beitrag #2329699 wurde von einem Moderator gelöscht.
Beitrag #2329704 wurde von einem Moderator gelöscht.

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.