Forum: Mikrocontroller und Digitale Elektronik ATmega 2560 - AtmelStudio7 Problem mit CompareA


von weakbit (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem was habe ich vergessen das der Interrupt 
Vektor auf 0x2A kommt? AVR ATmega2560 beim AtmelStudio7 kommt der 
Interrupt Vektor so gut wie nie obwohl das compa bit aufleuchtet und der 
Counter mit CTC resetet wird aber der Interrupt kommt nicht er springt 
nie dort hin obwohl der Vektor dort steht? Warum ist das so. Wollte das 
zuerst mit sleep machen und aufwachen aber da löscht sich alles im 
timer0 - sleep geht auch nicht!?
Habe alles  definiert temp = r16 usw.
Mein code: (hier copiere ich nicht alles rein weil nicht nötig.
.equ  tim0_stop  = 0b00000000
.equ  tim0_start  = 0b00000001
.equ  tim0_start64  = 0b00000011
.equ  tim0_count      = 0x00
.equ  tim0_tccr0a_init= 0b00000000
.equ  tim0_tccr0a_ctc  = 0b00000010 ;CTC,OCR0A=Top
.equ  tim0_toie0_ena  = 0x01  ;TIMSK0 page 131
.equ  tim0_ocie0a_ena = 0x02  ;OCIE0A Ocompare Interrupt Enable
.equ  tim0_ocr0a_max  = 0xFA


  .org 0x00  ;reset
  rjmp reset_vector

  .org 0x2a  ;tim0 compa
  rjmp tim0_compa_handler

        .org 0x100
tim0_compa_handler:
  cbr status,from_compa  ;mark bit_compa
  reti

reset_vector:
        ldi temp,high(ramend)
  out SPH,temp
  ldi temp,low(ramend)
  out SPL,temp

;Global Interrrupt Enable
  sei

init_timers:
  ldi temp,tim0_count
  out TCNT0,temp      ;TCNT0
  ldi temp,tim0_tccr0a_ctc  ;TCCR0A value 0x02
        out TCCR0A,temp      ;TCCR0A page 126
  ldi temp,tim0_ocr0a_max    ;OCR0A max count overflow
  out ocr0a,temp
  ldi temp,tim0_ocie0a_ena  ;overflow interrupt enable
  sts TIMSK0,temp
  ldi temp,tim0_start        ;start clk 16MHz ;no prescaler!
  out tccr0b,temp      ;tim0 clk 16MHz start

control:
  cbi porta,bit_oszi    ;oszi_bit = 0; falling edge
  nop
  sbi porta,bit_oszi    ;oszi_bit = 1; rising edge
zzz:
   rjmp zzz

Das I-bit is set, das SE-bit sleep is set '(sleep geht aber nicht im 
Atmelstudio7 da bleibt der Zähler stehen und das war es). CTC kommt und 
der tim0 wird auf 0x00 gesetzt. Das TIFR0 OCF0A=1 kommt. TIMSK0 
bit-OCIE0A=ena
Welches bit habe ich eventuell vergessen und warum kommt der Einsprung 
nicht in den Interrupt-Vektor?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn auch ein Nicht Assemblerkenner helfen darf, müßtest du beschreiben 
was du mit dem Timer machen möchtest bzw. was das gesamte Programm 
machen soll?

> Mein code: (hier copiere ich nicht alles rein weil nicht nötig.
Kommt darauf ob das Gezeigte alleine lauffähig ist und das Problem 
wiederspiegelt.

von Oliver S. (oliverso)


Lesenswert?

weakbit schrieb:
> beim AtmelStudio7 kommt der
> Interrupt Vektor so gut wie nie obwohl das compa bit aufleuchtet und der
> Counter mit CTC resetet wird aber der Interrupt kommt nicht er springt

Wer springt nicht? Der echte Prozessor, oder der Simulator im Studio?

Letzter springt im Single-Step nicht in ISRs. Setzt mal einen breakpoint 
in die ISR, und lass den laufen.

Wenns dann immer noch nicht geht, dann stimmt deine Initialisierung 
nicht. Da du aber keine Bitnamen verwendest, sondern nur kryptische 
hex-Werte, musst du das selber prüfen.

Oliver

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

kann es sein das du die globalen Interrupts nicht eingeschalten hast?

von weakbit (Gast)


Lesenswert?

@Oliver S.

Das Atmel Studio7 funktioniert nicht!
Der Code ist lauffähig im Studio7 aber der IRQ kommt nicht warum???
Der über den Timer0 ausgelöste Interrupt den das compa auslöst - alle 
bits kommen.

@Veit D.
SEI ist enabled.
CTC geht der timer0 wird resetet.
TIMSK - OCIE0A = 1
TIFR - OCF0A kommt bei Erreichung des TCCR0B - OCR0A Werts 0x47.
Alles funktioniert so wie es soll nur der Interrupt springt nicht ein??? 
Warum ich probiere es einmal mit einem Breakpoint - für was eigentlich?

MfG
weakbit

von weakbit (Gast)


Lesenswert?

So das ganze mit Breakpoint getestet. Selber Fehler.
Wie könnt Ihr einen Interrupt simulieren wenn der Einsprung nicht 
geht???
Komisch jetzt habe ich ein Update von Studio7 gemacht und das ganze geht 
noch immer nicht. Das Programm ist aber im Studio 4 oder 6 bereits 
einmal gelaufen deshalb ist das so komisch.

weakbit

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe das mit Arduino nachgebaut, funktioniert.
Das funktioniert in klassisch C/C++ auch in Atmel-Studio.
Ob in Assembler nochwas fehlt oder falsch ist kann ich nicht sagen.
1
void initTimer0()
2
{
3
  cli();               
4
  TCCR0B = 0;
5
  TCCR0A = 0;
6
  TIMSK0 = 0;
7
  TCNT0  = 0;
8
  TCCR0A = (1 << WGM01);   //  CTC
9
  OCR0A  = 250;
10
  TIMSK0 = (1 << OCIE0A);  // Compare Match Interrupt Enable
11
  TCCR0B = (1 << CS00);    // Prescaler 1
12
  sei();                   
13
}
14
15
void setup(void)
16
{
17
  pinMode(28, OUTPUT);
18
  initTimer0();
19
}
20
21
void loop(void)
22
{
23
24
}
25
26
27
ISR(TIMER0_COMPA_vect)   
28
{
29
  PINA = _BV(PB6);       // Pin 28
30
}

von c-hater (Gast)


Lesenswert?

weakbit schrieb:

> Mein code: (hier copiere ich nicht alles rein weil nicht nötig.

1) Du bist zu doof, um einschätzen zu können, was nötig ist (wäre es
   anders, bräuchtest du hier nicht fragen).
2) Du sollst nicht kopieren, sondern anhängen. Jedenfalls alles, was
   deutlich länger als ein übliches Posting ist.

von weakbit (Gast)


Lesenswert?

@Veit - Danke vorab

meines ist auch glaich nur habe ich einen Vektor der aufgerufen werden 
soll.
In C geht es aber in Assembler nicht - AtmelStudio7 vermutlich ein Bug?

MfG
weakbit

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich würde in die ISR ein Togglepin einbauen und mit Datalogger oder Oszi 
schauen ob das taktet. Wenn ja ist grundlegend erstmal der Timer okay. 
Dann gibts "nur" ein Problem mit deinem Vektoraufruf. Dafür müßtest du 
mehr zeigen, dann können dir die Assemblerexperten helfen. Maximale 
Erfolge.

von weakbit (Gast)


Lesenswert?

@Veit

Der soll hier im Vetor bei CompareA einspringen und dann kommt der 
handler dann reti.
Mehr soll er nicht machen - im Prinzip soll da ein sleep sein das er in 
den idle geht und immer wieder aufgeweckt wird aber ich habe schon alles 
mögliche Untersucht und komme zu keinem Venünftigen Schluss.
Mehr Code habe ich nicht das war's. Trotzdem Danke
Was ich nicht verstehe das der Code genau schon einmal funktioniert hat 
und auf einmal nach Jahren geht er nicht mehr nur weil das Atmel Studio 
7 den Sprung nicht kann . Eigenartig?

  .org 0x2a  ;tim0 compa
  rjmp tim0_compa_handler

  .org 0x100
tim0_compa_handler:
  cbr status,from_compa  ;mark bit_compa
  reti

MfG
weakbit

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.