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
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?
@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.
@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
> 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.
~
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.