Forum: Compiler & IDEs Aufruf Array


von Benjamin (Gast)


Lesenswert?

Hallo,

wieso kann ich den ersten wert des Arrays nicht aufrufen?

int bitmuster [] = {
          0b10101010,
            0b11111111,
            0b00000000,
            0b11001111,
            0b11000000,
            0b10101111,
            0b11101011,
            0b11101010
          };

PORTB = bimuster [0];

Ohne Funktion (der cycle counter des simulators läuft läuft nicht 
einmal) hingegen kann ich [1] ... [7] ohne probleme aufrufen?!

Was mache ich falsch?

Danke!

von Benjamin (Gast)


Lesenswert?

Es liegt nicht an dem Schreibfehler ;)

Im Programm steht natürlich

PORTB = bitmuster [0];

von Martin (Gast)


Lesenswert?

Benjamin schrieb:
> Ohne Funktion (der cycle counter des simulators läuft läuft nicht
> einmal) hingegen kann ich [1] ... [7] ohne probleme aufrufen?!

Was soll der Absatz überhaupt bedeuten?

von Benjamin (Gast)


Lesenswert?

Oh ja ... entschuldigt

Also ich kann das Bitmuster [0] nicht auf PORTB anzeigen in der 
Sumulation. Der Cycle Counter läuft auch nicht weiter wenn ich in einer 
while Schleife auf Stelle [0] zugreifen will.
while(1{
PORTB = bitmuster [0];
}

mit [1] ... [7] geht das ohne probleme und der Simulator läuft 
ebenfalls?!

von Rolf Magnus (Gast)


Lesenswert?

Benjamin schrieb:
> Oh ja ... entschuldigt
>
> Also ich kann das Bitmuster [0] nicht auf PORTB anzeigen in der
> Sumulation.

Wer hindert dich denn daran?

von Benjamin (Gast)


Lesenswert?

Wenn ich das wüsste müsste ich ja hier nicht fragen!
Ich kann auf die Stelle des Arrays nicht zugreifen...

von Floh (Gast)


Lesenswert?

Zeig doch mal dein ganzes Programm her. Also das Minimalprogramm, dass 
den Fehler noch enthält und kompilierbar ist.

von Benjamin (Gast)


Lesenswert?

Ich stelle grad mit Erschrecken fest, dass das nur bei [1] weiter läuft 
und bei allen anderen nicht?!
Ratlosigkeit macht sich breit!


#include <avr/io.h>



char bitmuster [8] = {
          0b10101010,
            0b11111111,
            0b00000000,
            0b11001111,
            0b11000000,
            0b10101111,
            0b11101011,
            0b11101010
          };


int main(void)

{
DDRB  = 0xff;


while(1)
  {
  PORTB = bitmuster [0];
  }
}

von Klaus W. (mfgkw)


Lesenswert?

Benjamin schrieb:
> weiter läuft

darunter muß man sich was vorstellen?
Welcher AVR? Evtl. misst du nur an einem Pin und hast gerade da einen 
Konflikt mit JTAG?

von Karl H. (kbuchegg)


Lesenswert?

Benjamin schrieb:
> Ich stelle grad mit Erschrecken fest, dass das nur bei [1] weiter läuft
> und bei allen anderen nicht?!
> Ratlosigkeit macht sich breit!

Hast du den Optimizer des Compilers aktiviet?
So einfache Testprogramme wie deines tendieren dazu, vom Compiler auf 
ein einfaches
1
int main()
2
{
3
  DDRB  = 0xff;
4
5
  while(1)
6
    PORTB = 0b10101010;
7
}
zusammengekürzt zu werden. Und da dieses mit deinem Original in der 
Schreibweise nicht mehr viel zu tun hat (wohl aber funktional 100% 
identisch ist), hat der Debugger dann keine Zeilennummer mehr, die er 
dir angeben könnte.

Mach etwas sinnvolles mit dem Array, wozu du auch tatsächlich ein Array 
benötigst. Zb
1
#include <avr/io.h>
2
#include <utils/delay.h>
3
4
uin8_t bitmuster [8] = {
5
            0b10101010,
6
            0b11111111,
7
            0b00000000,
8
            0b11001111,
9
            0b11000000,
10
            0b10101111,
11
            0b11101011,
12
            0b11101010
13
          };
14
15
16
int main(void)
17
18
{
19
  uint8_t i;
20
  DDRB  = 0xff;
21
22
  while(1)
23
  {
24
    for( i = 0; i < 8; ++i ) {
25
      PORTB = bitmuster[i];
26
      _delay_ms( 1000 );
27
    }
28
  }
29
}

von Benjamin (Gast)


Lesenswert?

So .... nachdem ich mir jetzt Hardware besorgt habe kann ich vermelden, 
dass es wohl am Simulator liegt.

Auf einem Mega8 läufts.

Also das geht im Simulator nicht, realtime simulieren habe ich mir schon 
vor Wochen aus dem kopf geschlagen ....

Wofür ist der Simulator des AVR Studio zu gebrauchen??

Danke euch!

von docean (Gast)


Lesenswert?

Benjamin schrieb:
> Wofür ist der Simulator des AVR Studio zu gebrauchen??

für nix ;)

von Benjamin (Gast)


Lesenswert?

Karl Heinz Buchegger,
das macht es ja jetzt auch ich hatte das nur aus dem Programm genommen!

Danke!

von Karl H. (kbuchegg)


Lesenswert?

Benjamin schrieb:
> Karl Heinz Buchegger,
> das macht es ja jetzt auch ich hatte das nur aus dem Programm genommen!

Du machst dir hier keine Freunde, wenn du Programmcode zur Diskussion 
stellst, der mit deinem eigentlichen Programm nur wenig zu tun hat.
Dann suchen alle an den falschen Stellen nach Problemen.

von MWS (Gast)


Lesenswert?

Benjamin schrieb:
> Ich stelle grad mit Erschrecken fest, dass das nur bei [1] weiter läuft
> und bei allen anderen nicht?!
> Ratlosigkeit macht sich breit!
1
#include <avr/io.h>
2
3
char bitmuster [8] = {
4
            0b10101010,
5
            0b11111111,
6
            0b00000000,
7
            0b11001111,
8
            0b11000000,
9
            0b10101111,
10
            0b11101011,
11
            0b11101010
12
          };
13
14
int main(void)
15
16
{
17
DDRB  = 0xff;
18
19
20
while(1)
21
  {
22
  PORTB = bitmuster [0];
23
  }
24
}

Dieser Code lässt sich problemlos simulieren, Optimierung -O0, 
Haltepunkt auf PORTB = bitmuster [0];
Bei Optimierung > -O0 wird's schwieriger, da hilft dann das 
Disassemblerfenster oder der Pausebutton, damit der Sim das Ergebnis 
auch anzeigen kann.

Benjamin schrieb:
> So .... nachdem ich mir jetzt Hardware besorgt habe kann ich vermelden,
> dass es wohl am Simulator liegt.

Ich würd' sagen, Du hast nur kein Ahnung.

von Benjamin (Gast)


Lesenswert?

Wenn ich Ahnung hätte würde ich nicht fragen oder?

von Benjamin (Gast)


Lesenswert?

Oh ich bin verblüft ...

Dann gehts mit Schleifen sogar in realtime mit besagter Optimierung!

Danke MWS ;)

von Benjamin (Gast)


Lesenswert?

Nachtrag: annähernd realtime

von rasenpfleger (Gast)


Lesenswert?

Benjamin schrieb:
> Dann gehts mit Schleifen sogar in realtime mit besagter Optimierung!
Das mit 'realtime' glaube ich nicht.

von MWS (Gast)


Lesenswert?

Benjamin schrieb:
> Wenn ich Ahnung hätte würde ich nicht fragen oder?

Fragen ist ja auch kein Problem, eher Feststellungen ohne Grund wie:

Benjamin schrieb:
> dass es wohl am Simulator liegt.

> Dann gehts mit Schleifen sogar in realtime mit besagter Optimierung!

Wie Du festgestellt hast, nicht so ganz. Echtzeit ist aber zum Debuggen 
auch nicht notwendig.

Die Optimierung dagegen kann schon mal Probleme bei der Simulation 
bereiten, denn der erzeugte Assemblercode ist dann nicht mehr unbedingt 
kohärent mit dem C-Code. Da wird dann zum Teil Code komplett 
wegoptimiert.

Schön daran zu sehen, wenn man mit Rechtsklick auf einen Befehl geht und 
"Goto Disassembly" ist ausgegraut.

von Rolf Magnus (Gast)


Lesenswert?

MWS schrieb:
> Fragen ist ja auch kein Problem, eher Feststellungen ohne Grund wie:
>
> Benjamin schrieb:
>> dass es wohl am Simulator liegt.

Der Grund steht doch direkt dahinter:

Benjamin schrieb:
> Auf einem Mega8 läufts.

MWS schrieb:
> Die Optimierung dagegen kann schon mal Probleme bei der Simulation
> bereiten, denn der erzeugte Assemblercode ist dann nicht mehr unbedingt
> kohärent mit dem C-Code. Da wird dann zum Teil Code komplett
> wegoptimiert.

Aber keine Zugriffer auf I/O-Register. Außerdem hat das nichts speziell 
mit der Simulation zu tun.

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.