Forum: Mikrocontroller und Digitale Elektronik problem mit jtag ice mkII und interrupts


von Florian Z. (zoechi)


Lesenswert?

guten tag,

und zwar habe ich, wie im titel bereits ersichtlich ein problem mit dem 
jtag ice mkii. ich benutze eine selbst gebastelte platine mit einem 
atmega128l, und ich kann den prozessor auch mit dem jtag programmieren.

folgendes test-programm zum beispiel funktioniert einwandfrei:

#include <avr/interrupt.h>
#include <avr/io.h>

int main()
{
DDRB=0xFF;
PORTB=0xFF;
while(1)
{
PORTB=~PORTB;
}
}

sehe ich mir den portb mithilfe eines oszis an, so sehe ich, dass der 
portb wie es sich gehört getoggelt wird. - anschlüsse stimmen also, ich 
kann meinen prozessor programmieren.

will ich allerdings nun ein programm raufladen welches den port mit 
Hilfe eines timer overflow interrupts toggled so tritt folgendes problem 
auf:

die main funktion wird korrekt abgearbeitet, anschließend springt er in 
die interrupt routine, arbeitet diese einmal korrekt durch, kommt zum 
schluss der interrupt routine, anschließend ist eine kurze wartezeit - 
dann springt er wieder zum ersten punkt des programms - also wieder zur 
zeile int main().

selbes problem hatte ich schon vor paar monaten mit einem stk-board, 
dort sahen wir, als wir uns den assembler code anschauten, dass er bei 
dem return from interrupt befehl an eine falsche stelle des flash 
speichers sprang, danach bis zum schluss durchrannte und anschließend 
einen reset erzwang.

hatte schon mal jemand ein ähnliches problem, kann sich jemand 
vorstellen, was mein fehler sein kann? hab ich vielleicht nur irgend ein 
häkchen bei den optionen im avr studio vergessen? danke!

von spess53 (Gast)


Lesenswert?

Hi

Du solltest mal den Stack initialisieren.

MfG Spess

von holger (Gast)


Lesenswert?

Watchdog abschalten

von Sauger (Gast)


Lesenswert?

Florian Z. schrieb:
> die main funktion wird korrekt abgearbeitet, anschließend springt er in
> die interrupt routine, arbeitet diese einmal korrekt durch, kommt zum
> schluss der interrupt routine, anschließend ist eine kurze wartezeit -
> dann springt er wieder zum ersten punkt des programms - also wieder zur
> zeile int main().

Es wäre hilfreich wenn du das nicht funktionierende Programm vorstellst.

MfG

von Florian Z. (zoechi)


Lesenswert?

du meinst folgende beiden zeilen gleich zu anfang des programms 
einfügen?

SPL=0x5D
SPH=0x5E

so weit ich mich erinnern kann haben wir das bereits versucht - aber 
wenn ich diese werte setze, setze ich ja nur den wert der im register 
steht, und nicht die adresse ?? verwirrt bin


edit: und noch das nicht funktionierende programm:

#include <avr/interrupt.h>
#include <avr/io.h>

int main()
{
   TCCR0&=0x07;
   TCCR0|=0x05;
   TIMSK|=0x01;
   SREG|=0x80;
  DDRB=0xFF;
  PORTB=0xff;
  while(1)
  {

  }
}

ISR(TIMER0_OVF_vect)
{
  static char count=0;
  if(count++>30)
  {
    PORTB=~PORTB;
    count=0;
  }
}

von holger (Gast)


Lesenswert?

>du meinst folgende beiden zeilen gleich zu anfang des programms
>einfügen?

Spess will dich nur ärgern;)
Stack setzt der Compiler.

von holger (Gast)


Lesenswert?

>   TCCR0&=0x07;

TCCR0 kennt dein ATMega nicht. Das heisst TCCR0A oder TCCR0B.
Hast du den richtigen AVR eingestellt? Nicht das du da für
ATMega32 compilierst.

von Florian Z. (zoechi)


Lesenswert?

holger schrieb:
> Watchdog abschalten

du meinst das häkchen bei wdton bei den fuse-bits rausnehmen? hm... das 
war nie drin, trotzdem danke

von Florian Z. (zoechi)


Lesenswert?

holger schrieb:
>>   TCCR0&=0x07;
>
> TCCR0 kennt dein ATMega nicht. Das heisst TCCR0A oder TCCR0B.
> Hast du den richtigen AVR eingestellt? Nicht das du da für
> ATMega32 compilierst.

erstmal sry für doppelpost

aber ähm, laut datenblatt, und laut der adressspalte im avr studio (die 
spalte die rechts angedockt ist) - lauten die register tccr0, usw. - 
müsste doch eigentlich stimmen?!

edit: atmega128 ist auch eingestellt

von holger (Gast)


Lesenswert?

>platine mit einem atmega128l

>edit: atmega128 ist auch eingestellt

Was denn nun? ATMega128? Dann M103C Fuse deaktivieren.

von Florian Z. (zoechi)


Lesenswert?

holger schrieb:
>>platine mit einem atmega128l
>
>>edit: atmega128 ist auch eingestellt
>
> Was denn nun? ATMega128? Dann M103C Fuse deaktivieren.

naja physisch wird ein atmega128l eingesetzt, nachdem aber unter 
avrstudio4 so einer nicht zur auswahl steht, habe ich mich 
softwartechnisch für den atmega128 entschieden, da diese pin kompatibel 
sind und auch das selbe datenblatt teilen.

von spess53 (Gast)


Lesenswert?

Hi

>naja physisch wird ein atmega128l eingesetzt, nachdem aber unter
>avrstudio4 so einer nicht zur auswahl steht,

Uraltes AVR-Studio?

> habe ich mich
>softwartechnisch für den atmega128 entschieden, da diese pin kompatibel
>sind und auch das selbe datenblatt teilen.

Mit Sicherheit nicht.

Sorry für den Hinweis zum Stack.

MfG Spess

von Sauger (Gast)


Lesenswert?

Florian Z. schrieb:
>   TCCR0&=0x07;
>   TCCR0|=0x05;
>   TIMSK|=0x01;
>   SREG|=0x80;

ersetze die Konstanten (0x07... und den Rest) mal durch die von den 
headern zur Verfügung gestellten Symbole

MfG

von holger (Gast)


Lesenswert?

>naja physisch wird ein atmega128l eingesetzt, nachdem aber unter
>avrstudio4 so einer nicht zur auswahl steht

Aus welchem Jahrtausend stammt deine AVR Studio Version?
Zieh dir ganz schnell mal ne neue.

>softwartechnisch für den atmega128 entschieden, da diese pin kompatibel
>sind und auch das selbe datenblatt teilen.

Nö, tun sie nicht.

von Florian Z. (zoechi)


Lesenswert?

ähm... die hätt ich mir vorgestern erst heruntergeladen.... hm.... 
folglich bin ich blind?! 1 moment

ich habe:
atmega128
atmega1280
atmega1281 (eins)
atmega1284p
atmega128rfa1

andre 128er hab ich nicht ...

von Sauger (Gast)


Lesenswert?

holger schrieb:
> Nö, tun sie nicht.

doch atmega128 und atmega128-L (atmega128l)

MfG

von Florian Z. (zoechi)


Lesenswert?

oO ... sry mein fehler... bzw der fehler von courier new... es handelt 
sich um einen ATmega128L

von Florian Z. (zoechi)


Lesenswert?

so leute danke.... m103c fuse deaktivert, dann noch gesehen das ich 
dussel auch sreg=0x80 auskommentiert hatte, und jetz funktionierts!!

schönen dank an alle!

von Peter Z. (Gast)


Lesenswert?

was macht denn die M103C - Fuse, ich habe nämlich das gleiche Problem 
nur mit dem AT90USB1287 bzw. AT90USBKey

Gruß
Pete

von spess53 (Gast)


Lesenswert?

Hi

>was macht denn die M103C - Fuse,

Bei dir gar nichts. Dein Controller hat keine.

MfG Spess

von Peter Z. (Gast)


Lesenswert?

dann muss bei mir das Problem wohl woanders liegen, oder besitzt der 
AT90USB1287 eine ähnliches Fuse wie das M103c, das dieses Problem hier 
beheben wird.

Gruß
Pete

von spess53 (Gast)


Lesenswert?

Hi

>...oder besitzt der AT90USB1287 eine ähnliches Fuse wie das M103c,

Nein, der AT90USB1287 hat nichts vergleichbares.

Es ist übrigens günstiger, einen eigenen Thread aufzumachen in dem du 
dein Problem beschreibst.

MfG Spess

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.