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ß
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)
{
}
}
Datum:
ach verdammt...nach zigmal hin und herlöschen ist mir die wieder flöten gegangen... daran lag/ liegt es leider aber nicht :(
Datum:
probier mal
ACSR = 1<<ACIE | 1<<ACIS1; //comparator interrupt on falling
edge (AIN1 > AIN0)
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...
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;
}
|
Datum:
Was für einen Zweck hat das while(1); in dem Interrupt? Ganz klar: Alle weiteren Interrupts verhindern. ;-)
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)
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.
Datum:
Richtigen ISR-Namen vergeben? Laut avr-libc-reference ist der je nach Controllertyp unterschiedlich. MfG, Heiko
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ß
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 :?
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.
Datum:
Und schreib uns welchen Compiler Du benutzt und welche Version.
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)
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
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.
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> |
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.