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?
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.
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
Hallo, kann es sein das du die globalen Interrupts nicht eingeschalten hast?
@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
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
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 | }
|
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.
@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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.