string bei C und PICs

#3569629
Lesenswert?
• ▲
▼
Strings sind char arrays.
Aber wenn du "100000001" platzsparend speichern und verarbeiten willst, 
nimmst du am besten ein uint16_t und gibst es bei bedarf bit für bit 
aus. Also z.B. so:
1
void put_bin(uint16_t value){
2
    uint16_t mask = 0x8000,i;
3

4
    while(mask){
5
        if(value & mask)
6
            putc('1');
7
        else
8
            putc('0');
9
        mask >>= 1;
10
    }
11

12
}
13

14
int main(){
15
   uint16_t var = 0b100000001;
16
   
17
   puts("Bin Value = ");
18
   put_bin(var);
19
   return 0;
20
}
Gast #3569632
Lesenswert?
• ▲
▼
Ja klar. Ich habe 8 LEDs und will sie folgendermaßen leuchten lassen:

000##000
00#00#00
0#0000#0
#000000#
0#0000#0
00#00#00
000##000

Das ganze will ich dann als Endlosschleife ablaufen lassen. Hoffe 
einigermaßen verständlich gezeigt zu haben was ich vor habe.
Gast #3569640
Lesenswert?
• ▲
▼
>     while(mask){
>         if(value & mask)
>             putc('1');
>         else
>             putc('0');
>         mask >>= 1;
>     }
> }

Ok, das sieht irgendwie nach Bitverschiebung aus (ich kenne mich aber 
nur sehr schlecht aus, da Neuling). Es scheint eine professionelle 
Lösung zu sein, aber für mich als Anfänger müsste das doch für den 
Anfang auch leichter verständlich gehen oder?
#3569642
Lesenswert?
• ▲
▼
Das würde man ungefähr so machen (alle LEDs an PORTD z.B.):
1
while()
2
{
3
LATD=0b00011000;
4
__delay_ms(100);
5
LATD=0b00100100;
6
__delay_ms(100);
7
LATD=0b01000010;
8
__delay_ms(100);
9
LATD=0b10000001;
10
__delay_ms(100);
11
LATD=0b01000010;
12
__delay_ms(100);
13
LATD=0b00100100;
14
__delay_ms(100);
15
LATD=0b00011000;
16
__delay_ms(100);
17
}
#3569643
Lesenswert?
• ▲
▼
Jetzt frage ich mich nur warum du strings brauchst?
Da nummst du doch einfach ein Array mit deinem Bitmuster:
1
uint8_t LED_bitpattern[] = { 0b00011000,
2
                             0b00100100,
3
                             0b01000010,
4
                             0b10000001,
5
                             0b01000010,
6
                             0b00100100,
7
                             0b00011000};
8

9
int main(){
10
 .....
11

12
 while(1){
13
   for(i = 0; i < 8; i+){
14
     LATB = LED_bitpattern[i];
15
     delay_ms(500);
16
   }
17
 }
18

19
}
oder irgendwie so.
Gast #3569657
Lesenswert?
• ▲
▼
> LED_bitpattern[] = { 0b00011000, 0b00100100, 0b01000010, 0b10000001, 0b01000010, 
0b00100100, 0b00011000};
> int main(){
>  .....
>  while(1){
>    for(i = 0; i < 8; i+){
>      LATB = LED_bitpattern[i];
>      delay_ms(500);
>    }
>  }
> }

gefällt mir gut.
Gast #3569662
Lesenswert?
• ▲
▼
Habe es mal so probiert und es klappt auch:
1
.......
2

3
#pragma udata  // Ablegen im Data Memory
4
unsigned char x, i;
5

6
#pragma romdata  // Ablegen im Program Memory
7
const rom unsigned char bitmuster[4] = {0x18, 0x24, 0x42, 0x81};
8

9
#pragma code  // Ablegen im Program Memory
10
void main (void)
11
{
12
  // Initialisierung
13
  x = 0;
14
  i = 1;
15

16
  // Alle Ports Ausgänge
17
  TRISD = 0x00;
18
    
19
  while(1) {
20
    LATD = bitmuster[x];
21
    x+=i;
22
    Delay1KTCYx(150);
23
    if(x == 3)
24
      i = -1;
25
    else if(x == 0)
26
      i = 1;
27
  }
28
}
#3569664
Lesenswert?
• ▲
▼
Nur kurz zur Erklärung, da du vllt. noch nicht genau verstanden hast was 
eine String ist (korrigiere mich, wenn ich falsch liege):
Eine String ist ein Array aus 8-bit Variablen (char), aber ein Array aus 
8-bit Variablen muss nicht zwingend eine String sein.

Im Array werden beliebige Zahlen binär gespeichert, währen in einer 
String Zeichen (Ziffern, Buchstaben, Sonderzeichen) mit der ASCII 
Codierung gespeichert werde.
https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Gast #3569669
Lesenswert?
• ▲
▼
Max H. schrieb:
> Nur kurz zur Erklärung, da du vllt. noch nicht genau verstanden
> hast was
> eine String ist (korrigiere mich, wenn ich falsch liege):
> Eine String ist ein Array aus 8-bit Variablen (char), aber ein Array aus
> 8-bit Variablen muss nicht zwingend eine String sein.
>
> Im Array werden beliebige Zahlen binär gespeichert, währen in einer
> String Zeichen (Ziffern, Buchstaben, Sonderzeichen) mit der ASCII
> Codierung gespeichert werde.
> https://de.wikipedia.org/wiki/American_Standard_Co...

Ich habe da an C++ gedacht, dort werden zB Tastatureingaben in 
"string-Variablen" gespeichert, das ist einfacher als ein Array von zB 
einem char anzulegen (da ich ja auch nicht unbedingt weiß wie lang es 
sein soll). Ich wollte deshalb ein Bitmuster (zB 10000001) in eine 
string Variable speichern. C unterstützt aber wohl keinen string? Naja 
aber jetzt habe ich es verstanden, man kann auch ein Array anlegen :-) 
Kann man mal sehen, das ich ein echter Anfänger bin.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.