Hallo, ich versuche mich gerade an einem AVR MC (ATmega 32-16PU) und verwende für die Assembler Programmierung AVR Studio. Ich habe ein eigentlich Simples Programm geschrieben wo eine Led per Tasten - druck leuchten soll und mit einem zweiten Taster wieder aus gehen soll. Mit einem dritten soll die Led blinken. Wenn ich mein Programm im Debug - Modus durchgehe, tritt nachdem der Timer überläuft folgende Fehlermeldung ein: “AVR Simulator: Uninitialized stack pointer used at 0x003b” danach springt er trotzdem in die ISR und führt auch meine Befehle für den Interrupt aus. Nachdem er damit fertig ist kommt folgende Meldung: ”AVR Simulator: Invalid opcode 0xffff at address 0x009898” Wäre nett wenn sich jemand kurz Zeit dafür nehmen könnte. Vielen Dank vorab. .include "m32def.inc" .org 0x000 .def temp = r18 .def t1h = r19 .def t1l =r20 .def stini = r17 .cseg rjmp init .org 0x010 rjmp intt1 .org 0x02b init: ldi stini, LOW(RAMEND) ;Untere 8 bit laden out SPL, stini ldi stini, HIGH(RAMEND) ;Obere 8 bit laden out SPH, stini ldi r16,0x60 out DDRD,r16 sei ldi r19, 0xc2 ldi r20, 0xf7 ldi temp, 0b00000100 out TIMSK, temp rjmp loop loop: SBIc PinD,2 rjmp an sbic PinD,3 rjmp aus sbic PinD,4 rjmp blink jmp loop an: ori r27, 0x60 out PORTD, r27 ldi temp, 0b00000000 ; t1 aus out TCCR1b, temp rjmp loop aus: ldi temp, 0b00000000 ; t1 aus out TCCR1b, temp ldi r27, 0x00 out PORTD, r27 rjmp loop blink: ldi temp, 0b00000101 ; teiler 1024 out TCCR1b, temp out tcnt1l,t1l out tcnt1h,t1h ldi r27, 0b00100000 out PORTD, r27 rjmp loop intt1: com r27 out portd, r27 out tcnt1l,t1l out tcnt1h,t1h reti
Ich kenne den ATMega32 nicht, aber du schreibst von Überlauf und an der Stelle .org 0x010 ist der Interruptvektor für den Timer1 Compare Match. Daran könnte es vielleicht liegen.
Wenn ich mich recht erinnere, reserviert der ATMega32 für jeden Eintrag in der Interrupt-Tabelle ein Doppelwort. Das deshalb, damit man ein vollständiges 'jmp' unterbringen kann, sodass man in den gesamten Programmspeicher hüpfen kann. Ich denke, der springt dir an eine Stelle, wo nix steht (eben 'unprogrammiert', 0xFF im Flash) und das, weil deine Tabelle zu kurz ist.
Hallo,
1 | .include "m32def.inc" |
2 | .org 0x000 da steht der ASM-Counter ohnehin am Anfang |
3 | .def temp = r18 |
4 | .def t1h = r19 |
5 | .def t1l =r20 |
6 | .def stini = r17 |
7 | .cseg etwas spät, ihm hier erst zu sagen, daß wir im cseg sind, wenn Du oben schon ein .org benutzt... |
8 | |
9 | rjmp init |
10 | |
11 | |
12 | .org 0x010 |
13 | rjmp intt1 |
14 | |
15 | .org 0x02b |
warum nicht so?
1 | ;--------- Definitionen ---------- |
2 | .def temp = r18 |
3 | .def t1h = r19 |
4 | .def t1l =r20 |
5 | .def stini = r17 |
6 | |
7 | ;--------- Programmbeginn ------- |
8 | .cseg |
9 | rjmp init |
10 | |
11 | .org OVF1addr |
12 | rjmp intt1 |
13 | |
14 | .org INT_VECTORS_SIZE |
15 | init: |
16 | |
17 | usw. usw. |
erspart viel nachdenken, wenn man die symbolischen Namen benutzt, spätestens, wenn man mit dem Code auf einen anderen AVR umzieht. Gruß aus Berlin Michael
Erstmal vielen Dank für die Antworten! Hab die Adresse für den Interrupt geändert, jedoch bringt der Simulator immer noch die gleichen zwei Fehlermeldungen. Auch mit dem Doppelword habt Ihr recht, nur die Sprungweite des relativen Srung hat ausgereicht. Hab es aber zur Sicherheit mit dem Jump probiert und es hat sich nichts geändert. Michaels Ratschlag bezüglich der Programmierung werd ich mir auf jeden Fall angewöhnen.
Mal 'ne dumme Frage: im Simulator den richtigen Controller eingestellt hast du aber schon, oder?
So dumm war deine Frage nicht! Das war der Grund! Besten dank.
zum simulieren debuggen setze ich eigentlich immer die Sprungtabelle für die Interrupts in den Quelltext damit man sieht wohin das Programm verzweigt gerade wenn man mit den Interrupts arbeitet. Kosten kaum Platz auf dem AVR nur ist vielleicht etwas mehr scrollen nötig .org 0x000 ;Beispiel für ATM16 jmp RESET jmp EXT_INT0 jmp EXT_INT1 jmp TIM2_COMP jmp TIM2_OVF jmp TIM1_CAPT jmp TIM1_COMPA jmp TIM1_COMPB jmp TIM1_OVF jmp TIM0_OVF jmp SPI_STC jmp USART_RXC jmp USART_UDRE jmp USART_TXC jmp AD_C jmp EE_RDY jmp ANA_COMP jmp TWSI jmp EXT_INT2 jmp TIM0_COMP jmp SPM_RDY
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.