mikrocontroller.net

Forum: Compiler & IDEs wo simulieren/testen mit WinAVR ?


Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

komme vom Assembler und will es mal in C probieren.

Ich benutze Programmers Notepad zum Schreiben des Codes. Wo aber kann
ich das jetzt mal simulieren. Auf dem AVR Studio geht das ja nicht -
oder gibt es da etwas neues?

Danke ...

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht mit AVRStudio? Wie ich gehört habe, kannst Du damit
simulieren. Du kannst zwar AVRStudio nicht als IDE benutzen aber extern
erstellte Builds sollten simulierbar sein. Ich persönlich nutze jedoch
AVRStudio nicht, ich finde VMLAB in der Simulation besser.

Volkmar

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem gibt's noch SimulAVR + GDB (+ Insight, wer's mag).

Autor: MNR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst mit dem WinAVR Paket coff und extcoff Dateien erzeugen.
Erstere Version für Studio 3.x, letzteres für 4.07 oder größer. Geht
eigentlich ganz gut. Wenn du ein aktuelles WinAVR hast, ist das
Makefile schon vorbereitet zur Erzeugung von coff/extcoff, die damit
erzeugten Dateien in Studio öffnen und los gehts!

Gruß Matthias

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Das Ganze ist in der "AtmanAVR-IDE 4.x" integriert.

Man sollte damit debuggen/simulieren können (auf Basis von WinAVR und
AVR Studio gelöst).

Link: http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm

Gruss

Toni

Autor: MNR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht ja nicht schlecht aus, nur kostet das Ding 100$. Arbeitest du
damit? Taugt es was?

Gruß Matthias

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

VMLAB ist gut -- wie kann man aber die Funktionen (Unterroutinen)
simulieren? Ich habe alle Funktionen in eine *.h Datei geschrieben.

ich komme aber mit dem Simulator dort nicht hinein.

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionen werden nicht in die Header-Dateien geschrieben.
Header-Dateien sind für die Definitionen zuständig. Packe die
Funktionen in separate .c-Files!

Die neueste VMLAB-Version entimmt wohl die Quelldateien aus dem
cof-File. Wenn Du die Funktionen jedoch in eine Header-Datei schreibst,
dann fehlt der Bezug weil (meines Wissens nach) nur die C-Files in dem
COF referenziert werden.

In den alten VMLAB-Versionen müssen die Quelldateien explizit im
Projekt-File angegeben werden, ändert aber nichts am Verhalten.

Volkmar

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Exakt so ist es: die Unfähigkeit, Include-Dateien in den
Debuginformationen zu hinterlegen, ist einer der (vielen)
Schwachpunkte von COFF.  Damit sind die Debug-Informationen für
jegliches Stückchen Code, das aus einer Headerdatei stammt, verloren.

Normalerweise schreibt man zwar in Headerdateien nichts rein, was
wirklich Code generieren sollte, aber spätestens bei inline
deklarierten/definierten Funktionen ist es natürlich mit dieser Regel
hinüber...

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich arbeite seit kurzem mit Anjuta, das ist die erste IDE die mir
besser gefällt als Emacs.
Ich würde gern von Anjuta aus debuggen, find aber nirgends, wie man ihm
sagen kann dass er avr-gdb statt den ia32-gdb nehmen soll. Hat das schon
jemand geschafft? umbenennen von avr-gdb in gdb will ich nicht, weil ich
 den gdb auch für IA32 öfter brauch.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Diese COFF Datei(en) - sind das die *.elf Dateien die der WinAVR
-Compiler macht? Coff finde ich nicht.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, noch mal

VMLAB ist wunderbar, habe jetzt auch externe *.c Dateien geschrieben.

ABER - beim Simulieren komme ich trotzdem nicht in Funtionen hinein,
die in einer anderen als der Hauptdatei stehen.

Schreibe ich die Funktionen über die Main-Anweisungen in die selbe
Datei klappt es mit dem Simulieren.

Wie also kriege ich das Programm zum Springen in andere Dateien
hinein?

Danke!

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem Du Deine Funktionen nicht in Headerdateien fallen läßt, sondern
in separaten C-Dateien, die auch separat übersetzt und gelinkt werden.
Diese machst Du dann dem VMLAB bekannt.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, o.k.

ich habe bereits alle meine Dateien als separate c-Dateien geschrieben
und das Programm läuft auch im Controller (Testprogramm).

Trotzdem komme ich beim Simulieren nicht in diese Dateien hinein.

Bitte, wie sage ich dem Programm, dass es da hinein springen soll?

Danke

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Version von VMLAB verwendest Du?
Hast Du im Projekt-File von VMLAB jede Source-Datei eingetragen?

Ohne Detailinformationen kommen wir da wohl nicht weiter. Wenn möglich,
kannst Du mir auch die Projektdateien zukommen lassen, dann schaue ich
mir das kurz mal an.

Volkmar

Autor: Jens-Erwin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wie, gesagt, habe jahrelang mit Assembler zu tun gehabt, bin also auf
jede Hilfe angewiesen -- vielen Dank.

Ich habe mir glaube ich schon die neuste Version geholt. Wenn ich dort
in die Sourceliste meine ganzen C-Dateien einschreibe, gibt es
Fehlermeldungen von VMLab.
Ich compiliere die Dateien zu erst über WINAVR (np - notepad mit make
all) und dann versuche ich über ein Projekt die Sachen in VMLAB zu
simulieren.
Vielleicht sollte ich alles im VMLAB machen?

Anbei mein Testversuch, so würde ich gern meine Dateien anordnen

vielen, vielen Dank

jetzt kann man hier nur eine Datei anhängen. Habe alle Dateien in ein
Edit.text geschrieben oder hier unten.



            ________ Datei: Main.c:___________________

#include <io.h>

#include <RegKonst.c>
#include <Init.c>
#include <MainUnt.c>


int main (void)

{
DDRLed = 0xFF;
Dauer1 = ResetDelay(Delay1);  // laden
Timer0Prescaler (5);    // Vorteiler

  for (;;)
  {
     if (Control.M1==1)    //wenn ich nicht sofort wieder eine neue
                         //Zeit starten lassen will (Monoflop)
     {                //   if (ReadDelay(Dauer1))
  {
     Counter++;
     PortLed = Counter;
     Dauer1 = ResetDelay(Delay1);  //neu laden
  }
     }
  }
}


      __________ Datei: RegKonst.c: _____________

#include <io.h>

typedef unsigned char  BYTE;
typedef unsigned int   WORD;

#define   PortLed   PORTC
#define   DDRLed     DDRC

BYTE    Counter    =  0;
BYTE    Delay1    =    5,
    Dauer1;

struct {
  BYTE M1:  1;
       }Control;



          __________ Datei Init.c:_______________________

#include <io.h>

void Timer0Prescaler (BYTE a)
{
BYTE b  =  TCCR0;
b = b & 0xF8;    //11111000 Vorteiler löschen
TCCR0   =  b | a;
}

         ______ Datei MainUnt.c:__________________________

include <io.h>

BYTE ResetDelay (BYTE Delay)
{
  BYTE a = TCNT0;    //Timer1 lesen
  BYTE b = a + Delay;
  Control.M1 = 1;
  return b;
}

BYTE ReadDelay (BYTE Dauer)
{
  BYTE a = TCNT0;
  if ( Dauer == a)
  {
      return 1;
  }
  else
  {
      return 0;
  }
}

Autor: Jens-Erwin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung -

hier noch mal die Main -- war Schreibfehler drin


 ________ Datei: Main.c:___________________

#include <io.h>

#include <RegKonst.c>
#include <Init.c>
#include <MainUnt.c>


int main (void)

{
DDRLed = 0xFF;
Dauer1 = ResetDelay(Delay1);  // laden
Timer0Prescaler (5);    // Vorteiler

  for (;;)
  {
     if (Control.M1==1)    //wenn ich nicht sofort wieder eine neue
                         //Zeit starten lassen will (Monoflop)
     {
     if (ReadDelay(Dauer1))
        {
        Counter++;
        PortLed = Counter;
        Dauer1 = ResetDelay(Delay1);  //neu laden
        }
     }
  }
}

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, habe es schon gesehen. Es hängt immer noch an dem Problem daß auch
Jörg angedeutet hat. Du hast zwar die Dateien von .h nach .c umbenannt,
doch Du verwendest weiterhin #include um sie einzubinden. Es ist jedoch
notwendig diese separat in Objekt-Dateien zu übersetzen und dann alle
Objekt-Dateien zu einem ausführbaren Programm zu verlinken. Hört sich
kompliziert an, ist es im ersten Moment vielleicht auch. Aber mit den
makefile-Beispielen und dem makefile-Generator von Jörg (in WinAVR) ist
es eigentlich ganz einfach.

Im makefile (siehe Beispiel in WinAVR) gibt es eine Zeile die da heißt
SRC = ($TARGET).c

Entweder hängst Du Deine separaten Source-Files dort hinten an:
SRC = ($TARGET).c RegKonst.c Init.c MainUnt.c

oder dahinter in eigener Zeile (beachte das +=):
SRC += RegKonst.c Init.c MainUnt.c

Damit die Funktionen in main bekannt sind, benötigst Du header-Files,
die die einzelnen Funktionen deklarieren:

Beispiel: Init.h
void Timer0Prescaler (BYTE a);

Ist in dem Fall nur eine einzige Zeile.

Damit solltest Du eigentlich hinkommen, sonst mußt Du noch mal fragen.

PS: Packe die Dateien in ein ZIP dann geht es besser mit dem Anhang.
PPS: Verwende statt <io.h> die Datei <avr\io.h>, die andere ist
abgekündigt (müßte auch eine entsprechende Warnung kommen).

Volkmar

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #include <RegKonst.c>
> #include <Init.c>
> #include <MainUnt.c>

Das ist Dein Fehler.  Es nützt nichts, die Dateien von .h in .c
umbenennen, wenn Du sie trotzdem noch nur als Include-Dateien benutzt.

Bitte gib Init.c und MainUnt.c als separate Quellen in Deinem Makefile
an.  Schreib eine Headerdatei z. B. projekt.h, in der

BYTE ResetDelay (BYTE Delay);
BYTE ReadDelay (BYTE Dauer);
void Timer0Prescaler (BYTE a);

drinsteht und die Du überall mit #include "projekt.h" reinziehst.

RegKonst.c sollte wirklich besser RegKonst.h sein und #include'd
werden.  Das ist eine reine Headerdatei.  Du kannst natürlich auch
statt projekt.h gleich alles in RegKonst.h schreiben.
Nicht-System-Includedateien sollten übrigens in double quotes gesetzt
werden, nicht in Spitzklammern, also #include "RegKonst.h".

Btw., <io.h> ist deprecated, bitte benutze <avr/io.h>.  BYTE und WORD
heißen auf Standard-C (nach #include <inttype.h>) uint8_t und
uint16_t.  Das ist ohnehin eindeutiger, jemand, der von einer 32-bit
Architektur kommt, könnte WORD auch für einen 32-bit-Typ halten. ;-)

Autor: Jens-Erwin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

 bitte noch mal um Hilfe

ich habe alles nach Ihren wertvollen Hinweisen gemacht und es klappt
auch ---- fast!

Jetzt wird "nur" in der MainUnt.c das Control.M1 "struckt" nicht
erkannt.

//MainUnt.c:10: error: `Control' undeclared (first use in this
function)
  //MainUnt.c:10: error: (Each undeclared identifier is reported only
once
  //MainUnt.c:10: error: for each function it appears in.)

Wenn ich die RegKonst.h angebe, dann ist alles doppelt declared
was soll ich machen? -- es dürfte doch nur ein kleiner Fehler sein

Wenn ich die Zeile -- Control.M1 = 1; ---

ausblende, dann klappt alles wunderbar -- mit Simulieren und Sprung in
die Unterroutinen -- wie aber mache ich MainUnt.c klar, dass es
Control.M1 gibt??????

Bitte noch mal helfen, ... "sonst muss ich für immer und ewig zurück
zum Assembler" -- (werde die meisten Projekte auch da machen nur
wollte ich der Übersichthalber ab und an mit C arbeiten)

Vielen Dank -- habe alles in eine Zip getan

Autor: Volkmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt in der Datei MainUnt.c oben noch ein
#include "RegKonst.h"
einfügen, sonst ist in dieser Source-Datei die Struktur Control nicht
bekannt. Dann bekommst Du aber erst noch zwei Fehler die sich auf
andere Variablen beziehen: Counter, Delay1. Diese hast Du als globale
Variablen definiert. Da sie aber nun in verschiedenen Objektdateien
initialisiert werden, beschwert sich der Compiler. Du darfst die
Initialisierung nur an einer Stelle machen. Dies kannst Du zB in einer
separaten Init-Funktion machen.

Volkmar

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen, vielen Dank,

ich habe es begriffen ...

Es geht - ich nehme eine Funktion Init und setze dort alle globalen
Variablen, dann kann ich meine Dateien als c Dateien anlegen mit dem
Verweis auf die eigenen h-Dateien.

Das Simulieren klappt prima --- jetzt komme ich wieder ein Stück weiter
-- großes Lob an Euch

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p.s.: Initialisierung einer globalen (oder statischen) Variable mit 0
(Counter in diesem Falle) ist überflüssig.  Der C-Standard garantiert
diesen Wert bereits.  (Seit GCC 3 ist sie zwar auch harmlos, da der
Compiler das erkennt und die Initialisierung ignoriert, früher hat man
auf diese Weise mehr ROM sinnlos verbraucht.  Da das andere Compiler
aber u. U. nicht so optimieren, sollte man es sich eigentlich gar
nicht erst angewöhnen.)

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.