www.mikrocontroller.net

Forum: Compiler & IDEs C-Code übersichtlich?


Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

der übersichtlichkeitshalber möchte ich folgenden Code so schreiben:
char
alarm1[255]="\x1B[2JAlarm1:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\n

\x1B[2JAlarm2:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\n
";

sobald ich aber nicht alles auf der gleichen zeile schreibe, meldet der
compiler logischerweise fehler..... wie kann ich dem compiler sagen das
die 2. und 3. zeile alles zusammengehört?

gruss
tronic

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der befehl \x1B[2J von der 2. zeile wegdenken... ist orginal nicht so..
aber tut ja nichts zur frage..

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anführungszeichen ans Ende und an den Anfang jeder Zeile. Das Semikolon
nur am Ende der letzten Zeile.

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, superschnelle antworten hier - krasses forum :)

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach noch was, gibts 16bit charvariablen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> gibts 16bit charvariablen?

wchar_t, ist in der avr-libc nicht implementiert.

Willst du Chinesisch oder Japanisch schreiben?

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne brauch kein 16bit... also ok. ENDE

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sinnvoll ist eigentlich mein Code, bzw. wie kann ich an
Speicherplatz sparen (momentan ohne Interrupt - aber das ändre ich
schon noch)?

#include <avr/io.h>
#include <util/delay.h>


void ini()
{
DDRD = 0xFE; //RX als Eingang wählen
DDRC = 0xFF;
DDRB = 0xFF;

PORTD=0x00; //Pullup aktivieren, bzw. auf Null setzen

UCSRB |= ( 1 << RXEN );  // RX einschalten
UCSRB |= ( 1 << TXEN );  // TX einschalten
UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1
UBRRH  = 0;
UBRRL  = 51; //Baudrate 19200 für 16MHz

}

int main (void)
{
ini();

uint8_t c; //8bit Variable definiert


char
alarm1[255]="\x1B[2JAlarm01:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\r\ 
n"
            "Alarm02:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\r\n"
            "Alarm03:OFF\x1B[15CAlarm13:OFF\x1B[15CAlarm23:OFF\r\n"
            "Alarm04:OFF\x1B[15CAlarm14:OFF\x1B[15CAlarm24:OFF\r\n"
            "Alarm05:OFF\x1B[15CAlarm15:OFF\x1B[15CAlarm25:OFF\r\n";


char
alarm2[255]=    "Alarm06:OFF\x1B[15CAlarm16:OFF\x1B[15CAlarm26:OFF\r\n"
            "Alarm07:OFF\x1B[15CAlarm17:OFF\x1B[15CAlarm27:OFF\r\n"
            "Alarm08:OFF\x1B[15CAlarm18:OFF\x1B[15CAlarm28:OFF\r\n"
            "Alarm09:OFF\x1B[15CAlarm19:OFF\x1B[15CAlarm29:OFF\r\n"
            "Alarm10:OFF\x1B[15CAlarm20:OFF\x1B[15CAlarm30:OFF\r\n";


  while(1)
  {
  while (!(UCSRA & (1<<RXC))); //warten auf RXC = 1

    c=UDR;

    for(c=0;c<255;c++)
    {while (!(UCSRA & (1<<UDRE))); UDR=alarm1[c];}

    for(c=0;c<255;c++)
    {while (!(UCSRA & (1<<UDRE))); UDR=alarm2[c];}

  }

return 0;
}

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

Bewertung
0 lesenswert
nicht lesenswert
> wie kann ich an Speicherplatz sparen

Deine Texte sind alle gleich:
an einer bestimmten Bildschirmposition steht der Text "Alarm"
gefolgt von einer laufenden Nummer, gefolgt von einem ":"
und wahlweise dem Text "OFF" bzw, "ON".

Du wirst mir doch nicht erzählen wollen, dass du die Texte
nicht zur Laufzeit erzeugen kannst, während du in einer
Schleife durch die Alarmbits durchgehst:

Die Zeilennummer der Alarmmeldung mit der Nummer x ist
offensichtlich x % 10, während die Spaltenposition
 x / 10 * irgendeine_Konstante beträgt.

#define ESC  "\x1B"

void Transmit( char* String )
{
  while( *String ) {
    while( !(UCSRA & (1<<UDRE)) )
      ;
    UDR = *String++;
  }
}

int main()
{
  char Buffer[20];
  int  i;

  ...
  Transmit( ESC "1B[2J" );

  for( i = 0; i < 30; ++i ) {
    sprintf( Buffer, ESC "%d;%dH", ( i + 1 ) % 10,
                                   ( i + 1 ) / 10 * 20 );
    Transmit( Buffer );

    sprintf( Buffer, "Alarm%02d:", i + 1 );
    Transmit( Buffer );

    if( Alarm[i] )
      Transmit( "ON" );
    else
      Transmit( "OFF" );
  }

  ...
}

Falls dir sprintf im Programm zu viel aufträgt, kann man
auch itoa bei etwas eingeschränkter Funktionalität
stattdessen verwenden. sprintf ist ziemlich teuer, das
relativiert sich allerdings wenn man die ganzen
Formatiermöglichkeiten gebrauchen und einsetzen kann.

Auf jeden Fall: Was bringt dir dein vorgefertigter
Totalstring? Der kostet nur Platz, und das Problem dass je
nach festgestelltem Zustand das OFF durch ON ersetzt werden
muss hast du auch nicht gelöst.

Autor: tronic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, danke vielmal, hab mir schon ma überlegt das ja "alarm:" immer
wieder vorkommt und ma das daher so vereinfachen könnte, doch so über
sprintf hab ich noch nie was versucht, na mal probiern...

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.