Forum: Mikrocontroller und Digitale Elektronik Problem: CodeVision AVR, Pointer, String & LCD


von MatthiasS (Gast)


Lesenswert?

Hallo,

ich habe ein bißchen Probleme mit meinem Compiler und/oder mit meinem 
Programm. Ich benutze einen 8535. Der folgende Programmabschnitt soll 
ein Auswahlmenü werden, bei dem ich jedoch noch die Zahl i hinterher 
weiter benötige (für Einstellungen der RS232).
Ich bin auch ein bißchen bewandert, was C/C++ angeht, aber ich finde den 
Fehler nicht. Es werden ständig nur die Hälfte der Strings bzw. kein 
String im LCD dargestellt. Ich habe nun schon 2 verschiedene Methoden 
eingebaut, aber bei beiden dasselbe.
Vielleicht kann mir einer von euch helfen.

Hier der Code:

flash char bps12[10] = "1200bps";
flash char bps24[10] = "2400bps";
flash char bps48[10] = "4800bps";
flash char bps96[10] = "9600bps";
flash char bps192[10] = "19200bps";
flash char p_none[10] = "kein";
flash char p_even[10] = "gerade";
flash char p_odd[10] = "ungerade";
flash char flash 
*baud_messages[5]={"1200bps","2400bps","4800bps","9600bps","19200bps"};
.
.
.
void konfig(void)
// Unterprogramm zur Konfiguration der RS232-Schnittstelle
{
  unsigned char i = 0;
  char text[10];
  char flash *p_baud[5];
  char flash *p_paritaet[3];
  p_baud[0] = bps12;
  p_baud[1] = bps24;
  p_baud[2] = bps48;
  p_baud[3] = bps96;
  p_baud[4] = bps192;
  p_paritaet[0] = p_none;
  p_paritaet[1] = p_even;
  p_paritaet[2] = p_odd;

  lcd_putsf("Konfigurations-");
  lcd_gotoxy(0,1);
  lcd_putsf("modus!");
  for (i=0; i<=3; i++) {delay_ms(250);};  // 1 Sekunde Wartezeit
  baudrate = 0x33;  // Festlegung der Baudrate auf 9600bps
  rs_config = 0x98;  // Festlegung auf 8N1

  lcd_clear();
  lcd_putsf("Baudrate:");
  lcd_gotoxy(0,1);
  sprintf(text,"%10s",*p_baud[i]);
  lcd_puts(text);
  i = 0;
  do
  {
//    lcd_gotoxy(0,1);
//    sprintf(text,"%8p",*baud_messages[i]);
//    lcd_puts(text);
    entprell_status = entprell_d(1);
    if (entprell_status == 1)
    {
       if (i<5) i++;
       else i = 0;
       lcd_gotoxy(0,1);
       sprintf(text,"%10p",*p_baud[i]);
       lcd_puts(text);
    };
  }
  while (PIND.4 != 0);

  lcd_clear();
  lcd_putsf("Paritaet:");
  lcd_gotoxy(0,1);
  sprintf(text,"%10s",*p_baud[i]);
  lcd_puts(text);
  i = 0;
  do
  {
    entprell_status = entprell_d(1);
    if (entprell_status == 1)
    {
       if (i<2) i++;
       else i = 0;
       lcd_gotoxy(0,1);
       sprintf(text,"%10p",*p_paritaet[i]);
       lcd_puts(text);
    };
  }
  while (PIND.4 != 0);

  lcd_clear();
  lcd_putsf("Baudrate:");
  lcd_gotoxy(0,1);
  sprintf(text,"%10s",*baud_messages[i]);
  lcd_puts(text);
  i = 0;
  do
  {
//    lcd_gotoxy(0,1);
//    lcd_puts(text);
    entprell_status = entprell_d(1);
    if (entprell_status == 1)
    {
       if (i<5) i++;
       else i = 0;
       lcd_gotoxy(0,1);
       sprintf(text,"%p",*baud_messages[i]);
       lcd_puts(text);
    };
  }
  while (PIND.4 != 0);

  lcd_clear();
  lcd_putsf("Fertig.");

  while(1){};
}


unsigned char entprell_d(unsigned char e_bit)
// Unterprogramm zum Entprellen der Taster an PORT D
// gibt "1" zurück, falls Taster noch gedrückt, ansonsten "0"
{
  int maske = 0;
  maske = ((e_bit << 2) & 0x3C);  // ausmaskieren des gewünschten Pin's
  delay_ms(250);  // 250ms Zeitverzögerung zum Entprellen
  if ((PIND & maske) == 0)  return 1;
  else return 0;
}


Gruß,
Matthias

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.