Ich programmiere ja in C und hab mir eben geschaut, was der GCC so ausspuckt an Assembler-Code und wie man was formulieren muss, und auch, wie er den SP setzt. GCC setzt den SP allerdings auf __stack und nicht auf RAMEND.
Schon in Adresse 0 steht was anderes, weil der rjmp an eine andere Stelle geht: Eben an die Adresse, wo der Code jeweils anfängt. Und diese Adresse kann unterschiedlich sein, ohne daß der Code deshalb falsch ist.
Ich hab den Code nochmals überflogen.
Ich würd dir vorsichtig raten, das Zeug zu vergessen.
Wenn ich's recht sehe ist die komplette Interrupt-Programmierung darin fehlerhaft:
- das Status-Register wird nicht gesichert --> im Hauptprogramm werden falsche Werte berechnet (sporadisch, wegen korruptem C-Flag)
- das Hauptprogramm ist nicht auf Interrupts vorbereitet --> im Hauptprogramm werden falsche Werte berechnet (sporadisch, denn die Addition in LOOP1 ist nicht atomar).
Wenn du kein ISP hast ist das natürlich recht misslich und guter Rat teuer...
Wie wärs zB mit einem kleinen Steckboard, da hat man mal fix ne kleine Schaltung aufgebaut ohne rumzulöten -- ok, nen Adapter für SUBD9 musst du löten und evtl einen für ISP, aber das nur ein mal.
Du kannst dann über ISP proggen und via LED (zB) ergendwas anzeigen, ob dein Prog was macht oder da landet, wo es soll.
Ist nur n Vorschlag, weil so holst du dir nur den Frust und ruinierst dir die Nerven, vor allem wenn man erst anfängt damit und erst mal nix geht und man noch lernt (das tut man immer).
::EDIT::
Das sieht dann etwa so aus:
Bild hier
Die Dinger gibt's bei Conrad.
Sind zwar nicht billig wie alles beim C, aber ich möcht es nicht mehr missen. Bis heute hab ich kein 'richtiges' Board. Platinen lass ich erst machen, wenn die Schaltung stabil ist.
Lesezeichen