Forum: Mikrocontroller und Digitale Elektronik AVR-Simulator im AVR Studio


von Tom (Gast)


Lesenswert?

Hallo ein blutiger AVR Studio Anfänger bitte Euch mal um Hilfe zum 
Smulator.

Ich habe hier ein kleines Testprogramm:

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 4000000L
#endif

#include <util/delay.h>

int main (void) {

   DDRB  = 0xff;
   DDRC  = 0x00;
   PORTC |= (1<<PC0);

while(1){
 if ( PINC & (1<<PINC0) ) {
   PORTB = 0xff;
 }else{
  PORTB = 0x00;
 }
}
   return 0;
}


Wenn ich das übersetzt habe und im Simulator debuggen möchte kann ich 
während der Laufzeit:

erstens nicht die das 1. I/O Pin am PORTC "an- ausschalten"
zweitens ändert sich der Portzustand an PORTB nicht sichtbar?

Habt Ihr eine Idee was ich falsch mache respektive nicht richtig 
eingestellt habe?
Programmablauf per Einzelschritt ist soweit richtig.

Danke Tom

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das Programm sieht sinnvoll aus. Etwas mehr Kommentare schaden nicht.
1
#include <avr/io.h>
2
3
int main (void) 
4
{
5
  // Datenrichtung an PORTB: Alle Pins sind Ausgang
6
  DDRB  = 0xff;
7
8
  // Datenrichtung an PORTC: Alle Pins sind Eingang
9
  DDRC  = 0x00;
10
11
  // Interner Pullupwiderstand an PC0 einschalten
12
  PORTC |= (1<<PC0);
13
14
  while(1)
15
  {
16
    // wenn GENAU JETZT HIGH an PC0 anliegt
17
    // Pullup an PC0 spricht für active-low Taster/Schalter (#1)
18
    // => active-low angeschlossener Taster/Schalter nicht betätigt
19
    if ( PINC & (1<<PINC0) ) 
20
    {
21
      // dann setze alle Pins an PORTB auf HIGH
22
      // => active-low angeschlossene LEDs (#2) ausschalten
23
      PORTB = 0xff;
24
    }
25
    else
26
    {
27
      // ansonsten, wenn LOW an PC0 anliegt
28
      // => active-low angeschlossener Taster/Schalter betätigt
29
      // setze alle Pins an PORTB auf LOW
30
      // => active-low angeschlossene LEDs (#2) einschalten
31
      PORTB = 0x00;
32
    }
33
  }
34
35
  return 0;
36
}

Möglicherweise passt deine Hardware nicht zu dem Programm?

Wie hast du den Taster/Schalter an Pin PC0 angeschlossen?
Wie hast du die LEDs an PORTB angeschlossen?

Siehe auch:
#1 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter
#2 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Hardware

Wieviel Anfänger bist du? Kann es noch sein, dass das Programm noch 
nicht im µC ist? Oder dass das Programm für AVR Typ XYZ übersetzt wurde 
und auf dem STK500 befindet sich ein AVR Typ ABC?

von Johannes M. (johnny-m)


Lesenswert?

@Stefan B.:
Es geht hier offensichtlich um Debugging im Simulator. Hardware ist 
hier noch gar nicht im Spiel. Dementsprechend gibt's auch keine echten 
Taster usw.

Mit dem Kommentar hingegen volle Zustimmung! Sollte man sich direkt von 
Anfang an dran gewöhnen, auch Testprogramme zu kommentieren, erst recht, 
wenn man sie anderen zeigen will...

@Tom:
In welchem Modus simulierst Du das denn? Wenn Du die Änderungen der 
Register sehen willst, musst Du entweder in Einzelschritten durchsteppen 
oder im Autostep. Oder Du musst an Stellen, an denen Du Änderungen 
erwartest, Breakpoints setzen und dann mit Run starten.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ach so. Dann Kommando zurück.

von Tom (Gast)


Lesenswert?

@all

Danke erst mal.

Das Program habe ich blos mal schnell hingeschrieben, um den Simulator 
zu testen und das AVR Studio besser kennen zu lernen. Deshalb 
unkommentiert.


@Johannes M

Ja Einzelstep funktioniert ja auch.
Aber wenn ich Autostep(run F5) benutze kann ich das Input PIN 1 an Port 
C nicht setzen und ich sehe keinen Output an Port B. Kann es sein, das 
das so nicht funktioniert?

Der Portzustand ändert sich auch nicht, wenn ich einen Blinkgeber wie:

while(1){

  _delay_ms(1000);
  PORTB = 0xff;
  _delay_ms(1000);
  PORTB = 0x00;
}

den benutze???

LG Tom

von Sinusgeek (Gast)


Lesenswert?

> Kann es sein, das das so nicht funktioniert?

Genau, um Register oder Eingänge zu verändern oder Register oder 
Ausgänge zu lesen, muss die Simulation angehalten sein, das geht nicht 
"während der Fahrt".

Gewöhne Dir ab besten die Arbeit mit Haltepunkten an. Neben Halt an 
bestimmten Stellen gibt es auch Halt bei Veränderung von Variablen.

~

von Johannes M. (johnny-m)


Lesenswert?

Sinusgeek wrote:
> Genau, um Register oder Eingänge zu verändern oder Register oder
> Ausgänge zu lesen, muss die Simulation angehalten sein, das geht nicht
> "während der Fahrt".
Hmmm, ich meine, mich erinnern zu können, dass man zumindest im 
Auto-Step-Modus dazwischenhauen kann. Oder irre ich mich da?

Gruß

Cosinusfreak

von Sinusgeek (Gast)


Lesenswert?

Weiß nicht, den Autostep benutze ich nicht, da er keinen "Rückwärtsgang" 
hat. ;-)

Ich bevorzuge Haltepunkte, danach Einzelschritt durch den zu prüfenden 
Code, dann Run bis zum Haltepunkt. Bei Warteschleifen (wie im Beispiel) 
könnte auch Step Over sinnvoll sein, Warteschleifen sind aber nicht mein 
Stil, selbst für den einfachsten Blinker benutze ich einen der 
mitbezahlten Timer.

~

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.