www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik atmega8 comparator interrupt problem :?


Autor: guest (Gast)
Datum:

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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

int main() {
      ACSR =  1<<ACIE | 0<<ACIS1;    //comparator interrupt on falling edge (AIN1 > AIN0)
      sei();
  

      DDRB =  1<<PB0;
      PORTB = 0<<PB0; //power on
      
      return 1;
    }
ISR(ANA_COMP_vect){
          PORTB = 1<<PB0;  //power off  
        }

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

fehlt da irgendetwas ganz offensichtliches?

:?

gruß
Autor: tsag (Gast)
Datum:

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)
{

}



    }
Autor: guest (Gast)
Datum:

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

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

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...
Autor: guest (Gast)
Datum:

ups diesen code hier angucken
ISR(ANA_COMP_vect){  
          cli();
          PORTB = 1<<PB0;      //deaktiviert
          while(1);
          sei();
        }

int main() {  
      ACSR =  0<<ACD | 1<<ACIE | 0<<ACIS1;    
      sei();
      
      DDRB =  1<<PB0;
      PORTB = 0<<PB0;
  
      while(1);
      
      return 1;
    }
Autor: Grrrr (Gast)
Datum:

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

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)
Autor: Grrrr (Gast)
Datum:

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.
Autor: Heiko (Gast)
Datum:

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

MfG, Heiko
Autor: guest (Gast)
Datum:

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ß
Autor: guest (Gast)
Datum:

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 :?
Autor: Grrrr (Gast)
Datum:

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:
if (DasGanze == AnalogSpannungIstSoUndSo) {

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

Zeig uns Code und eine Schaltung. Unsere Glaskugeln sind alle beim
polieren.
Autor: Grrrr (Gast)
Datum:

Und schreib uns welchen Compiler Du benutzt und welche Version.
Autor: guest (Gast)
Datum:

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.
int main() {  
      int z;
      ACSR = 1<<ACIE | 1<<ACIS1 | 1<<ACIS0;
    
      DDRB =  1<<PB0;
            
      while(1){
        if(z=ACSR & 0x20) PORTB ^= 1<<PB0; _delay_ms(20);
        }
      
      return 1;
    }

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)
Autor: Heiko (Gast)
Datum:

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
Autor: Stefan Ernst (sternst)
Datum:

"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.
Autor: guest (Gast)
Datum:

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?

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000000e2  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00000002  00800060  000000e2  00000156  2**0
                  ALLOC
  2 .stab         000006b4  00000000  00000000  00000158  2**2
                  CONTENTS, READONLY, DEBUGGING
  3 .stabstr      00000054  00000000  00000000  0000080c  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_aranges 00000020  00000000  00000000  00000860  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_pubnames 00000031  00000000  00000000  00000880  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_info   0000009e  00000000  00000000  000008b1  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_abbrev 0000006c  00000000  00000000  0000094f  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_line   0000008b  00000000  00000000  000009bb  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_frame  00000030  00000000  00000000  00000a48  2**2
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    00000070  00000000  00000000  00000a78  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:  0c 94 2a 00   jmp  0x54  ; 0x54 <__ctors_end>
   4:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
   8:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
   c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  10:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  14:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  18:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  1c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  20:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  24:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  28:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  2c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  30:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  34:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  38:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  3c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  40:  0c 94 4f 00   jmp  0x9e  ; 0x9e <__vector_16>
  44:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  48:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  4c:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>
  50:  0c 94 47 00   jmp  0x8e  ; 0x8e <__bad_interrupt>

00000054 <__ctors_end>:
  54:  11 24         eor  r1, r1
  56:  1f be         out  0x3f, r1  ; 63
  58:  cf e5         ldi  r28, 0x5F  ; 95
  5a:  d4 e0         ldi  r29, 0x04  ; 4
  5c:  de bf         out  0x3e, r29  ; 62
  5e:  cd bf         out  0x3d, r28  ; 61

00000060 <__do_copy_data>:
  60:  10 e0         ldi  r17, 0x00  ; 0
  62:  a0 e6         ldi  r26, 0x60  ; 96
  64:  b0 e0         ldi  r27, 0x00  ; 0
  66:  e2 ee         ldi  r30, 0xE2  ; 226
  68:  f0 e0         ldi  r31, 0x00  ; 0
  6a:  02 c0         rjmp  .+4        ; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
  6c:  05 90         lpm  r0, Z+
  6e:  0d 92         st  X+, r0

00000070 <.do_copy_data_start>:
  70:  a0 36         cpi  r26, 0x60  ; 96
  72:  b1 07         cpc  r27, r17
  74:  d9 f7         brne  .-10       ; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
  76:  10 e0         ldi  r17, 0x00  ; 0
  78:  a0 e6         ldi  r26, 0x60  ; 96
  7a:  b0 e0         ldi  r27, 0x00  ; 0
  7c:  01 c0         rjmp  .+2        ; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
  7e:  1d 92         st  X+, r1

00000080 <.do_clear_bss_start>:
  80:  a2 36         cpi  r26, 0x62  ; 98
  82:  b1 07         cpc  r27, r17
  84:  e1 f7         brne  .-8        ; 0x7e <.do_clear_bss_loop>
  86:  0e 94 49 00   call  0x92  ; 0x92 <main>
  8a:  0c 94 6f 00   jmp  0xde  ; 0xde <_exit>

0000008e <__bad_interrupt>:
  8e:  0c 94 00 00   jmp  0  ; 0x0 <__heap_end>

00000092 <main>:
#define cbi(var, mask)   ((var) &= (uint8_t)~(1 << mask))



volatile int z;
int main() {  
  92:  88 e0         ldi  r24, 0x08  ; 8
  94:  88 b9         out  0x08, r24  ; 8
      
      ACSR = 1<<ACIE | 0<<ACIS1 | 0<<ACIS0;
      sei();          //Allow global interrupts
  96:  78 94         sei
      
      DDRB =  1<<PB0;
  98:  81 e0         ldi  r24, 0x01  ; 1
  9a:  87 bb         out  0x17, r24  ; 23
  9c:  ff cf         rjmp  .-2        ; 0x9c <main+0xa>

0000009e <__vector_16>:
      while(1);
      return 1;
    }

ISR(ANA_COMP_vect)        
{
  9e:  1f 92         push  r1
  a0:  0f 92         push  r0
  a2:  0f b6         in  r0, 0x3f  ; 63
  a4:  0f 92         push  r0
  a6:  11 24         eor  r1, r1
  a8:  8f 93         push  r24
  aa:  9f 93         push  r25
        
        if(z=ACSR & 0x20)   PORTB = 0<<PB0;
  ac:  88 b1         in  r24, 0x08  ; 8
  ae:  90 e0         ldi  r25, 0x00  ; 0
  b0:  80 72         andi  r24, 0x20  ; 32
  b2:  90 70         andi  r25, 0x00  ; 0
  b4:  90 93 61 00   sts  0x0061, r25
  b8:  80 93 60 00   sts  0x0060, r24
  bc:  80 91 60 00   lds  r24, 0x0060
  c0:  90 91 61 00   lds  r25, 0x0061
  c4:  89 2b         or  r24, r25
  c6:  11 f0         breq  .+4        ; 0xcc <__vector_16+0x2e>
  c8:  18 ba         out  0x18, r1  ; 24
  ca:  02 c0         rjmp  .+4        ; 0xd0 <__vector_16+0x32>
          else     PORTB =1<<PB0;
  cc:  81 e0         ldi  r24, 0x01  ; 1
  ce:  88 bb         out  0x18, r24  ; 24
        }
  d0:  9f 91         pop  r25
  d2:  8f 91         pop  r24
  d4:  0f 90         pop  r0
  d6:  0f be         out  0x3f, r0  ; 63
  d8:  0f 90         pop  r0
  da:  1f 90         pop  r1
  dc:  18 95         reti

000000de <_exit>:
  de:  f8 94         cli

000000e0 <__stop_program>:
  e0:  ff cf         rjmp  .-2        ; 0xe0 <__stop_program>

Autor: Stefan Ernst (sternst)
Datum:

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.
Autor: guest (Gast)
Datum:

Danke!!!
das war das problem :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net