mikrocontroller.net

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


Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#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:

Bewertung
0 lesenswert
nicht 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)
{

}



    }

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heiko (Gast)
Datum:

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

MfG, Heiko

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :?

Autor: Grrrr (Gast)
Datum:

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

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

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

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und schreib uns welchen Compiler Du benutzt und welche Version.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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:

Bewertung
0 lesenswert
nicht 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.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.