PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR Studio Simulation?



BlackDevil
14.05.2007, 18:45
Hey

ich habs jetz mit Sp2 ans laufen gebracht. Von µC.net hab ich mir mal das Tutorial reingezogen (so mehr oder weniger) und den ersten code blindlings eingegeben und versucht zu compilieren


/* Alle Zeichen zwischen Schrägstrich-Stern
und Stern-Schrägstrich sind lediglich Kommentare */

// Zeilenkommentare sind ebenfalls möglich
// alle auf die beiden Schrägstriche folgenden
// Zeichen einer Zeile sind Kommentar

#include <avr/io.h> // (1)

int main (void) { // (2)

DDRB = 0xff; // (3)
PORTB = 0x03; // (4)

while(1) { // (5a)
/* "leere" Schleife*/; // (5b)
} // (5c)

/* wird nie erreicht */
return 0; // (6)
}


Okay ich weis das da nich viel passiert aber irgendwie muss die simulation ja laufen. ICh bekams aber nur hin das er sich einen Controller suchte. Da keiner vorhanden is kanner da lang suchen^^

Wie krieg ich also eine sim hin?

Egal mit welchem cod
e
mfg[/code]

plusminus
14.05.2007, 21:37
Was passiert denn genau :?:

Was passieren sollte: Im Code-Bereich so ein kleines gelbes Pfeilchen vor die Zeile mit:
"int main(void){"

Allg. Vorgehensweise:
erstmal auf "BUILD", dann auf "START DEBUGGING" (Grünes Pfeilchen).

Erst, wenn er dann mal läuft kannst du im Menü unter "Debug" --> "AVR-Simulator-Options" den Typ und die Taktfrequenz einstellen.

Ich hoffe mal, dass ich die Frage richtig beantwortet habe ^^

/mfg plusminus

BlackDevil
14.05.2007, 22:28
was mir gerade einfällt, der pfad für die io.h ist nich komplett....

Und im Atmel Ordner ist weder eine iostream.h noch eine io.h noch eine *.h ...

In den optionen kann ich einen pfad angeben ich wüsste nur nich welchen. Ich denke da liegt der Hundbegraben, weil er führt ja nich mal das Make aus ;)

edit:
http://download.savannah.gnu.org/releases/avr-libc/
wäre das meine hilfe?

plusminus
14.05.2007, 22:37
du suchst im falschen ordner.
Der C-Code kommt nämlich von WinAVR und nicht vom Atmel AVR-Studio.

#include <avr/io.h>

sucht im standard-include-verzeichnis von WinAVR und das ist etwa:

C:\WinAVR\avr\include\

da findet er dann auch die
C:\WinAVR\avr\include\avr\io.h

/mfg plusminus

BlackDevil
14.05.2007, 22:47
du suchst im falschen ordner.
Der C-Code kommt nämlich von WinAVR und nicht vom Atmel AVR-Studio.

#include <avr/io.h>

sucht im standard-include-verzeichnis von WinAVR und das ist etwa:

C:\WinAVR\avr\include\

da findet er dann auch die
C:\WinAVR\avr\include\avr\io.h

/mfg plusminus


Ich hab vergessen WinAVR zu Installieren bzw nich dran gedacht ](*,)

Jetzt tut das ganze und ich muss nur noch rausfinden was mir die Sim bringt *g* ich mein in meinem Beispiel tut sich nich viel. Aber Bildlich eine LED und einen Taster kann ich nicht verwenden richtig?

plusminus
14.05.2007, 22:52
^^
*owned*)

Die Simulationsumgebung ist eigentlich wirklich nützlich, z.B. hab ich rad eben benutzt um zu schauen, wie der AVR mit dem modulo-Operator umgeht oder vor ein paar Tagen hab ich meine "delayMilliSeconds(int)"-Schleife getestet.
Der arbeitet übrigens nicht in Echtzeit. (Bzw sind die Rechner zu lahm)

Einen Taster kannst du sehr gut simulieren, du kannst nämlich einfach in den Registern rumpfuschen, also mit einem Klick einen EingangsPort aka "Taster" setzen. (und das ganz ohne prellen =) )

/mfg plusminus

BlackDevil
15.05.2007, 10:35
ich schau mir das heute nochmal in aller ruhe an


Heist ich sach ihm if(portxy=1) then port(z)== 1 (hiernur stilisiert) und klick dann port xy an und sehe ds port z ebenfalls ein schwarzes kästchen (=1) bekommt

Ich hatte gehofft auch testen zu können wie sich PWM und I²C verhalten. Das wird da etwas schwerer aber fürn anfang reichts danke :)


edit



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

#ifndef F_CPU
#define F_CPU 3686400UL /*Quarz mit 3.6864 Mhz */
#endif

#include <avr/delay.h> /* definiert _delay_ms() */

/* Einfache Funktion zum Entprellen eines Tasters */
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( ! (*port & (1 << pin)) )
{
/* Pin wurde auf Masse gezogen, 100ms warten */
_delay_ms(100);
if ( ! (*port & (1 << pin)) )
{
/* Anwender hat Zeit zum Loslassen des Tasters gegebn */
_delay_ms(100);
return 1;
}
}
return 0;
}

int main(void)
{
DDRB &= ~( 1 << PB0 ); /* PIN PB0 auf Eingang (Taster) */
PORTB |= ( 1 << PB0 ); /* Pullup-Widerstand Aktivieren */

if (debounce(&PINB, PB0)) /* Falls Taster an PIN PB0 Gedrückt */
{
PORTD = PIND ^ ( 1 << PD7 ); /* LED an PinD7 an bzw ausschalten */
}

PORTB = (1<<PB4);
}


sollte hier nich zumindest Pin4 an PortB = 1 sein? Dauerhaft?

c:/winavr/bin/../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
../io.c: In function 'main':
../io.c:40: warning: control reaches end of non-void function

und warum passt ihm das nich?

Also in der Simulation wird nichts 1 und hat auch nich den Status 1.. infoquelle ist das AVR GCC Tutorial, da is auch der code her

plusminus
15.05.2007, 15:21
Testen von i²C ist etwas schwer, weil du per Hand das gegenstück simulieren darfst ;)


sind ja nur warnings, also halb so wild.

Du willst lib ( <avr/delay.h> ) includen, die vom WInAVR-Team an nen anderen Platz "verlegt" wurde. Schau doch mal rein:



#ifndef _AVR_DELAY_H_
#define _AVR_DELAY_H_

#warning "This file has been moved to <util/delay.h>."
#include <util/delay.h>

#endif /* _AVR_DELAY_H_ */

Er lenkt den include quasi um

2te Warning kommt deswegen, weil du vergessen hast ein "return 0;" ans Ende einer int-Funktion zu schreiben.

2. Geht mal schritt für schritt deinen Code durch ;)
Du bist nach vllt 20 mikrosekunden am ende, du hast nämlich keine (Endlos-)Schleife drin...

/mfg plusminus

BlackDevil
15.05.2007, 15:41
Den Code hab ich 1:1 vom AVR GCC Tut übernommen, vergessen hab zumindest ICh nichts *g*
Aber auch mit return 0; tut sich da kein unterschied auf. Sollte ja zumindest der eine Port auf 1 sein ^^

was mich halt an der warnung irritiert ist der satz
../io.c:40: warning: control reaches end of non-void function

Oder will der einfach nur ein return 0; sehen?

plusminus
15.05.2007, 15:49
haja, steht ja da

ende einer nicht-void-funktion erreicht und es wird nicht zurückgegeben = unschön

BlackDevil
15.05.2007, 16:15
#include <avr/io.h>
#include <inttypes.h>

#ifndef F_CPU
#define F_CPU 3686400UL /*Quarz mit 3.6864 Mhz */
#endif

#include <util/delay.h> /* definiert _delay_ms() */

/* Einfache Funktion zum Entprellen eines Tasters */
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( ! (*port & (1 << pin)) )
{
/* Pin wurde auf Masse gezogen, 100ms warten */
_delay_ms(100);
if ( ! (*port & (1 << pin)) )
{
/* Anwender hat Zeit zum Loslassen des Tasters gegebn */
_delay_ms(100);
return 1;
}
}
return 0;
}

int main(void)
{
DDRB &= ~( 1 << PB0 ); /* PIN PB0 auf Eingang (Taster) */
PORTB |= ( 1 << PB0 ); /* Pullup-Widerstand Aktivieren */

if (debounce(&PINB, PB0)) /* Falls Taster an PIN PB0 Gedrückt */
{
PORTD = PIND ^ ( 1 << PD7 ); /* LED an PinD7 an bzw ausschalten */
}

PORTB = (1<<PB4);

return 0;
}

Jops so macht das auch für meine (inzwischen) bescheidenen C Kenntnisse MEHR sinn.

Aber: Die Sim mag immer noch nich. Ich mein es müsste ja zumindest PB4 immer auf 1 sein oder

plusminus
17.05.2007, 11:28
du kannst ja zeile für zeile durch den code durchgehen. Die Port-Register werden ja alle angezeigt...

/mfg plusminus

BlackDevil
17.05.2007, 13:27
Hey

sollte nich zumindest DDRA komplett auf High (also schwarze kästchen) und Bit0 udn 1 bei PINA auch auf High ;)?
http://img148.imageshack.us/img148/4039/unbenanntik3.th.jpg (http://img148.imageshack.us/my.php?image=unbenanntik3.jpg)

plusminus
17.05.2007, 21:01
Zu dem Zeitpunkt noch nicht, das gelbe Pfeilchen (=aktuelle Position) steht ja noch GANZ am Anfang...

/mfg plusminus

BlackDevil
18.05.2007, 16:13
wieder was gelernt, aber warum tut sich da dann nichts?

vklaffehn
18.05.2007, 16:17
drück mal F11, oder Debug -> Step in oder so ähnlich ...

MfG Volker

PS:darauf wartend, das der 'Sekunden'kleber fest wird......

BlackDevil
18.05.2007, 18:53
Alt+F5 und die hütte rennt

muchos grazias!