externer Interrupt

Gast #680023
Lesenswert?

Hi
tut mir Leid wenn ich euch schon wieder mit sehr einfachen Frage quäle:
Ich programmiere mit einem AT90CAN128 auf einem DVK90CAN1. Ich will die 
Tasten ansteuern damit z.B.: die Leds damit aus und eingeschalten 
werden.
In der manual vom Board hab ich gelesen das die Tasten einen externen 
Interrupt aulösen. INT7 - INT4. Leider springt mir das Programm nicht in 
die ISR. Ihr könnt ihr mir sicher helfen.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
ISR(INT7_vect){
5

6
PORTA = 0xFF;
7

8
}//end isr int7 
9

10
int main(){
11
DDRA = 0xFF;//direction for LEDs are output
12
DDRE = 0xFF;//direction is ouput
13
PINE = 0xFF;//PINE are set 1
14
EIMSK = 0xF0;//Interrupt for INT7 to INT 4 are available
15
EICRB = 0x00;//interrupt for INT7-INT4 are lowLevel
16
SREG = 0x80;//global Interrupt are available
17

18

19

20
for(;;);//endloschleife
21

22
return(0);
23
}//end main
Gast #680033
Lesenswert?

Ausserdem ist dein Programmierstil etwas unübersichtlich. Probier doch 
mal folgendes:
1
EIMSK |= (1<<INT4) | (1<<INT5) | (1<<INT6) | (1<<INT7);
2
EICRB &= ((1<<ISC40) | (1<<ISC41) | ...);
3
SREG |= (1<<I);
Das ist zwar etwas aufwendiger, erleichtert es aber zu verstehen, was 
genau programmiert ist.
Gast #680037
Lesenswert?

Ich würde EICRB nich auf  low-level, sonder auf fallende Flanke 
implementieren (Datenblatt Seite 94, Table 10-3)
also:
1
EICRB &= ((1<<ISC40) | (1<<ISC50) | (1<<ISC60) |( 1<<ISC70));
2
EICRB |= (1<<ISC41) | (1<<ISC51) | (1<<ISC61) | (1<<ISC71);

Hast Du den Taster entprellt?
Gast #680053
Lesenswert?

also mit dem & operator setz ich eine 1 und mit dem ODER-Operator 
schreib ich eine 0 ins Registerbit
Was heisst die Tasten entprellt?? Das komplette Programm was ich 
geschrieben habe hab ich eh im ersten Beitrag geschrieben.
Offensichtlich ist das Tastenansteuern nicht so einfach wie ich dachte.
Gast #680059
Lesenswert?

Sorry, wenn ich Dich jetzt verwirre, aber oben hab ich noch einen 
kleinen Fehler gemacht.
Es heisst nicht
1
EICRB &= ((1<<ISC40) | (1<<ISC41) | ...);
sondern jeweils
1
EICRB &= ~((1<<ISC40) | (1<<ISC41) | ...);

Ich hab das ~ vergessen.

Tasten entprellen: Entprellung
#680080
Lesenswert?

Dazu eine Frage an die Allgemeinheit:

Warum liest man nichts mehr von sei();? Ist das im StartupCode vom GCC 
schon drin?

An der OP:
Programcode zu schreiben, den eine Maschine versteht, kann jeder. Die 
Kunst liegt darin, den Code auch für den Menschen verständlich und 
wartbar zu halten.
Gast #680107
Lesenswert?

Ich hab da noch eine andere Frage die nicht so ganz zum Thema passt. 
Wenn ich mit dem Input Capture arbeite und mit die Periodendauer eines 
Rechtecksignals ausrechen will. Auf welchen Bus muss das signal anliegen 
das das funktioniert. Ich hab in der Manual nur immer 8-Bit Bus gelesen.
#680127
Lesenswert?

crazy horse wrote:
> @Johannes:
> Das kan man nicht so allgemein behaupten.
> CodeVision macht daraus:
> 82 SREG |= (1<<I);
> 000a2 9478        BSET 7
OK, wenn CodeVision das hinbekommt... Der AVR-GCC machts nicht. Und 
bevor man jedes mal erst ins Assembler-Listing schauen muss, um zu 
erfahren, was der Compiler da wirklich draus macht, schreibt man doch 
besser gleich die richtige Anweisung hin, aus der der Compiler mit 
Sicherheit den korrekten Assembler-Code macht (OK, in CodeVision gibt es 
die "Funktion" sei() nicht, da muss man eh #asm("sei") schreiben...)

Abgesehen davon halte ich es sowieso für unsinnig, so einen Ausdruck da 
hinzuschreiben, wenn es kürzer und prägnanter geht...
#680132
Lesenswert?

Niels Hüsken wrote:
> Ok, ich hab aber verstanden. Die Wirkung ist die selbe...
Nö, ist sie nicht. Das merkst Du spätestens dann, wenn Du die Interrupts 
*de*aktivieren möchtest und das eben drei Befehle braucht anstatt einen. 
Zugegeben: beim sei (also bei der Freigabe) ist es i.d.R. wirklich 
unkritisch, aber zumindest beim cli kann es zu unerwünschten 
Nebeneffekten kommen (natürlich auch nur in Ausnahmefällen, aber 
immerhin, warum sich was unsinniges angewöhnen)...

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