Forum: Compiler & IDEs Wert zur Variablen zuweisen klappt nicht!


von Hans (Gast)


Lesenswert?

Hallo,
ich bin grad dabei mich mit nem Schieberegister in C zu befassen. Jetzt 
hab ich mal ein paar Zeilen geschrieben und wollte es simulieren. 
Allerdings dauert die Zuweisung zur Variablen in  der while(1)-Schleife 
mehrere Minuten mit dem Simulator. Irgendwas passt da nicht!?

Code:
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include <stdint.h>
7
8
#define sPort   PORTB
9
#define sDDR  DDRB
10
#define RCK    3
11
#define SCK    1
12
#define SCL    2
13
#define SIN    0
14
15
extern void carry_out(unsigned char schiebedaten);
16
17
unsigned char daten;
18
19
void carry_out(unsigned char schiebedaten)
20
{
21
sPort|=(1<<SCL);
22
for(unsigned char i=7; i>=0; i--)
23
  {
24
  if(schiebedaten&(1<<i))
25
    {
26
    sPort|=(1<<SIN);
27
    }
28
  sPort|=(1<<SCK);
29
  sPort&=~(1<<SCK);
30
  }
31
}
32
33
int main(void)
34
{
35
//config outputs
36
sDDR|=((1<<SIN)|(1<<SCK)|(1<<SCL)|(1<<RCK));
37
sPort&=~((1<<SIN)|(1<<SCK)|(1<<SCL)|(1<<RCK));
38
39
while(1)
40
  {
41
  daten=daten+1;     //hier kommt der Simulator nicht klar
42
  carry_out(daten);
43
  _delay_ms(500);
44
  }
45
}

Ob der Rest funktioniert weis ich noch nicht - konnt ich auch noch nicht 
testen!

Aber wieso stürzt der Simulator bei einer so einfachen Anweisung ab??

MFG Hans

von dummy (Gast)


Lesenswert?

>Allerdings dauert die Zuweisung zur Variablen in  der while(1)-Schleife
>mehrere Minuten mit dem Simulator. Irgendwas passt da nicht!?

Dann nimm doch mal das _delay_ms(500) raus

von Hans (Gast)


Lesenswert?

Hab ich schon - genau so
der Simulator springt auf running und dann passiert gar nix mehr - er 
kommt nicht mal zur delay!

von Andreas W. (Gast)


Lesenswert?

Er bleibt in der for-Schleife hängen - entferne mal das unsigned.

...oder hier das Ganze etwas optimiert:
1
for(unsigned char mask=0x80; mask!=0; mask>>=1)
2
{
3
  if(schiebedaten&mask)
4
  {
5
    sPort|=(1<<SIN);
6
  }
7
  else
8
  {
9
    sPort&=~(1<<SIN);
10
  }
11
  sPort|=(1<<SCK);
12
  sPort&=~(1<<SCK);
13
}

von Hans (Gast)


Lesenswert?

Hallo,

Danke, jetzt klappts. (mit deinem code) Ich kapier nur nicht wieso.
Und wieso hat es beim compilieren da keine Fehlermeldung oder Warnung 
gegeben?

MFG

von Johannes M. (johnny-m)


Lesenswert?

Ein unsigned char ist immer größer oder gleich Null, weshalb Deine 
Abfrage auf ">= 0" immer wahr ist und die Schleife theoretisch bis zum 
St. Nimmerleinstag läuft. Normalerweise gibt es aber eine Warnmeldung 
bei solchen Dingen (in der Art "Condition is always true due to limited 
range of data type").

von Oliver (Gast)


Lesenswert?

>Normalerweise gibt es aber eine Warnmeldung
>bei solchen Dingen (in der Art "Condition is always true due to limited
>range of data type").

Beim aktuellen WinAVR bzw. avr-gcc Leider nur, wenn die Warnung explizit 
freigeschaltet ist. -Wall reicht nicht.

Oliver

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.