Externe Interrups ATMEGA128L

OP #2012978
Lesenswert?

Hallo Zusammen,

ich versuche jetzt schon seit einigen Tagen die externen Interrupts 
meines
ATMEGA128L-16AU im
AVR STUDIO 4.18
GCC
zum Laufen zu bringen.


Habe gemerkt, dass die externen Interrupt nicht richtig funktionieren, 
denn was auch immer ich in die Register EICRA und EICRB

(external interrupt control register a/b - dient der Einstellung der 
Aulösung - pos. Flanke, neg Flanke, GND, any log. change)

reinschreibe, der µC reagierte immer auf GND-level. Und dann halt auch 
durchgängig - main - sleep - "GND auf INT0" - ISR - ISR - ISR - ISR -... 
- "GND weg von INT0" - sleep;

Beim Abfragen der Bits im EICRA/B Reg bemerkte ich eine Art 
"Schreibschutz" - konnte die Bits nicht verändern. Habe dann mal alles 
wegkommentiert und nur eine Abfrage der Bits stehen lassen -
Initial value beider Register (A&B) ist 00000000 - Seite 84 und 85 im 
Datasheet.

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <avr/interrupt.h>
#include "usart.h"

int main(void)
{
usart_init(9600);

usart_write("SysReady\n\r");

//EICRA = 0b00000000;
// auch, wenn das einkommentiert ist das Resultat genauso

//Init_Interrupt();
// da setze ich nur die Interrupts Enable z.B. EIMSK |=(1<<INT0);
// hat aber auch keine Auswirkung auf da Reg.


if(ISC01){usart_write("ISC01==1\n\r");} // hab´s auch mit ==1 versucht
if(!ISC01){usart_write("ISC01==0\n\r");}
if(ISC00){usart_write("ISC00==1\n\r");}
if(!ISC00){usart_write("ISC00==0\n\r");}

if(ISC11){usart_write("ISC11==1\n\r");}
if(!ISC11){usart_write("ISC11==0\n\r");}
if(ISC10){usart_write("ISC10==1\n\r");}
if(!ISC10){usart_write("ISC10==0\n\r");}

if(ISC21){usart_write("ISC21==1\n\r");}
if(!ISC21){usart_write("ISC21==0\n\r");}
if(ISC20){usart_write("ISC20==1\n\r");}
if(!ISC20){usart_write("ISC20==0\n\r");}


if(ISC31){usart_write("ISC31==1\n\r");}
if(!ISC31){usart_write("ISC31==0\n\r");}
if(ISC30){usart_write("ISC30==1\n\r");}
if(!ISC30){usart_write("ISC30==0\n\r");}

// restlicher auskommentierter Code

return O;

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

TERMINALAUSGABE

ISC01=1
ISC00=0
ISC11=1
ISC10=1
ISC21=1
ISC20=1
ISC31=1
ISC30=1


Habe dazu nun folgende Fragen:

1. Ist es möglich, dass einfach meine Bit-Abfrage nicht stimmt?
2. Wie kann es passieren, dass bereits Werte im Register stehen?
3. Bin ich zu doof, dass Handbuch zu verstehen:-)
4. Gibt es Unterschiede (16AU,8AU,16MU etc.) zwischen verschiedenen 
128igern, die so etwas verursachen könnten.


Freue mich über jeden Post (auch Erziehungspost - bin µC.net Neuling)

Vielen Dank!

Grüße Chris
Gast #2013029
Lesenswert?

Hi

>@Spess: kann dir nicht ganz folgen - "ISC00...ISC30 entsprechen 0...7"?

aus der Header-Datei:

/* External Interrupt Control Register A - EICRA */
#define    ISC31        7
#define    ISC30        6
#define    ISC21        5
#define    ISC20        4
#define    ISC11        3
#define    ISC10        2
#define    ISC01        1
#define    ISC00        0


>Wie kann ich denn die Bits abfragen und an an mein Terminal schicken?

Fast so wie schon vorgeschlagen:

>Deine Abfragen müssten lauten:
>if(EICRA & ISC01)

if(EICRA & (1<<ISC01))....

Hoffentlich richtig. Kann kein C.

MfG Spess
OP #2013312
Lesenswert?

Hab´s jetzt hinbekommen die Bits abzufragen

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


unsigned char regi=0;
insigned int i=0, ii=0;

//EICRA = EICRA | 0b10010011;

for(i=1;i<129;i=i<<1,i++)
{
     if(((EICRA & i)>>ii)==1)
     regi= regi|i;
}

usart_write("\n\rERG: 0x%x\n\r", regi);


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

interessanterweise hab ich so festgestellt, dass das Register EICRA 
seinen letzten Wert immer behält!! - schreibe ich eine Zahl (im Beispiel 
0x93) ins Register und schau es mir an steht diese Zahl auch drin.
Kommentier ich das (wie oben im Code) aus und lass es dann wieder laufen 
steht immernoch 0x93 im Register.
Durch die Bitmanipulation in meinem Fall "oder", die ich ausführe, kann 
ich diese Zahl dann irgendwann nicht mehr verändern, weil nur noch 1 
drinstehen.

Vielleicht ist es zu einfach folgendes zu sagen, sieht aber doch ganz 
danach aus:

initial value: 00000000 <- Lüge!
initial value: last setted value <- Wahrheit!

Sollte es also irgendwo zu Problemen mit dem Reg kommen:

immer hart null setzten und dann beschreiben!

Grüße und vielen Dank für die Hilfe
Chris
OP #2016502
Lesenswert?

Servus!

Inzwischen hat sich das gesamte Interruptproblem geklärt!

Wie so oft, war es 3. zu doof das Datenblatt zu verstehen!


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!
http://www.mikrocontroller.net/articles/AVR_Checkliste#Besonderheiten_bei_ATmega128_und_seinen_Derivaten_im_64-Pin-Geh.C3.A4use
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!

Der Atmega128 hat die Fuse M103C. Diese ist werksseitig gesetzt und 
macht aus dem 128iger einen 103er.
Im "ATmega103 compability mode"(wie sich der Kruscht schimpft) kann man 
das Register EICRA nicht wirklich beschreiben - dass bedeutet, dass 
immer "0x00" drinsteht und der µC IMMER auf GND reagiert.

blöd blöd... aber wiedermal was gelernt!

Grüße!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren