Hallo
Ich bin Neuling auf dem Gebiet der Atmel Programmierung.
Ich habe mir ein Programm geschrieben, welches mir 3Leds an den Ports
C0,C1,C3 per PWM dimmen soll. Dazu liest es beim start werte, welche
fest im EEprom liegen aus und übergibt diese an den SRAM. funktioniert
auch super bis auf eine Sache.
Wenn ich den Atmega8(teste auf STK500) einschalte dann leuchten die 3
Leds mit max. Helligkeit und nicht mit der gewünschten.
Am auslesen des EEproms kann es nicht liegen, das habe ich geprüft die
werte werden gelesen.
Kann mir jemand einen Tip geben was ich falslch gemacht habe?
Hallo
Habe den Fehler selber gefunden, es fehlte ein rjmp zwischen sei und
loop:
ldi temp, $00
sts srPWMCount, temp ;Zähler Timer Sram am Anfang null
setzen
sei
rjmp 0x004
loop:
rjmp loop
David S schrieb:
> Hallo>> Habe den Fehler selber gefunden, es fehlte ein rjmp zwischen sei und> loop:>
Das ist ziemlich sicher nicht die Problemlösung. Das mag das Problem
kaschieren, aber als Lösung ist das untauglich. Wie soll dieser rjmp
(und warum eigentlich 0x004?) irgendetwas an der Programausführung
verbessern?
Hi
Ich glaube auch nicht, das der RJMP 0x004 irgendwas it deinem Problem zu
tun hat.
Bei Assembler ist es zwingend notwändig, sich eine Struktur aufzubauen.
Richtig ist z. B.
Loop: ; ab hier werden alle Unterprogramme aufgerufen
15
; die in deinem Programm laufend abgearbeitet werden
16
; in der Form
17
; Lesen z. B. Werte von außen, Schalter, Taster UART etc
18
; Bearbeiten
19
; Ausgeben von Werten an die Peripherie
20
RJMP Loop ; dieser Teil wird immer wieder aufgerufen
21
22
; und nun deine Unterprogramme
23
read_sram5: ; Wert nehmen
24
; bearbeiten
25
; ablegen
26
RET ; mit RET verläßt du das Unterprogramm
27
; RETI ist Ausnahme bei Interrupt - ende
du hast in deinem Programm Sprungmarken, die du aufrufst, aber kein RET
dahinter, sondern Nahtlosen Übergang in die nächste Routine. Ich kann
mich irren und es kann so gewollt sein, aber sicher ist, das der Aufruf
RCALL readcvdata ;CV Werte aus eeProm lesen und in
den Aufruf
rcall main1 zur Folge hat, ohne das ich hier irgendwo ein RET gesehen
habe. Innerhalb springst du bedingt auf irgendwelche Marken und rufst
wieder mit RCALL readcvdata auf. Damit ist ein Stacküberlauf
vorprogrammiert. Du mußt die Verwendung von RCALL und RJMP richtig
einsetzen, sonst marschiert das Programm ins Nirwana
Gruß oldmax
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.