mikrocontroller.net

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


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 16000000UL

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

#define sPort   PORTB
#define sDDR  DDRB
#define RCK    3
#define SCK    1
#define SCL    2
#define SIN    0

extern void carry_out(unsigned char schiebedaten);

unsigned char daten;

void carry_out(unsigned char schiebedaten)
{
sPort|=(1<<SCL);
for(unsigned char i=7; i>=0; i--)
  {
  if(schiebedaten&(1<<i))
    {
    sPort|=(1<<SIN);
    }
  sPort|=(1<<SCK);
  sPort&=~(1<<SCK);
  }
}

int main(void)
{
//config outputs
sDDR|=((1<<SIN)|(1<<SCK)|(1<<SCL)|(1<<RCK));
sPort&=~((1<<SIN)|(1<<SCK)|(1<<SCL)|(1<<RCK));

while(1)
  {
  daten=daten+1;     //hier kommt der Simulator nicht klar
  carry_out(daten);
  _delay_ms(500);
  }
}

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

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

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

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er bleibt in der for-Schleife hängen - entferne mal das unsigned.

...oder hier das Ganze etwas optimiert:
for(unsigned char mask=0x80; mask!=0; mask>>=1)
{
  if(schiebedaten&mask)
  {
    sPort|=(1<<SIN);
  }
  else
  {
    sPort&=~(1<<SIN);
  }
  sPort|=(1<<SCK);
  sPort&=~(1<<SCK);
}

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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").

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.