Hallo,
gibt es jemanden, der die AVR Studio version 6.0.1843 installiert hat?
Ich versuche schon seit geraumer Zeit den folgenden Code zum Laufen zu
bringen.
Der Timer von meinem ATmega644 soll einfach nur bei einer steigenden
Flanke in eine Interruptroutine springen, was er aber nicht will!
Wenn ich in der Simulation den ICP Pin auf high setze, wird zwar das
ICF1 Capture Flag gesetzt aber er springt nicht in die ISR Routine. Was
ist da los?
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
volatileintb;
5
6
intmain(void)
7
{
8
9
TCCR1A=0;// normal mode, keine PWM Ausgänge
10
TCCR1B=(1<<CS10)// start Timer mit Systemtakt
11
+(1<<ICES1);// steigende Flanke auswählen
12
TIMSK1=(1<<TOIE1)+(1<<ICIE1);// overflow und Input-capture
> TIMSK1 = (1<<TOIE1) + (1<<ICIE1);
Sollte der Syntax nicht wie folgt aussehen:
TIMSK1 = (1<<TOIE1)|(1<<ICIE1);
Überschreibt die Einstellung des Timers das DDR Register, eventuell
musst du dich darum kümmern?
Habs grade nochmal gecheckt. Das DDR Register ist nach der
Initialisierung des Timers unverändert. Alles Pins sind als Eingänge
festgelegt. Und das entspr. Flag wird ja auch gesetzt! Das ist ja das
komische. Es wird das ICF1 Flag gesetzt aber nicht die Interrputroutine
angesprungen.
MandA K. schrieb:> Das ist ja das komische.
Noch komischer ist die Einstellung der Register. Alles, was da passiert,
ist Zufall.
error schrieb:>> TIMSK1 = (1<<TOIE1) + (1<<ICIE1);> Sollte der Syntax nicht wie folgt aussehen:> TIMSK1 = (1<<TOIE1)|(1<<ICIE1);
Wenigstens. Besser noch:
TIMSK1 |= (1<<TOIE1)|(1<<ICIE1);
mfg.
Thomas Eckmann schrieb:> Wenigstens. Besser noch:> TIMSK1 |= (1<<TOIE1)|(1<<ICIE1);
Hmm, eher nicht. Wenn man initialisiert und Register in einem
definierten Zustand haben möchte, wird man nicht verodern, eine
Zuweisung per = ist da schon richtig.
Denn wenn z.B. Bootlader Register vorgelegt hat, sucht man sich mit 'ner
Veroderung 'nen Wolf.
MWS schrieb:> Hmm, eher nicht. Wenn man initialisiert und Register in einem> definierten Zustand haben möchte, wird man nicht verodern, eine> Zuweisung per = ist da schon richtig.
Daß du deinen Besserwissersenf wieder dazugeben musst, war ja nicht
anders zu erwarten.
mfg.
Ich schmeiß gleich meinen Laptop aus dem Fenster. Das kann doch nicht
sein! Ich will doch einfach nur auf einen blöden externen pin triggern!
Der Code ist doch nicht groß. Könnte das mal jemand exemplarisch selbst
schreiben?
Ich weis nicht, was ich noch machen soll.
MandA K. schrieb:> Ich schmeiß gleich meinen Laptop aus dem Fenster.
Ruhiger du werden musst, junger Padavan, dann der Fehler sich finden
wird, von selbst.
Ingo
Naja...der ganze code steht schon oben. Der 2. Interrupt ist der
Overflow vom Timer, aber ich gehe von dem Zustand aus, der der Timer
erst garnicht zum Overflowen kommt.
Was passiert denn, wenn jemand den Code bei sich rein kopiert und PIND6
auf high setzt. Vlt liegt es an meine PC.
Ich geb mir schon große Mühe, das Fenster zu zu lassen!
Ähm, kannst nicht testen, hab kein AVR-Studio.
Weiß nicht, was passiert, wenn der Simulator keine ISR findet.
Keine Ahnung, ob der Simulator "richtig" funktioniert. Ich hab schon von
Fehlern gehört.
ICF1 Capture Flag gesetzt aber er springt nicht in die ISR Routine.
Wenn das Flag gesetzt wird, sollte der Interrupt normalerweise ja auf
dem MC dann auslösen. Funktioniert dein sei();, wird damit das I-Bit im
SREG gesetzt?? Sonst lads mal auf nen MC und schau, obs dort läuft.
Am PC wirds wohl nicht legen, höchstens am Simulator
Viel Erfolg
Hallo
Hab es gerade mit der alten AVRStudio4 (4.17) ausprobiert. Da
funktioniert es mit dem Simulator wenn ich PIND6 setze oder das ICF1
Flag im TIFR1 Register setze. Allerdings musste ich das TOIE1 Flag raus
nehmen, da ja kein Einsprungvector da ist und das kurze Programm dadurch
ständig einen Reset gemacht hat.
Gruß Steffen
Mein Leben ist wieder lebenswert! Ich werde umgehend eine mail an Atmel
verfassen. Vlt. ändern die nochmal was in ihrer Version.
Dann muss ich nun wohl oder übel mit der 4.17ner Version hantieren!
Nochmal vielen Dank. Ihr wollt nicht wissen, wie lange mich dieser Mist
schon aufhält.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.