Forum: Mikrocontroller und Digitale Elektronik ATmega32 will nicht springen! AVR-Studio schuld?


von Nicolas K. (nico33hh)


Lesenswert?

Hallo Wissende (die anderen natürlich auch)!

Vorweg, ich benutze:
- AVR-Studio (Ver. 4.18) => Assembler-Programmierung
- Pollin ATMEL-Eval.-Board Ver. 2.0.1 (Fertigmodul)
- USB-ISP-Programmer (Marke weiß ich jetzt nicht, ist auch egal)
- ATmega32-16 DIP40
- ATtiny2313 DIP20
- Viel Wissen über AT89S8253 (Prog. in ASM)
- Wenig Wissen über Prog von AVR (rel. Neuling)

Folgendes Problem:

Hier (m)ein simples Programm:
(Zeilennummerierung nur hier im Beitrag!)

PD5 = LED1, PD6 = LED2, (PD2-4 = 3 Taster)

=====================
01  ldi r16,0b11100011
02  out DDRD,r16

03  Haupt:
04  ldi r16,0b00100000
05  out PORTD,r16
06  rcall Warte
07  ldi r16,0b01000000
08  out PORTD,r16
09  rcall Warte
10  rjmp Haupt

11  Warte:
12  ldi r18,250
13  ldi r19,100
14  clr r21
15  Warte1:
16  clr r20
17  Warte2:
18  inc r20
19  cpse r20,r18
20  rjmp Warte2
21  inc r21
22  cpse r21,r19
23  rjmp Warte1
24  ret
=====================

So. Wenn ich den Code compil. und in den ATtiny2313 schiebe, ist das 
kein Problem. Die LEDs blinken abwechselnd.

Wenn ich den Code aber für den ATmega32 compil. und ihn dann in diesen 
brenne (ohne Probleme, Verify=OK), dann leuchtet LED1 auf - und das 
war's.

Bei meiner Fehlersuche habe ich dann ein Semikolon vor das rcall (Zeilen 
06+09) gemacht, damit der Befehl inaktiv ist. Resultat: LED1 und LED2 
leuchten (scheinbar) statisch.

Im laufe meiner weiteren Fehlersuche habe ich festgestellt, daß Sprünge 
und Verzweigungen im ATmega32 garnicht ausgeführt werden.
Woran kann das liegen?
Im ATtiny2313 funktioniert das hervorragend.
Ich habe übrigens auch mal die beiden HEX-Codes (ATtiny2313 + ATmega32) 
verglichen. Sie sind exakt gleich.

Was mache ich also falsch?

Wie immer danke ich Euch für Eure Unterstützung!

Schönen Gruß -

 Nico  :o)

von Karl H. (kbuchegg)


Lesenswert?

Ich kann nicht entdecken wo du den Stackpointer initialisierst.
Neuere Prozessoren machen das selbsttätig, ältere aber nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stack ist initialisiert?
Poste doch bitte den gesamten Quelltext, oft ist der Fehler ganz 
woanders...

von Nicolas K. (nico33hh)


Lesenswert?

Lothar Miller schrieb (und Karl heinz Buchegger im Prinzip auch):
> Stack ist initialisiert?
> Poste doch bitte den gesamten Quelltext, oft ist der Fehler ganz
> woanders...

Hm. Den Stack habe ich nirgendwo initialisiert.
Außer
.include "m32def.inc"
.device atmega32
vor meinem geposteten Quelltext war das auch schon der ganze Quelltext. 
Ist ja nur ein kurzes Test-Programm...

Wie läuft das mit der Stack-Initialisierung?


P.S.: Ihr seid aber verda..t schnell !!! :o)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nicolas K. schrieb:
> Wie läuft das mit der Stack-Initialisierung?
1
      :
2
      ldi   r18, LOW(RAMEND)           ;Stackpointer initialisieren
3
      out   SPL, r18
4
      ldi   r18, HIGH(RAMEND)
5
      out   SPH, r18                  
6
Haupt:
7
      :

von Volker S. (volkerschulz)


Lesenswert?

Nicolas K. schrieb:
> [...]
> Wie läuft das mit der Stack-Initialisierung?

Blaetter doch bitte mal selbstaendig im AVR-Tutorial.

Da findest Du dann auch den wesentlich eleganteren Weg fuer 
(Warte-)Schleifen mit dec und brne.

Volker

P.S.: Ich bin der Meinung in AVR-Studio (Ver. 4.18) auch schonmal 
irgendwo einen Debugger gesehen zu haben! ;)

von Nicolas K. (nico33hh)


Lesenswert?

Volker Schulz schrieb:
> Blaetter doch bitte mal selbstaendig im AVR-Tutorial.
>
> Da findest Du dann auch den wesentlich eleganteren Weg fuer
>
> (Warte-)Schleifen mit dec und brne.

Hallo Volker,

ich halte mich schon für sehr selbständig und habe schon div. Tutorials 
durchforstet. Aus einem dieser AVR-Tutorials habe ich auch die gepostete 
Warteschleife (die ja anscheinend nicht elegant ist).

Eine Initialisierung des Stacks habe ich bisher nicht 
gefunden/registriert.

@Lothar Miller:
Danke, ich werde es gleich mal ausprobieren, wenn meine beiden 
Kleinkinder-Jungs mich lassen... ;-)

von RW (Gast)


Lesenswert?

Fuse Bits sind die gleichen? wie beim tiny?

von Nicolas K. (nico33hh)


Lesenswert?

@ALLE BISHER BETEILIGTEN und vor allem
@Lothar Miller:

VIELEN DANK!
Die Initialisierung war's.

Jetzt läuft es einwandfrei... ;-)
Danke für die schnelle und tolle Hilfe!



Nochmal @Volker Schulz:

Der Debugger war schon bei mir im Einsatz. Aber DEN Fehler hat er nicht 
gefunden...
Von den 8051ern her bin ich auch Schleifen mit dec gewohnt. Ich werde 
mir das nochmal gründlich ansehen...


Da ich generell gern experimentiere, frage ich hier im Forum erst, wenn 
ich wirklich nicht weiterkomme und auch nichts über die Suchmaschine 
entdecken konnte.
Von daher finde ich Antworten a la Lothar Miller oder Karl heinz 
Buchegger am hilfreichsten (obwohl ich weiß, daß es genügend "unechte" 
Hilfesuchende gibt, die alles fertig und ohne Suchen serviert bekommen 
wollen)...

Also:
Vielen Dank, das Problem ist beseitigt..!

Nico  :o)

von Nicolas K. (nico33hh)


Lesenswert?

Kam wohl während meines Abschluß-Beitrags:

RW schrieb:
> Fuse Bits sind die gleichen? wie beim tiny?

Die Fuse-Bits sind i.O., nachdem ich den üblichen Anfänger-Fehler 
begangen habe und auf den ext. Takt-Generator umgeschaltet habe.

Aber 2 Pins hochgebogen und im gleichen Pollin-Board den ATtiny2313 als 
Taktgeber benutzt - und schon konnte ich die Fuse-Bits wieder richten... 
;-)

von Volker S. (volkerschulz)


Lesenswert?

Nicolas K. schrieb:
> ich halte mich schon für sehr selbständig und habe schon div. Tutorials
> durchforstet. Aus einem dieser AVR-Tutorials habe ich auch die gepostete
> Warteschleife (die ja anscheinend nicht elegant ist).

Ich meinte ja auch DAS AVR-Tutorial (Link!), nicht irgendeins. Gibt 
bestimmt auch schlechte davon. ;)

Bei einer Warteschleife kannste halt einige Zeilen einsparen. Sowas wie 
folgendes wird auch hier im Tutorial benutzt:
1
ldi   temp, 255
2
Warte:
3
dec   temp
4
brne  Warte

> Eine Initialisierung des Stacks habe ich bisher nicht
> gefunden/registriert.

In DEM AVR-Tutorial gibt es einen Punkt namens:
•Der Stack: Was ist der Stack und wie funktionieren 
Unterprogrammaufrufe?


>
> @Lothar Miller:
> Danke, ich werde es gleich mal ausprobieren, wenn meine beiden
> Kleinkinder-Jungs mich lassen... ;-)

Gruesse an die Kleinen!

von Nicolas K. (nico33hh)


Lesenswert?

Volker Schulz schrieb:
> In DEM AVR-Tutorial gibt es einen Punkt namens:
>
> •Der Stack: Was ist der Stack und wie funktionieren
>
> Unterprogrammaufrufe?

Der Gag ist, DAS Tutorial habe ich auch gelesen - aber die 
Initialisierung des Stacks habe ich total vernachlässigt/überlesen. 
Jetzt bei einem weiteren Durchlesen fiel es mir wie Schuppen aus den 
Haaren/Augen... ;-)
Kommt wohl, weil ich kein Ini von den MCS-51ern gewohn war (und der Tiny 
das wohl auch nicht braucht).

Danke an alle!

  Nico  :o)

P.S.: Weiß zufällig jemand, warum das AVR-Studio rechts in der 
Simulation kein PORTD hat? A-C sind da...

von Volker S. (volkerschulz)


Lesenswert?

Nicolas K. schrieb:
> P.S.: Weiß zufällig jemand, warum das AVR-Studio rechts in der
> Simulation kein PORTD hat? A-C sind da...

Bei mir ist da auch ein PORTD... Jedenfalls wenn ich ein Device mit 
PORTD eingestellt habe. ;)

Volker

von Nicolas K. (nico33hh)


Lesenswert?

Das verstehe ich nicht. Wenn ich ein Projekt mit einem 2313 
öffne/erstelle, habe ich die Ports A, B und D.
Bei einem mega32 aber nur die Ports A, B und C...
Wo ist der Port D geblieben?
Da ich mit dem Port D im mega32 arbeite, ist er zumindest definitiv 
vorhanden...

Hm... :o)

von spess53 (Gast)


Lesenswert?

Hi

Schon mal den ATMega32 in den Simulator Optionen eingestellt?

MfG Spess

von Route_66 (Gast)


Lesenswert?

@ Nico
Wenn ein "Programmierer" sich so wenig Gedanken um den Stack macht:

>Kommt wohl, weil ich kein Ini von den MCS-51ern gewohn war (und der Tiny
>das wohl auch nicht braucht).

dann muß man sich überhaupt nicht mehr wundern, daß Hacker so offene 
Scheunentore vorfinden, in fremde Computersysteme einzudringen.

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.