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
Also bei .org 0x0008 steht natürlich "rjmp Tim1OVF" Habe das Programm nur schon bis dahin beschnitten.
Dann nim nen jmp ;) du brauchst aber afaik, org 0 (bei der ersten adresse) nicht angeben, da der erste befehl automatisch da steht.
Habe das der Ordnung halber angegeben, jmp gibt es bei mega8535 nicht, werde mal ausprobieren ob es jetzt läuft, Simulator läuft immer.
Zu viel geküzrt? Timer1 Interrupt definiert und Timer2 programmiert.
Vor allem macht
1 | .org 0x0008 |
2 | Tim1OVF |
3 | |
4 | start: |
5 | ;... |
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
1 | .org 0x0008 |
2 | rjmp Tim1OVF |
3 | |
4 | start: |
hin. Ohne den rjmp gibts nur Ärger.
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.
Lies mal im Datasheet den Absatz über die Reihenfolge der Zugriffe auf die H und L Hälften von 16bit I/O-Registern.
"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
Deine Aussage stimmt abgesehen davon auch nicht, abgesehen davon habe ich die Programme auch direkt geteset (Mit Ossi).
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
Werde ich mal kontrollieren, Einen neuen MC habe ich schon bestellt. Kann auch an Pony Prog liegen, ist die neuste Version.
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.