Aufruf Array

Gast #2409842
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!
Gast #2409873
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?!
Gast #2409901
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];
  }
}
#2409919
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
}
Gast #2409929
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!
Gast #2409996
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.
Gast #2410066
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.
Gast #2410315
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren