Interrupt frågor AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Jo, men grejen är den att hårdvaran fungerar när jag använder polling.

Testade nu och den kommer aldrig in i interrupten.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Om du includera
#include <avr/signal.h> ska det fungera..
Tydligen så complilera det men intrupt vectorn ändras inte
du kan enkelt se hur kompilatorn har gjort genom att kolla i .lss filen
exempel:

Kod: Markera allt

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000000dc  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  000000dc  00000170  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000001  00800060  00800060  00000170  2**0
                  ALLOC
  3 .noinit       00000000  00800061  00800061  00000170  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  00000170  2**0
                  CONTENTS
  5 .debug_aranges 00000014  00000000  00000000  00000170  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_pubnames 0000004d  00000000  00000000  00000184  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_info   000000d7  00000000  00000000  000001d1  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_abbrev 000000a1  00000000  00000000  000002a8  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_line   000000e5  00000000  00000000  00000349  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    0000008a  00000000  00000000  0000042e  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54
   4:	0c 94 45 00 	jmp	0x8a
   8:	0c 94 45 00 	jmp	0x8a
   c:	0c 94 45 00 	jmp	0x8a
  10:	0c 94 45 00 	jmp	0x8a
  14:	0c 94 45 00 	jmp	0x8a
  18:	0c 94 45 00 	jmp	0x8a
  1c:	0c 94 45 00 	jmp	0x8a
  20:	0c 94 45 00 	jmp	0x8a
  24:	0c 94 45 00 	jmp	0x8a
  28:	0c 94 45 00 	jmp	0x8a
  2c:	0c 94 51 00 	jmp	0xa2 <-- här ska den hoppa till INTERRUPT (SIG_USART_RECV) och syns på addresen :)
  30:	0c 94 45 00 	jmp	0x8a
  34:	0c 94 45 00 	jmp	0x8a
  38:	0c 94 45 00 	jmp	0x8a
  3c:	0c 94 45 00 	jmp	0x8a
  40:	0c 94 45 00 	jmp	0x8a
  44:	0c 94 45 00 	jmp	0x8a
  48:	0c 94 45 00 	jmp	0x8a
  4c:	0c 94 45 00 	jmp	0x8a
  50:	0c 94 45 00 	jmp	0x8a

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:	ec ed       	ldi	r30, 0xDC	; 220
  68:	f0 e0       	ldi	r31, 0x00	; 0
  6a:	02 c0       	rjmp	.+4      	; 0x70

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

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

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

00000080 <.do_clear_bss_start>:
  80:	a1 36       	cpi	r26, 0x61	; 97
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e
  86:	0c 94 64 00 	jmp	0xc8

0000008a <__bad_interrupt>:
  8a:	0c 94 00 00 	jmp	0x0

0000008e <USART_init>:
#define MYUBRR ((FOSC/16)/BAUD-1)
void USART_init (unsigned int);
volatile uint8_t senaste_vardet;

void USART_init (unsigned int ubrr){
  8e:	9c 01       	movw	r18, r24
   /*set budrate*/
   UBRRH = (unsigned char)(ubrr>>8);
  90:	83 2f       	mov	r24, r19

  92:	99 27       	eor	r25, r25
  94:	80 bd       	out	0x20, r24	; 32
   UBRRL = (unsigned char)ubrr;
  96:	29 b9       	out	0x09, r18	; 9
   /*Enable receiver and transmitter*/
   UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXEN);
  98:	88 e9       	ldi	r24, 0x98	; 152
  9a:	8a b9       	out	0x0a, r24	; 10
   /*set frameformat : 8 databits 1 stop bits*/
   UCSRC = (1<<URSEL) |(1<<USBS) | (3<<UCSZ0);
  9c:	8e e8       	ldi	r24, 0x8E	; 142
  9e:	80 bd       	out	0x20, r24	; 32
  a0:	08 95       	ret

000000a2 <__vector_11>:

}


INTERRUPT (SIG_USART_RECV)
{
  a2:	78 94       	sei
  a4:	1f 92       	push	r1
  a6:	0f 92       	push	r0
  a8:	0f b6       	in	r0, 0x3f	; 63
  aa:	0f 92       	push	r0
  ac:	11 24       	eor	r1, r1
  ae:	8f 93       	push	r24
	senaste_vardet = UDR;
  b0:	8c b1       	in	r24, 0x0c	; 12
  b2:	80 93 60 00 	sts	0x0060, r24
	UDR = senaste_vardet;
  b6:	80 91 60 00 	lds	r24, 0x0060
  ba:	8c b9       	out	0x0c, r24	; 12
  bc:	8f 91       	pop	r24
  be:	0f 90       	pop	r0
  c0:	0f be       	out	0x3f, r0	; 63
  c2:	0f 90       	pop	r0
  c4:	1f 90       	pop	r1
  c6:	18 95       	reti

000000c8 <main>:
}


int main (void){
  c8:	cf e5       	ldi	r28, 0x5F	; 95
  ca:	d4 e0       	ldi	r29, 0x04	; 4
  cc:	de bf       	out	0x3e, r29	; 62
  ce:	cd bf       	out	0x3d, r28	; 61

	USART_init (MYUBRR);
  d0:	8c e0       	ldi	r24, 0x0C	; 12
  d2:	90 e0       	ldi	r25, 0x00	; 0
  d4:	0e 94 47 00 	call	0x8e
	sei();
  d8:	78 94       	sei
	for (;;){
  da:	ff cf       	rjmp	.-2      	; 0xda
somsagt SIGNAL är bättre att använda än INTERRUPT...
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

JAAA, signal.h fixade biffen :D :D

Tack erixon och alla andra :)
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Hmm, kul fel. Samma mystiska fel inträffar också om man har råkat stava fel på någon interrupts namn. Inte så där jätteenkelt att hitta det felet när kompilatorn inte klagar. De här konstigheterna borde definitivt fixas!

inb() och outb() har sedan länge varit deprecated (vad säger man på svenska?).
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Ja du, gör sig nog bäst i svengelsk form ändå ;)
Lexikonet säger:
Engelskt uppslagsord
deprecate (ej i progressiv form)

Svensk översättning
ta avstånd från; skarpt ogilla; beklaga {formellt} (verb; transitivt)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Kör ni med -Wall och kompilatorn klagar ändå inte?

Mvh
speakman
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Ja det spelar ingen roll -Wall med eller utan
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Vilken miss av gcc!
Ordinare gcc (ix86) klagar då på minsta detalj. :D

Mvh
speakman
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Nu skulle jag behöva en knuff i rätt riktning(om det finns).
Det är så att jag skulle behöva en lång delay på flera minuter, upp mot 10-15 min... Men jag vill ju helst inte ha någon "busy waiting" som tar upp hela processorkraften. Så kan man lösa detta med Timer som ger interrupt efter angiven tid? Och en fråga till, jag vill kunna ändra tiden mha att skicka en ny tid via usarten, är det no probs eller är det jättesvårt?

Behöver mest en knuff i rätt riktning och få veta att det inte är några större problem.(jag e inte sååå vass på det här som ni säkert märkt, men jag skall bli....) :D

EDIT: Hittade en appnote (AVR 133) som är för AT90, men borde vara viss hjälp för min atmega.Förslag fortfarande intressanta...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

(Har inte kört AVR, men det kan knappast vara någon skillnad...)

- Sätt upp en timer för avbrott t.ex varje sekund.

- Fixa en "klock rutin" som räknar sekunder och jämför med
ett eller flera värden då det skall "hända något".

- Låt din USART rutin skriva nya värden till klock rutinen vid behov.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Eller kör en separat oscillator på 32768Hz på en interruptpinne, och räkna ner därifrån. Så blir det mindre interrupt, och processorn kan sättas i viloläge under längre tider.

Mvh
speakman
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du menar "oscillator på 32768Hz på en timer ingång" ??

Blir det inte väldigt många interrupt med 32Khz på en interrupt-ingång ?
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

jag lyckades, nu kan man lite om timer med :). (följde sodjans förslag)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Phu! Utan att ens ha sett en AVR IRL, som ungarna brukar säga... :-) :-)

Men det är klart, detta hade väll fungerat likadant på i stort sätt vilkan processor som helst, antar jag...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Hm, jag har inte varit bortskämd med timeringångar tidigare. ;)
Men det lät iaf som ett bätte förslag! :D

Mvh
speakman
Skriv svar