Hallo,
habe hier einen simplen code. Timer1 wird mit prescaler 1024 aktiviert
und soll den Interrupt aufrufen. Wenn ich im AVR Studio 5 den code
compiliere und auf meinen Atmega162 (MLF Version) spiele, wird die ISR
nie aufgerufen. Wenn ich den Debugger aktiviere (mit Atmega16 -weil
einen Atmega162 gibts nicht als Debugger im AVER Studio 5 ?),
funktioniert alles super.
Danke für jeden Tipp!
BTW: Weis jemand wie man einen atmega162 im AVR Studio 5 debugger
aktiviert?
1
//Atmega162, int 8 MHz with clk div 8 => 1 MHz
2
#define F_CPU 1000000L
3
#include<avr/io.h>
4
#include<stdint.h>
5
#include<stdlib.h>
6
#include<util/delay.h>
7
#include<avr/interrupt.h>
8
9
10
ISR(TIMER1_COMPA_vect){
11
//1 sec. timer
12
cli();
13
PORTC=1;
14
sei();
15
}
16
17
intmain(void){
18
sei();
19
TIMSK=(1<<OCIE1A);//enable interrupts
20
OCR1A=976;//1 sec.
21
TCCR1B=(1<<CS12)|(1<<CS10)|(1<<WGM12);//CTC with prescaler 1024
Hi
>Wenn ich im AVR Studio 5 den code>compiliere und auf meinen Atmega162 (MLF Version) spiele, wird die ISR>nie aufgerufen.
Du hast den Port nicht als Ausgang initialisiert.
> cli();> sei();
ClI und SEI haben in einer Interruptroutine nichts zu suchen.
MfG Spess
Hallo,
SORRY, habe in der main eine menge kommentare stehen, die ich nicht
mitkopiert habe. Habe dadurch auch die 2 obersten zeilen vergessen:
1
DDRC=0b11111111;//sry für diese schreibweise
2
PORTC=2;//zum test
>ClI und SEI haben in einer Interruptroutine nichts zu suchen.
Ist es nicht normal das so zu machen? Am Anfang der ISR die Interrupts
zu blocken, um zu verhindern, dass der "wichtigere" Interrupt
unterbrochen wird?
danke
MM
Michael M. schrieb:>>ClI und SEI haben in einer Interruptroutine nichts zu suchen.> Ist es nicht normal das so zu machen? Am Anfang der ISR die Interrupts> zu blocken, um zu verhindern, dass der "wichtigere" Interrupt> unterbrochen wird?
Bein Einsprung in eine ISR wird das I-Bit automatisch gelöscht. Ein
erfahrener Programmierer kann dann aber mit sei() das I-Bit wieder
setzen um höher priorisierten Interrupts zu erlauben, die aktuelle ISR
zu unterbrechen, oder gar verschachtelte Interupts zu ermöglichen. Aber
das ist, wie gesagt, nur was für Fortgeschrittene.
gruß cyblord
Hi
>SORRY, habe in der main eine menge kommentare stehen, die ich nicht>mitkopiert habe. Habe dadurch auch die 2 obersten zeilen vergessen:
Wenn kein Hardwarefehler vorliegt sollte es eigentlich funktionieren.
Beim PortC solltest du aber beachten, das im Auslieferzustand des
ATMega162 PC4..PC7 vom JTAG-Interface belegt sind.
>DDRC=0b11111111; //sry für diese schreibweise
veständlicher als
>PORTC = 2; //zum test>Am Anfang der ISR die Interrupts>zu blocken, um zu verhindern, dass der "wichtigere" Interrupt>unterbrochen wird?
Das cli/sei macht der AVR bei einem Interrupt automatisch.
MfG Spess
Michael M. schrieb:> Wenn ich im AVR Studio 5 ...
Sowohl das Studio5 selber, als auch die damit ausgelieferte Toolchain,
haben reichlich Bugs. Erste Maßnahme wäre also mal ein Update auf was
Aktuelles.
Es ist zum Mäusemelken....
Habe jetzt die letzte Version vom Atmega Studio 6.1 installiert, und den
Code auf das Essenziellste gekürzt, und benutze zur Sicherheit (wegen
JTAG) nur noch PORTA und PORTB.
Wieder das selbe: wähle ich als Device Atmega16 im Debugger,
funktioniert alles (ISR wird nach ca. 500 ms angesprungen), wähle ich
Atmega162 und lade das auf den Atmega162 (MLF Gehäuse) läuft das
Programm zwar (Led leuchtet) aber die ISR wird nie angesprungen. Weiß
jemand woran das liegen könnte?
Werde wohl ein Board mit einem Atmega16 rauskramen müssen, und dort mal
hochladen. Wenns dann geht, muss ic nur noch rausfinden obs am uC oder
am Programmer liegt.
1
#define F_CPU 1000000L
2
#include<avr/io.h>
3
#include<stdint.h>
4
#include<stdlib.h>
5
#include<avr/interrupt.h>
6
7
ISR(TIMER1_COMPA_vect){
8
//1 sec. timer
9
PORTA=0b00000001;
10
PORTB=0b00000011;
11
}
12
13
14
intmain(void){
15
DDRB=0xFF;
16
DDRA=0b00000001;
17
18
PORTA=0;
19
PORTB=0b00000001;
20
21
sei();
22
//time countdown (every sec.)
23
TIMSK=(1<<OCIE1A);
24
OCR1A=500;//976 for 1 sec.,CLK DIV 8 enabled => timer frequ=1.000493 Hz ~ 1 sec.
25
TCCR1B=(1<<CS12)|(1<<CS10)|(1<<WGM12);// CTC Mode, Start Timer1 with prescaler 1024
Michael M. schrieb:> Wieder das selbe: wähle ich als Device Atmega16 im Debugger,> funktioniert alles (ISR wird nach ca. 500 ms angesprungen), wähle ich> Atmega162 und lade das auf den Atmega162 (MLF Gehäuse) läuft das> Programm zwar (Led leuchtet) aber die ISR wird nie angesprungen.
Du änderst aber schon auch die Device-Einstellung des Projektes, oder?
Du kompilierst nicht für den Mega16, und lädst dann das Ergebnis auf
einen Mega162?
Stefan Ernst schrieb:> Du änderst aber schon auch die Device-Einstellung des Projektes, oder?> Du kompilierst nicht für den Mega16, und lädst dann das Ergebnis auf> einen Mega162?
Ja natürlich. Das meinte ich mit "..wähle ich Atmega162 und lade das auf
den Atmega162..."
Noch ein Versuch mit noch simpleren code und timer0 mit overflow. Leds
leuchten, aber die ISR wird nicht angesprungen...
Werde das am Abend mit einem Atmega16 und einem anderen Programmer
probieren.
Also falls es wen interessiert, so ist das ausgegangen:
Hab mal AtmelStudio 6.1 latest build installiert (danke uC.net für den
direkt download link), und nochmal probiert. Wieder das selbe. Dann hab
ich in meiner Verzweiflung den Atmega162 wieder rausgelötet (mit der
Heißluftpistole) und einen Atmega16 reingelötet. Und siehe da, alles
funktioniert! Die paar Pininkompatibilitäten konnte ich mit Leiterbahn
durchtrennen hinbiegen.
Frage mich echt was das war, allerdings war es nicht der erste Atmega
den ich bei einem großen elCtronic Versand gekauft hab, der ein Problem
hatte.