Forum: Mikrocontroller und Digitale Elektronik Fehler beim Compilieren?


von Axel Beierlein (Gast)


Lesenswert?

Habe versucht mal die I/O Funktionen am 8515 zu programmieren und bin 
auf folgende Merkwürdigkeit gestossen.
gemäß folgendem Code bringt die Betätigung der Taster ein Leuchten der 
LED´s hervor. Obwohl die Variable "taster" die den Wert des I/O 
registers D des Einganges nicht mit dem Ausgang PORTB in Verbindung 
gebracht wird.
Initialisiere ich aber "set" mit dem Wert 0xff dann leuchtet nichts mehr 
beim Tasten.

WARUM ?

Ich nutze übrigens das STK200.

#include <io.h>
#include <avr/io8515.h>

void main (void)
   {

   unsigned char set,taster;

   DDRB = 0xfe; // PORTB Ausgang komplett
   DDRD = 0x00; // alle Eingänge an PORTD

   while(1){
   taster = inb(PIND);
   PORTB = set;
   }
 }

von Johannes (Gast)


Lesenswert?

Hi!

Du hast leider vergessen, die Variablen zu definieren!

Also eine Zeile wie

int taster, set;

So wird halt auf irgendeine Speicherstelle zugegriffen, offenbar die 
gleiche. Normalerweise führt sowas zum Absturz bzw. einem 
Compilerfehler!

von Axel Beierlein (Gast)


Lesenswert?

???

Das sehe ich anders. Jede definierte Variable bekommt ihren 
Speicherplatz zugewiesen. Unabhängig ob sie initialisiert ist oder 
nicht. Ich glaube Du verwechselst da etwas.

Ausserem heisst definieren etwas einen Namen geben und initialisieren 
etwas einen Wert zuweisen.

Zum Absturz führt es nur wenn ich mit nicht initialisierten Pointern 
arbeite. Das ist hier aber nicht der Fall.

ciao

von BAB (Kai K.) (Gast)


Lesenswert?

#include <avr/io.h>

int main (void)
   {

   DDRB = 0xff;
   DDRD = 0x00;

   while(1)
   {
   PORTB = PIND;
   }

   return (0);
 }

von Oryx (Gast)


Lesenswert?

Hallo Axel,
mit dem definieren und initialisieren hast du recht. Was das 
Speicherplatzzuweisen angeht.
In Deinem Programm ist set aber eine lokale Variable. Die liegen auf dem 
Stack und sind somit nicht initialisiert. Haben also irgendeinen 
zufälligen Wert. Je nach Stackverlauf kannst Du halt auch den Inhalt 
deiner Tasteneingabe erhalten.

Versuch mal Deinem Kompiler beizubringen, bei nicht initialisierten 
Variablen eine Warnung auszugeben. Bei grossen Projekten ist so etwas 
schon wichtig. Da ist die Tücke nicht so leicht zu erkennen und vor 
allen Dingen nicht so reproduzierbar.

Oryx

von Johannes Raschke (Gast)


Lesenswert?

@Axel
Hoppla, hatte doch glatt übersehen, daß Du de Variablen sehr wohl 
definiert hast... sorry.
Für mich sieht es auch so aus, als ob hier ein Fehler vorliegt... Was 
passiert denn, wenn Du die Variablen in umgekehrter Reihenfolge 
definierst? Oder eine weitere, unbenutzte dazwischen?

Ich kenne Deine Entwicklungstools ja nicht, aber gibt es vielleicht eine 
Möglichkeit, den C-Code erstmal in Assembler wandeln zu lassen? Dann 
könnte man immerhin sehen, ob die Variablen jetzt Register sind oder auf 
dem Stack, und man könnte das Programm mal im Debugger durchsteppen...


@Oryx
Ja, set ist nicht initialisiert, dürfte seinen Wert aber auch nicht 
durch einen Tastendruck ändern...

von Axel Beierlein (Gast)


Lesenswert?

Also ich habe bis jetzt mit der 30 Tage Version von ICC gearbeitet mit 
der Win AVR Library.

Versuche aber wie bereits in einem Thread vorher mein WinAVR unter dem 
Compiler DevCpp zum laufen zu bringen, da ich mit diesem recht vertraut 
bin aber noch nicht genau weiss wie ich WinAVR in Ihm implementiere.

tschö Axel

von Axel Beierlein (Gast)


Lesenswert?

Also ich habe mal den generierten Code hier reinkopiert den mein 
Compiler aus meinem Sourcecode in Assembler macht. Vielleicht hilft es 
ja weiter.

Danke Euch im Voraus.

Axel


  .module Tasteneingabe.c
  .area text(rom, con, rel)
  .dbfile E:\icc\examples.avr\Tasteneingabe.c
  .dbfunc e main _main fV
;            set -> R16
;         taster -> R16
  .even
_main::
  .dbline -1
  .dbline 5
; #include <io.h>
; #include <avr/io8515.h>
;
; void main (void)
;    {
  .dbline 9
;
;    unsigned char taster,set;
;
;    DDRB = 0xfe; // PORTB Ausgang komplett
  ldi R24,254
  out 0x17,R24
  .dbline 10
;    DDRD = 0x00; // alle Eingänge an PORTD
  clr R2
  out 0x11,R2
  rjmp L3
L2:
  .dbline 12
  .dbline 13
  in R16,0x10
  .dbline 14
  out 0x18,R16
  .dbline 15
L3:
  .dbline 12
  rjmp L2
X0:
  .dbline -2
  .dbline 16
;
;    while(1){
;    taster = inb(PIND);
;    PORTB = set;
;    }
;  }
L1:
  .dbline 0 ; func end
  ret
  .dbsym r set 16 c
  .dbsym r taster 16 c
  .dbend

von Johannes Raschke (Gast)


Lesenswert?

; set -> R16
; taster -> R16


Da hat der doofe Compiler beiden Variablen wohl die gleiche 
Speicherstelle ugewiesen...


 in R16,0x10
 out 0x18,R16

Okay, hier wird also erst was nach R16 eingelesen und dann dieser Wert 
wieder zur Ausgabe benutzt... Ich kenne den Controller nicht weil ich 
bisher nur den 2313 programmiert habe, und auch nur in ASM, aber bei 
0x10 bzw. 0x18 dürften wohl die Ports liegen...

Ich frage mich grade, ob die Zuweisung

PORTB = set;

so funktioniert. Da gibt es doch auch noch outb(); Vielleicht geht das 
damit eher... Oder ist die nur für Konstanten?

Ändere obige Zeile doch mal in

outb(PORTB, set);

und schaue, was passiert... Und vor allem, ob und wie sich der 
Assembler-Code ändert!

von Axel Beierlein (Gast)


Lesenswert?

Also das mit outb() habe ich auch probiert mit dem gleichen Ergebnis. 
Vielleicht sollte ich mal den Compiler wechseln.
Aber dann müsste ich jetzt mich auch noch auf das Makefile erstellen 
stürzen und da habe ich irgendwie keine Lust drauf.

tschö

Achso falls es jemanden interessiert ich nutze den ICC Compiler als 
Eval.version den Test hat sie also nicht bestanden.

Mal weiterschauen

von Axel Beierlein (Gast)


Lesenswert?

So,

ich habe das ganze nach einigen Anlaufschwierigkeiten nun mit dem AVR 
GCC compiliert und siehe da... es funktioniert so wie ich es mir 
vorgestellt habe. Die Ausgänge werden nach den willkürlichen Inhalten 
der set Variablen geschaltet und die Eingänge haben auch nun überhaupt 
keinen Einfluss mehr auf den Ausgang.

Halt so wie es sein soll. Also kompilierproblem bei ICC.

Ich glaube der ICC Compiler hat nun ausgedient, nachdem ich mich so 
langsam mit dem AVRGCC angefreundet habe.

nur für alle die es interessiert.

Ciao Axel

von Johannes Raschke (Gast)


Lesenswert?

Gut zu wissen!
Dürfte auch die Programmierer des Compilers interessieren, hehe :-)

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.