Attiny2313 mit AVR-GCC und AVR Studio. Ich habe das Signal eines Elektretmikrofon über einen Hochpass (100n und 220k) gejagt, das über einen LM358 und dann an den INT1 eines Tiny2313. Nun möchte ich das Signal über einen Interrupt auswerten. Allerdings wird dieser manchmal zwei mal hintereinander aufgerufen. Zum Test lasse ich einfach ein Feuerzeug klicken oder klatsch über dem Mic. In der ISR habe ich Warteschleifen von insgesammt 2 Sekunden drin. Warum wird die ISR manchmal zwei mal hintereinandern aufgerufen. Habe schon versucht einfach die Kapazität des Hochpasses zu erhöhen, bin mittleriweile bei 2 uF angekommen und es bringt immer noch nichts? Kann mir da einer weiterhelfen? MFG, Rush
> Kann mir da einer weiterhelfen?
Zuerst mal ist Zeile 42 in deinem Code falsch...
Hahahahah ;-)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
sei und cli haben in einer ISR nichts zu suchen, dass macht die schon von alleine... und delays in einer ISR sind ebenfalls ganz pöhse... mach mal am Ende deiner ISR GIFR = (1<<INTF1); afaik wird das Flag ja am Anfang der ISR-Routine gelöscht, da deine jetzt so extrem lang ist, kann es ja passieren, dass ein zweiter Interrupt auftritt, durch den sofort nach dem wiederenablen der Interrupts die ISR wieder aufgerufen wird...
Wunderbar, hat geklappt. Allesdings heisst es in meinem Fall EIFR und nicht GIFR. Kann es sein dass im DS ein Schreibfehler vorliegt?! Dort steht nämlich geschrieben: Bit 7 – INTF1: External Interrupt Flag 1 When an edge or logic change on the INT1 pin triggers an interrupt request, INTF1 becomes set (one). If the I-bit in SREG and the INT1 bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT1 is configured as a level interrupt. Also auf Deutsch: Bei einer logischen Pinänderung wird INTF1 auf eins gesetzt (Voraussetzung SREG etc.) Die MCU springt dann in den Interruptvecotr und wenn diese abgearbeitet wird wird INTF1 auf null gesetzt (cleared). Alternativ kann das Bit manuell zurückgesetzt werden indem man eine logische EINS reinschreibt ?!?!?! Eine eins setzt doch das Bit wie es in den ersten Zeilen heisst?! Oder verstehe ich hier was falsch ?
Rush ... wrote: > Wunderbar, hat geklappt. Allesdings heisst es in meinem Fall EIFR und > nicht GIFR. sorry, hab aus Versehen ins Mega8 Datenblatt geschaut > Alternativ kann das Bit manuell zurückgesetzt werden indem man eine > logische EINS reinschreibt ?!?!?! > > Eine eins setzt doch das Bit wie es in den ersten Zeilen heisst?! http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intbits
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.