Forum: Mikrocontroller und Digitale Elektronik atmega8 comparator interrupt problem :?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von guest (Gast)


Lesenswert?

Hi,

ich bekomme es nicht hin das der uC einen Comparator interrupt auslöst.
an AIN1 hängt der Messpunkt, and AIN0 liegt die vergleichsspannung an.
Wenn AIN1 > als AIN0 wird sollte der interrupt auslösen...tut er aber 
nicht :/
ich habe also irgendwas vergessen...nur das comparator kapitel ist nicht 
so lang...und ich habs jetzt xmal gelesen...ich glaube nicht das ich da 
was übersehen habe
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
5
int main() {
6
      ACSR =  1<<ACIE | 0<<ACIS1;    //comparator interrupt on falling edge (AIN1 > AIN0)
7
      sei();
8
  
9
10
      DDRB =  1<<PB0;
11
      PORTB = 0<<PB0; //power on
12
      
13
      return 1;
14
    }
15
ISR(ANA_COMP_vect){
16
          PORTB = 1<<PB0;  //power off  
17
        }

Ich habe auch alle interrupt möglichkeiten durchprobiert (toggle, 
positive edge usw.)

fehlt da irgendetwas ganz offensichtliches?

:?

gruß

von tsag (Gast)


Lesenswert?

ja die Endlosschleife in main!!

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

ISR(ANA_COMP_vect)
        {
          PORTB = 0x01;  //power off
        }
int main() {
      ACSR =  1<<ACIE | 0<<ACIS1;    //comparator interrupt on falling 
edge (AIN1 > AIN0)

      DDRB =  0x01;
      PORTB = 0x00; //power on
      sei();


While(1)
{

}



    }

von guest (Gast)


Lesenswert?

ach verdammt...nach zigmal hin und herlöschen ist mir die wieder flöten 
gegangen...
daran lag/ liegt es leider aber nicht :(

von Walter (Gast)


Lesenswert?

probier mal
      ACSR =  1<<ACIE | 1<<ACIS1;    //comparator interrupt on falling 
edge (AIN1 > AIN0)

von guest (Gast)


Lesenswert?

tuts auch nicht...

ich habe eher das gefühl das etwas ganz grundlegendes nicht geht...ich 
kann nämlich machen was ich will er löst keinen interrupt aus bzw. er 
springt nicth in meinen interruptvektor.
selbst wenn ich den interruptflag per hand setze springt er nicht 
rein...ist die bezeichung des interrupts evtl. falsch? :/

[c]

ISR(ANA_COMP_vect){
          cli();
          PORTB = 1<<PB0;      //deaktiviert
          while(1);
        }

int main() {
      ACSR =  0<<ACD | 1<<ACIE | 0<<ACIS1;
      sei();
      ACSR|=1<<ACI;
      DDRB =  1<<PB0;
      PORTB = 0<<PB0;

      while(1);

      return 1;
    }

[c]
selbst so passiert nichts.
die interrupts werden in diesem fall durch jede flanke ausgelöst...oder 
auch nicht...

von guest (Gast)


Lesenswert?

ups diesen code hier angucken
1
ISR(ANA_COMP_vect){  
2
          cli();
3
          PORTB = 1<<PB0;      //deaktiviert
4
          while(1);
5
          sei();
6
        }
7
8
int main() {  
9
      ACSR =  0<<ACD | 1<<ACIE | 0<<ACIS1;    
10
      sei();
11
      
12
      DDRB =  1<<PB0;
13
      PORTB = 0<<PB0;
14
  
15
      while(1);
16
      
17
      return 1;
18
    }

von Grrrr (Gast)


Lesenswert?

Was für einen Zweck hat das while(1); in dem Interrupt? Ganz klar: Alle 
weiteren Interrupts verhindern. ;-)

von guest (Gast)


Lesenswert?

richtig genau den zweck.
damit ich sehe das der interrupt greift... tut er aber nicht...die test 
led leuchtet fröhlich weiter :(

ich hab an den positiven pin jetzt 2V angelegt und an den negativen 
hänge ich immer 5V und 0V es sollte also definitiv einen ausreichend 
großen ausschlag geben....
entweder irgendwas ist im µC kaputt oder ich bin zu blöd (ich hoffe 
letzteres)

von Grrrr (Gast)


Lesenswert?

guest schrieb:
> damit ich sehe das der interrupt greift
Dann fehlt entsprechende Hinweis dazu. Nächstes Mal mehr Infos bei 
Deiner Frage. Und mal Gross- und Kleinschreibung einsetzen. Macht sich 
gut beim lesen.

von Heiko (Gast)


Lesenswert?

Richtigen ISR-Namen vergeben? Laut avr-libc-reference ist der je nach 
Controllertyp unterschiedlich.

MfG, Heiko

von guest (Gast)


Lesenswert?

lt. dem zugehörigen datenblatt heißt der so:

ANA_COMP

das "_vect" dahinter habe ich irgendwie aus tutorials übernommen..hatte 
bis her nie probleme damit, oder ist das sogar von nöten?
weg lassen bringt aber auch keinen erfolg :(

habe in der zwischen zeit einen anderen atmega8 organisiert, mit dem 
geht es auch nicht. es muss also definitiv am code liegen.
Die spannungen liegen ebenfalls an den pins an. Schaltungsfehler sollte 
daher auch ausgeschlossen sein


gruß

von guest (Gast)


Lesenswert?

Ich bin ein bisschen weiter gekommen.
Das ganze funktioniert einwandfrei wenn ich das ganze mit if in main 
abfrage. Er springt nur nicht in den interrupt.

D.h. dann wohl das der interrupt vektor vermutlich nicht richtig ist :/
Aber der steht so im Datenblatt :?

von Grrrr (Gast)


Lesenswert?

guest schrieb:
> D.h. dann wohl das der interrupt vektor vermutlich nicht richtig ist :/
> Aber der steht so im Datenblatt :?

Ich wundere mich schon die ganze Zeit warum Du immer vom Datenblatt 
faselst.
Der Name des Vektors steht dort mit Sicherheit nicht.
Der steht in der Doku vom Compiler.

guest schrieb:
> wenn ich das ganze mit if in main
> abfrage.

Was soll das denn nun heissen:
1
if (DasGanze == AnalogSpannungIstSoUndSo) {

????????????

Zeig uns Code und eine Schaltung. Unsere Glaskugeln sind alle beim 
polieren.

von Grrrr (Gast)


Lesenswert?

Und schreib uns welchen Compiler Du benutzt und welche Version.

von guest (Gast)


Lesenswert?

compiler: avr-gcc v4.33.
schaltung ist egal. AIN0 ist eine referenzspannung. An AIN1 liegt das 
Signal an.
Das ganze funktioniert wie gesagt, nur der interrupt geht nicht
An PB0 hängt zu test-zwecken eine LED die ich an und ausschalten will.

bzgl. Datenblatt und interrupt: hm ok dachte die vector tabelle auf S. 
46 wäre das.. Vermutlich ist es nur zufall das die namen auch gleich der 
vektor Bezeichnung sind.
Habe meine aktuelle Vektorbezeichnung aber schon xmal in code Beispielen 
gefunden, von daher sollte die eigentlich richtig sein.
1
int main() {  
2
      int z;
3
      ACSR = 1<<ACIE | 1<<ACIS1 | 1<<ACIS0;
4
    
5
      DDRB =  1<<PB0;
6
            
7
      while(1){
8
        if(z=ACSR & 0x20) PORTB ^= 1<<PB0; _delay_ms(20);
9
        }
10
      
11
      return 1;
12
    }

hier das funktionierende konstrukt ohne interrupt.
ACSR wird auf das bit ACO (analog comparator output) untersucht. Das bit 
ist 1 wenn AIN0 > AIN1 (referenz > messstelle)

von Heiko (Gast)


Lesenswert?

Die Vektornamen stehen in der avr-libc-Dokumentation: 
http://www.nongnu.org/avr-libc/user-manual/modules.html - du kannst aber 
auch mal im Assembler-Code (in der main.lss) nachsehen, ob der richtige 
Vektor angesprungen wird.

MfG, Heiko

von Stefan E. (sternst)


Lesenswert?

"Interrupt wird trotz richtigen Namens nicht angesprungen" ist auch ein 
Symptom für ein paar ganz grundsätzliche Fehler beim Erzeugen des 
Programms. Also, wie sieht dein Weg vom C-Code zum Hex-File aus? Benutzt 
du eine IDE, oder ein eigenes Makefile? Poste mal den Build-Output.

von guest (Gast)


Lesenswert?

das könnte es wirklich sein :/
ich benutze eine makefile die ich mir irgendwo gezogen habe :/
ich habe vorher immer mit einer IDE gearbeitet...aber unter linux kein 
avrstudio und eclipse läuft irgendwie nicht sauber

Mit build output meinst du das hier?
1
main.elf:     file format elf32-avr
2
3
Sections:
4
Idx Name          Size      VMA       LMA       File off  Algn
5
  0 .text         000000e2  00000000  00000000  00000074  2**1
6
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
7
  1 .bss          00000002  00800060  000000e2  00000156  2**0
8
                  ALLOC
9
  2 .stab         000006b4  00000000  00000000  00000158  2**2
10
                  CONTENTS, READONLY, DEBUGGING
11
  3 .stabstr      00000054  00000000  00000000  0000080c  2**0
12
                  CONTENTS, READONLY, DEBUGGING
13
  4 .debug_aranges 00000020  00000000  00000000  00000860  2**0
14
                  CONTENTS, READONLY, DEBUGGING
15
  5 .debug_pubnames 00000031  00000000  00000000  00000880  2**0
16
                  CONTENTS, READONLY, DEBUGGING
17
  6 .debug_info   0000009e  00000000  00000000  000008b1  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  7 .debug_abbrev 0000006c  00000000  00000000  0000094f  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  8 .debug_line   0000008b  00000000  00000000  000009bb  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
  9 .debug_frame  00000030  00000000  00000000  00000a48  2**2
24
                  CONTENTS, READONLY, DEBUGGING
25
 10 .debug_str    00000070  00000000  00000000  00000a78  2**0
26
                  CONTENTS, READONLY, DEBUGGING
27
Disassembly of section .text:
28
29
00000000 <__vectors>:
30
   0:  0c 94 2a 00   jmp  0x54  ; 0x54 <__ctors_end>
31
   4:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
32
   8:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
33
   c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
34
  10:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
35
  14:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
36
  18:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
37
  1c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
38
  20:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
39
  24:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
40
  28:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
41
  2c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
42
  30:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
43
  34:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
44
  38:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
45
  3c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
46
  40:  0c 94 4f 00   jmp  0x9e  ; 0x9e <__vector_16>
47
  44:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
48
  48:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
49
  4c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
50
  50:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
51
52
00000054 <__ctors_end>:
53
  54:  11 24         eor  r1, r1
54
  56:  1f be         out  0x3f, r1  ; 63
55
  58:  cf e5         ldi  r28, 0x5F  ; 95
56
  5a:  d4 e0         ldi  r29, 0x04  ; 4
57
  5c:  de bf         out  0x3e, r29  ; 62
58
  5e:  cd bf         out  0x3d, r28  ; 61
59
60
00000060 <__do_copy_data>:
61
  60:  10 e0         ldi  r17, 0x00  ; 0
62
  62:  a0 e6         ldi  r26, 0x60  ; 96
63
  64:  b0 e0         ldi  r27, 0x00  ; 0
64
  66:  e2 ee         ldi  r30, 0xE2  ; 226
65
  68:  f0 e0         ldi  r31, 0x00  ; 0
66
  6a:  02 c0         rjmp  .+4        ; 0x70 <.do_copy_data_start>
67
68
0000006c <.do_copy_data_loop>:
69
  6c:  05 90         lpm  r0, Z+
70
  6e:  0d 92         st  X+, r0
71
72
00000070 <.do_copy_data_start>:
73
  70:  a0 36         cpi  r26, 0x60  ; 96
74
  72:  b1 07         cpc  r27, r17
75
  74:  d9 f7         brne  .-10       ; 0x6c <.do_copy_data_loop>
76
77
00000076 <__do_clear_bss>:
78
  76:  10 e0         ldi  r17, 0x00  ; 0
79
  78:  a0 e6         ldi  r26, 0x60  ; 96
80
  7a:  b0 e0         ldi  r27, 0x00  ; 0
81
  7c:  01 c0         rjmp  .+2        ; 0x80 <.do_clear_bss_start>
82
83
0000007e <.do_clear_bss_loop>:
84
  7e:  1d 92         st  X+, r1
85
86
00000080 <.do_clear_bss_start>:
87
  80:  a2 36         cpi  r26, 0x62  ; 98
88
  82:  b1 07         cpc  r27, r17
89
  84:  e1 f7         brne  .-8        ; 0x7e <.do_clear_bss_loop>
90
  86:  0e 94 49 00   call  0x92  ; 0x92 <main>
91
  8a:  0c 94 6f 00   jmp  0xde  ; 0xde <_exit>
92
93
0000008e <__bad_interrupt>:
94
  8e:  0c 94 00 00   jmp  0  ; 0x0 <__heap_end>
95
96
00000092 <main>:
97
#define cbi(var, mask)   ((var) &= (uint8_t)~(1 << mask))
98
99
100
101
volatile int z;
102
int main() {  
103
  92:  88 e0         ldi  r24, 0x08  ; 8
104
  94:  88 b9         out  0x08, r24  ; 8
105
      
106
      ACSR = 1<<ACIE | 0<<ACIS1 | 0<<ACIS0;
107
      sei();          //Allow global interrupts
108
  96:  78 94         sei
109
      
110
      DDRB =  1<<PB0;
111
  98:  81 e0         ldi  r24, 0x01  ; 1
112
  9a:  87 bb         out  0x17, r24  ; 23
113
  9c:  ff cf         rjmp  .-2        ; 0x9c <main+0xa>
114
115
0000009e <__vector_16>:
116
      while(1);
117
      return 1;
118
    }
119
120
ISR(ANA_COMP_vect)        
121
{
122
  9e:  1f 92         push  r1
123
  a0:  0f 92         push  r0
124
  a2:  0f b6         in  r0, 0x3f  ; 63
125
  a4:  0f 92         push  r0
126
  a6:  11 24         eor  r1, r1
127
  a8:  8f 93         push  r24
128
  aa:  9f 93         push  r25
129
        
130
        if(z=ACSR & 0x20)   PORTB = 0<<PB0;
131
  ac:  88 b1         in  r24, 0x08  ; 8
132
  ae:  90 e0         ldi  r25, 0x00  ; 0
133
  b0:  80 72         andi  r24, 0x20  ; 32
134
  b2:  90 70         andi  r25, 0x00  ; 0
135
  b4:  90 93 61 00   sts  0x0061, r25
136
  b8:  80 93 60 00   sts  0x0060, r24
137
  bc:  80 91 60 00   lds  r24, 0x0060
138
  c0:  90 91 61 00   lds  r25, 0x0061
139
  c4:  89 2b         or  r24, r25
140
  c6:  11 f0         breq  .+4        ; 0xcc <__vector_16+0x2e>
141
  c8:  18 ba         out  0x18, r1  ; 24
142
  ca:  02 c0         rjmp  .+4        ; 0xd0 <__vector_16+0x32>
143
          else     PORTB =1<<PB0;
144
  cc:  81 e0         ldi  r24, 0x01  ; 1
145
  ce:  88 bb         out  0x18, r24  ; 24
146
        }
147
  d0:  9f 91         pop  r25
148
  d2:  8f 91         pop  r24
149
  d4:  0f 90         pop  r0
150
  d6:  0f be         out  0x3f, r0  ; 63
151
  d8:  0f 90         pop  r0
152
  da:  1f 90         pop  r1
153
  dc:  18 95         reti
154
155
000000de <_exit>:
156
  de:  f8 94         cli
157
158
000000e0 <__stop_program>:
159
  e0:  ff cf         rjmp  .-2        ; 0xe0 <__stop_program>

von Stefan E. (sternst)


Lesenswert?

guest schrieb:
> Mit build output meinst du das hier?

Nein, eigentlich nicht. Aber das ist auch gut, und zeigt, dass du den 
Code nicht für einen Mega8 gelinkt hast. Der hat nämlich 1-Word 
Vektoren, während der erzeuge Code 2-Word Vektoren enthält.

Lass dir das Makefile doch einfach von MFile erstellen.

von guest (Gast)


Lesenswert?

Danke!!!
das war das problem :)

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
Noch kein Account? Hier anmelden.