Forum: Mikrocontroller und Digitale Elektronik Programmstart nicht ok beim mega8535


von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

Also bei .org 0x0008 steht natürlich "rjmp Tim1OVF" Habe das Programm 
nur schon bis dahin beschnitten.

von Jens B. (sio2)


Lesenswert?

Dann nim nen jmp ;) du brauchst aber afaik, org 0 (bei der ersten 
adresse) nicht angeben, da der erste befehl automatisch da steht.

von Maik (Gast)


Lesenswert?

Habe das der Ordnung halber angegeben, jmp gibt es bei mega8535 nicht, 
werde mal ausprobieren ob es jetzt läuft, Simulator läuft immer.

von A.K. (Gast)


Lesenswert?

Zu viel geküzrt? Timer1 Interrupt definiert und Timer2 programmiert.

von johnny.m (Gast)


Lesenswert?

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.

von Maik (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

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?

von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von Maik (Gast)


Lesenswert?

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.

von Henne (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

@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.

von Maik (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Maik (Gast)


Angehängte Dateien:

Lesenswert?

Diese läuft nicht

LED ist an PA2

von Maik (Gast)


Lesenswert?

Quarz 16MHz MCU Mega 8535

von A.K. (Gast)


Lesenswert?

Lies mal im Datasheet den Absatz über die Reihenfolge der Zugriffe auf 
die H und L Hälften von 16bit I/O-Registern.

von A.K. (Gast)


Lesenswert?

"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.

von Maik (Gast)


Lesenswert?

UND?!?

Kannste auch umdrehen, bleibt das gleiche Problem!

von Maik (Gast)


Lesenswert?

"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.

von A.K. (Gast)


Lesenswert?

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.

von Maik (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

Deine Aussage stimmt abgesehen davon auch nicht, abgesehen davon habe 
ich die Programme auch direkt geteset (Mit Ossi).

von A.K. (Gast)


Lesenswert?

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.

von Maik (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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

von Maik (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.