Hallo
Ich habe das Problem das der MCU nicht mehr startet wenn man als org
0x000 einen rjmp angibt. (Rätzel)
Ohne die Interrupt Vektoren laüft er einwandfrei. Eine PWM läft auch
einwandfrei. Simulation ebenfalls?
Was mache ich falsch?
Mein Programmstart:
Registertypenfestlegung
;---------------------------------------------------------------------
.equ Halbperiode = 16
.equ Halbhalbperiode = 8
.def temp = R16
.def temp2 = R17
.def Sinuswertzaehler = R18
.cseg
.org 0
rjmp start
.org 0x0008
Tim1OVF
start:
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND) ;init Stack Pointer
out SPL,temp
ldi temp, 0xff
out DDRD, temp
out PORTD, temp
ldi temp, 0xff
out DDRB, temp
ldi temp, 0b01110100
out TCCR2, temp
ldi temp, 128
out TCNT2, temp
ldi temp, 128
out OCR2, temp
sei ; Globale Interrupts freigeben
ldi Sinuswertzaehler,0
rjmp loop
loop:
rjmp loop
keinen Sinn. Sobald der Timer1-Overflow auftritt (wenn er denn überhaupt
freigegeben ist, was ich bezweifle, da ja anscheinend Timer 2 läuft...),
wird die Startsequenz ausgeführt. Ich denke, da muss wenn überhaupt
Hab im im zweiten Text ja schon verbessert.
Es ist ja nicht so als wenn ich noch nie programmiert hätte. Beim Mega 8
geht das einwandfrei, nur hier nicht. Vieleicht hat auch das neuste AVR
Studio ne Macke, ich bekomme es nicht hin.
Nur wenn ich den ersten Befehl an .org 0x0001 lege geht. Ist aber
eigentlich Quark, da liegt ja nen anderer Interrupt.
Also nochmal: Im Codefragment oben passt der Interrupt-Vektor nicht zum
verwendeten Timer. Ist das nun eine Folge der Kürzung des hier
geposteten Codes oder am Ende das eigentliche Problem?
Mensch Leute, lest doch mal!
Wenn ich überall Org anweisungen geben muss mir der Assembler den Code
auch genau dahinpacken, Natürlich habe ich überall rjmps stehen.
Wie gesagt, der Simulator läuft.
Habe mittlerweile auch mal das ausprobiert: (Auch mal ohne Org)
Immer das gleiche, wenn ich ab 0x0001 anfange gehts sonst nicht.
.cseg
.org 0x0000
rjmp Start ;Reset External Pin, Power-on Reset, Brown-out
Reset and Watchdog Reset
reti ;INT0 External Interrupt Request 0
reti ;INT1 External Interrupt Request 1
reti ;TIMER2 COMP Timer/Counter2 Compare Match
reti ;TIMER2 OVF Timer/Counter2 Overflow
reti ;TIMER1 CAPT Timer/Counter1 Capture Event
reti ;TIMER1 COMPA Timer/Counter1 Compare Match A
reti ;TIMER1 COMPB Timer/Counter1 Compare Match B
reti ;TIMER1 OVF Timer/Counter1 Overflow
rjmp TIM0OVF ;TIMER0 OVF Timer/Counter0 Overflow
reti ;SPI, STC Serial Transfer Complete
reti ;USART, RXC USART, Rx Complete
reti ;USART, UDRE USART Data Register Empty
reti ;USART, TXC USART, Tx Complete
reti ;ADC ADC Conversion Complete
reti ;EE_RDY EEPROM Ready
reti ;ANA_COMP Analog Comparator
reti ;TWI Two-wire Serial Interface
reti ;INT2 External Interrupt Request 2
reti ;TIMER0 COMP Timer/Counter0 Compare Match
reti ;SPM_RDY Store Program Memory Ready
Und so würde es laufen: (Habe natürlich ein reti aussparen müssen, sonst
wird ja der Timer0 nicht richtig angesprungen.
.cseg
.org 0x0001
rjmp Start ;Reset External Pin, Power-on Reset, Brown-out
Reset and Watchdog Reset
//reti ;INT0 External Interrupt Request 0
reti ;INT1 External Interrupt Request 1
reti ;TIMER2 COMP Timer/Counter2 Compare Match
reti ;TIMER2 OVF Timer/Counter2 Overflow
reti ;TIMER1 CAPT Timer/Counter1 Capture Event
reti ;TIMER1 COMPA Timer/Counter1 Compare Match A
reti ;TIMER1 COMPB Timer/Counter1 Compare Match B
reti ;TIMER1 OVF Timer/Counter1 Overflow
rjmp TIM0OVF ;TIMER0 OVF Timer/Counter0 Overflow
reti ;SPI, STC Serial Transfer Complete
reti ;USART, RXC USART, Rx Complete
reti ;USART, UDRE USART Data Register Empty
reti ;USART, TXC USART, Tx Complete
reti ;ADC ADC Conversion Complete
reti ;EE_RDY EEPROM Ready
reti ;ANA_COMP Analog Comparator
reti ;TWI Two-wire Serial Interface
reti ;INT2 External Interrupt Request 2
reti ;TIMER0 COMP Timer/Counter0 Compare Match
reti ;SPM_RDY Store Program Memory Ready
Mensch Maik, wie soll man passende Tips geben, wenn alles, was am
geposteten Code nicht stimmt, am Posten liegt und nicht am Programm.
Hier beispielsweise steht jetzt der Timer0 Interrupt drin. Im Code oben
freilich der Timer2. Mehr steht mir für Beurteilung nicht zur Verfügung.
Seid mir nicht böse, aber das eigentliche Problem seit dem ersten Thread
ist das kein Programmstart erfolgt im Controller. Welchen timer ich
jetzt benutze (zum Testen) ist doch jetzt völlig sekundär.
Kurz zusammengefast:
Alles funktioniert, auch jeder Interrupt wenn ich bei 0x0001 anfange.
(Wird auch dort hingesetzt, zumindest sichtbar im dissassemble Fenster).
Ist aber Schwachsinn weil 0x0001 ja der INT0 ist, den ich ja dann nicht
mehr benutzen kann.
Mache ich die ganz normale Tabelle (nach PDF) gehts nicht, was der
Conroller wirklich macht weiß ich nicht.
bei MCU mit ordentlich flash:
.org 0
jmp init
jmp nix
jmp nix
jmp isr_a
jmp isr_b
jmp nix
...
nix: reti
bereits im 2Post genannt - aber daran müsste es wohl liegen.
Grüße, Hendrik
So kommen wir wohl nicht weiter. Die einzig konkrete und bestätigte
Information von dir ist "Programm startet nicht, in Abhängigkeit vom
.org", nebst der Vektortabelle. Das Programm hingegen ist nicht bekannt,
denn alles was dazu hier bisher drinstand ergibt einfach keinen Sinn,
ist unvollständig, bestätigt falsch usw.
Auch die Aussage "Alles funktioniert, auch jeder Interrupt..." beweist
nur, dass es nicht der hiesige Code sein kann, denn da kann kein
Interrupt erfolgen.
Es fehlt auch jede Aussage darüber, woher du erkennst, dass das Programm
nicht losläuft. Die einzig wirklich autoritative Auskunft dazu gäbe ein
JTAG-Debugger, das gibt der Mega8535 aber nicht her.
NB: Der Mega16 schaut ziemlich ähnlich aus und der hat JTAG. Mit einem
zweiten Mega16 als Evertool-Light (beispielsweise) konfiguriert, kannst
du dem Problem auch selber ganz konkret und Schritt für Schritt zu Leibe
rücken. Der Simulator hat nälich erklärtermassen so seine Tücken.
@Henne: Der Mega8535 hat 8KB Flash und alle Typen bis 8KB definieren pro
Vektor 1 Codewort. Und haben keinen JMP Befehl, weil RJMP für den ganzen
Adressraus ausreicht.
Wobei ich ja schon sagte das JMP nicht da ist:
Ich soll beweisen das etwas nicht läuft, ich schüttle im Moment echt den
Kopf. Ist doch wohl klar das ich das wohl ausgetestet habe und doch
weiter bin als LEDs blinken zu lassen am Ausgang.
Aber gut ich komme ja sonst auch nicht weiter.
Weil ich nicht die 2k Programmcode hier posten will, was auch gar nichts
brinkt, hier ein LED Blinkprogramm zum Ausprobieren in Funktionaler und
korrekter nicht funktionaler Form.
"Ist doch wohl klar das ich das wohl ausgetestet habe"
Dir schon, aber mangels telepathischer Fähigkeiten sonst niemandem. Die
Leser müssen mit dem auskommen, was sie zu lesen kriegen, und haben a
priori meist keine Ahnung vom Kenntnisniveau des Fragestellers und
davon, was er schon alles ausprobiert hat. Die Konsequenz sind Fragen,
die Leute wie dich auf die Palme bringen.
"Dir schon, aber mangels telepathischer Fähigkeiten sonst niemandem. "
So ein dämliches Gelaber, habe das Problem jetzt schon vier mal
dargestellt, sogar die Programme abgebildet. Was willste denn noch.
Die Lösung kann ich nicht dazu geben, die Suche ich ja, willst du mir
nun helfen oder nicht.
So herum wird TCNT1H nicht gesetzt, der Timer startet also bei 0x000A,
nicht bei 0xF70A. Der erste Interrupt ist folglich nach ~67 Mio
Taktzyklen zu erwarten. Ich kann nicht wissen, ob deine Geduld dazu
ausreichte, zumal mir die Taktfrequenz nicht bekannt ist - ausgeliefert
wird der Controller ja mit 1MHz Takt.
Drücke mal F5 und lese vier Beiträge vorher! Es ist völlig egal wie
herum du Register beschreibt solange sie nicht benutzt werden. Ich habe
es auch mal umgedreht und es geht nichts weil die Timer (auch
mittlerweile gesagt) laufen und nichts mit dem Problem zu tun haben,
oder zumindest in so fern unlogisch ist, das auch dann t0 und t2 nicht
laufen.
Wer wirklich helfen will teste doch bitte laufen mal die zwei Programme,
möglichst in einem Mega, bis auf spätere Interrupts zeigt sich ja
vieleicht schon der Fehler.
Wer ein M8535 hat währe natürlich noch schöner, vieleicht kommen wir dem
eigentlichen Problem dann näher.
Ich brauche leider die INTs sonst würde ich einfach bei 0x0001 starten
Korrigiere mich wenn ich mir irre, aber soweit ich das Programm verstehe
ist die einzige Erkenntnis seiner Funktion die LED, die im Interrupt
umgeschaltet wird.
Da der Zeitpunkt des Interrupts davon abhängt, was im TCNT1 drinsteht,
hielt ich es für möglich, dass der Ablauf des Timers davon abhängt, was
im möglicherwise zufälligen TEMP Register (dem internen für die 16bit
Zugriffe) drinsteht. Dann hättest möglicherweise du einem Phantom
nachgejagt und nicht die Änderung des Programms sondern dieser TEMP Wert
hätte den Zeitraum bis zum 1. Interrupt bestimmt.
Wenn ich die damit auf die Nerven gehe, Pech. Eine schlüssige Ursache
kann ich dir nicht bieten, denn abgesehen von dieser H/L-Sache finde ich
nix. Und zu den Tests mit anderen Timern habe ich nur deine Aussage,
keinen Code.
Sorry, aber ich habe es hier schon öfter erlebt, dass jemand schreibt
"alles ist 100% korrekt, habe alles ausprobiert, aber es funktioniert
nicht". Aus dieser Erfahrung heraus pflege ich gern mal die eine oder
andere "Selbstverständlichkeit" in Frage zu stellen.
Ich sag ja das ich auch nicht weiterkomme, demnach bin ich auch unter
heftigen Diskussionen bereit eine Lösung zu finden.
Das Programm ist nur runtergekürzt auf das wesendliche, in wirklichkeit
ist es Teil eines Frequenzumrichters.
Auch ich erlebe zu oft das die Leute keine Ahnung haben, aber Profis
(und ich bin keiner) sind auch nicht in Foren anzutreffen.
Ich bin aber der Meihnung das man den Leuten nicht immer alles beweisen
lassen muss bevor man sich überlegt sich in das Problem hereinzudenken.
Als etwas älteres Semester sehne ich mich doch nach dem alten Forenstil
zurück in dem in einem Fachforum keine Rechtschreibfehler angemakert
wurden. Ist für mich völlig sinnfrei.
Das war jetzt allgemein gesprochen.
Hi!
Also wenn ich das richtig verstanden habe, wenn du Rest an Vektor 0
schreibst geht es nicht, schreibst du ihn an Vektor 1 geht es.
Haste mal einen neuen Mega genommen? Normal ist das jedenfalls nicht.
Versuche mal
.org 00
rjmp Reset
rjmp Reset
wenn das geht könnte dein Adresszähler def. sein, unklar ist aber dann
warum es später im Progr. geht. Adressen mit $XX00 müssten Probleme
machen(Die Bits werden ja auch gesetzt)
Anderer Gedanke.:
.org 00
Reset00: rjmp Reset2
rjmp Reset1
.
.
.
Reset1: irgend eine LED an
rjmp Reset00
Reset2: eine 2. LED an
rjmp LED3
.org $F0
LED3: eine 3.LED an
3.Led aus
rjmp LED3
Sollten alle Led's leuchten ist "nur" dein Adressreset fehlerhaft und du
müsstest in der INT0-ISR(wenn du ihn brauchst) das INT0 Flag abfragen um
den Fehler abzufangen.
Geht nur die 2. LED an ist der Adresszähler def. und du solltest einen
neuen Proz. nehmen.
Viel Erfolg, Uwe