WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Simulationen > Home Cockpit - Das Forum für die "Bastler"

Home Cockpit - Das Forum für die "Bastler" Cockpitbauer tauschen Pläne, Erfahrungen, Meinungen über den Bau von Homecockpits aus...

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 21.04.2007, 19:04   #1
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard AVR-Interrupts in C

Habe mich mal wieder an die Elektronik gesetzt und Promt das nächste Problem:
AVR-Studio, ATmega8535
Ich möchte ein kleines Versuchsprogramm haben, dass alle 5000Takte den PortB um einen runterzählt und bei PIND2 per Interrupt PORTB auf 0x00 setzt.
Klappt natürlich nicht, ich denke ich habe die Geschichte mit den Interrupts noch nicht 100%ig verstanden, werde aus diversen Tutorials auch nicht wirklich schlau was jetzt genau wo hin muss.
Hier mal mein Text

-----------------------------------------
#include <AVR/io.h>
#include <avr/interrupt.h>


int main (void) {

int i;

DDRB=0xff;
PORTB=0xff;

GIFR=(1<<INTF0);
MCUCR =((1<<ISC01)|(1<<ISC00));
sei();

while(1) {


while(i<5000) i++;
PORTB--;
i=0;


SIGNAL (SIG_INT0)
{
PORTB=0;
}


}

return(0);
}
-----------------------------------------

Was mach ich falsch?
philharmony ist offline   Mit Zitat antworten
Alt 21.04.2007, 20:25   #2
Bastian
Elite
 
Registriert seit: 19.06.2000
Alter: 39
Beiträge: 1.015


Bastian eine Nachricht über ICQ schicken
Standard

Versteh ich das richtig das du Port B bei einem externen Interrupt an Pin D2 auf 0 setzen willst?

Grüße
Bastian
Bastian ist offline   Mit Zitat antworten
Alt 21.04.2007, 20:47   #3
AlTonno
Master
 
Registriert seit: 22.08.2003
Alter: 37
Beiträge: 623


Standard

Wie ist denn der INT0 extern beschalten (Taster/Pullup?) bzw. wie sind den die Pegel an dem Pin so?

Die Interrupt-Routine würde ich übrigens aus dem main rausverfrachten, villeicht mag das dein compiler so nicht...


lg
____________________________________
beste grüße,
Christopher Haus-Air =)
---------------------
w w w . s i m - m o d u l e s . a t
[ Avionic Kits for Flight Simulation ]
---------------------
VISIT
www.HAUS-AIR.at
Der einfachste Weg, sich selbst schnell mal ein Cockpit zu basteln...
AlTonno ist offline   Mit Zitat antworten
Alt 21.04.2007, 21:23   #4
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard

Habe es bis jetzt nur im AVRstudio simuliert.
Das Prog soll von sich aus Runterzählen(an PortB) und ihn auf Interrupt von PIND2 auf 0 setzen.
Ich verstehe den Syntax der Interrupts noch nicht so ganz.
Vllt könnte jmd meinen Text exemplarisch mal so umstellen wie es funktionieren müsste...
LG
philharmony ist offline   Mit Zitat antworten
Alt 22.04.2007, 00:12   #5
dirkan
Master
 
Registriert seit: 14.02.2002
Alter: 66
Beiträge: 644


Standard

Hallo,

// Beispiel für einen Timer Interrupt:
int cnt = 0;

int main( void )
{
TIMSK |= BV(TOIE0); // Enable timer interrupt
sei(); // Enable global interrupt flag

for (;; // Loop forever oder mache hier irgendwas
}

// Diese Funktion wird bei overrun timer counter aufgerufen
SIGNAL (SIG_OVERFLOW0)
{
PORTB = ++cnt;
}

Das geht mit allen anderen Interrupts ähnlich.
1. Das richtige enable bit setzen
2. Die SIGNAL oder INTERRUPT Fumktion schreiben SIG_ ist für
jeden Interupt unterschiedlich deklariert.

Beachten: bei vielen Ints muss das dazugehörende Register gelesen
werden (RTFM)

Bei verwendung von INTERRUPT anstatt SIGNAL können verschachtelte Interrupts auftreten. Fang mit SIGNAL an und langsam rantasten,
dann wird das schon gehen.

Viel Erfolg

Dirk
dirkan ist offline   Mit Zitat antworten
Alt 22.04.2007, 12:34   #6
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard

Hi Dirk,

Zitat:
Beachten: bei vielen Ints muss das dazugehörende Register gelesen werden
Genau da fängt mein Problem an, ich werd aus dem Manual da nicht schlau.
Welche Register muss ich wie und mit welcher Syntax setzen?

GIFR=(1<<INTF0) bedeutet doch, im Global Interrupt Flag Register den INTF0 auf 1 setzen oder?



EDIT:
mit

Zitat:
#include <AVR/io.h>
#include <avr/interrupt.h>

int main (void) {

int i;

DDRB=0xff;
PORTB=0xff;

GIFR=(1<<INTF0);
GICR=(1<<INT0);
MCUCR =((1<<ISC01)|(1<<ISC00));
sei();

while(1)
{

while(i<50) i++;
PORTB--;
i=0;

}
return(0);
}


SIGNAL (SIG_INT0)
{
PORTB=0x00;
}


Geht es, würde es aber Zufallstreffer nennen, habs noch nicht wirklich verstanden...
philharmony ist offline   Mit Zitat antworten
Alt 22.04.2007, 12:59   #7
AlTonno
Master
 
Registriert seit: 22.08.2003
Alter: 37
Beiträge: 623


Standard

// EDIT:

klar, das Bit ist wichtig - "External Interrupt Request 0 Enable"... ohne dem geht natürlich gar nichts


lg
Chris
____________________________________
beste grüße,
Christopher Haus-Air =)
---------------------
w w w . s i m - m o d u l e s . a t
[ Avionic Kits for Flight Simulation ]
---------------------
VISIT
www.HAUS-AIR.at
Der einfachste Weg, sich selbst schnell mal ein Cockpit zu basteln...
AlTonno ist offline   Mit Zitat antworten
Alt 22.04.2007, 13:36   #8
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard

Oh man, diese Controller rauben mir noch den letzten Nerv, hab grad das Gefühl, je mehr ich darüber lese und damit mache, desto weniger verstehe ich letztendlich...

Ich habe jetzt noch einen 2.Externen Interrupt drin, und jedesmal wenn der aufgerufen wird, steigt der Prozess danach wieder ganz oben im MAIN ein.
Kann ich ihn auch irgendwie dazu bringen, in der Hauptschleife zu bleiben?
philharmony ist offline   Mit Zitat antworten
Alt 22.04.2007, 13:47   #9
dirkan
Master
 
Registriert seit: 14.02.2002
Alter: 66
Beiträge: 644


Standard

Hallo,

soweit bist du garnicht weg vom Ziel. Gestatte mir noch folgende Korrekturen:

1. PORTB--; geht nicht, weil ein decrement aus lesen und schreiben
besteht. Lesen eines Portes muss immer mit PINB erfolgen.
Also:
PORTB = PINB-1;

2. Wie willst du den Erfolg deiner Programmierung kontrollieren ?
Baue ein,zwei LED ein und setze sie bei einem Event. Damit debugged es sich leichter.

Last not least: ich kann an deinem Programm keinen Sinn erkennen.
Ist das nur eine Übung, oder übersehe ich was ?

Gruss Dirk
dirkan ist offline   Mit Zitat antworten
Alt 22.04.2007, 13:56   #10
philharmony
Master
 
Registriert seit: 11.03.2003
Alter: 41
Beiträge: 610


philharmony eine Nachricht über ICQ schicken
Standard

Das is erstmal eine Übung.
Ich kann den Erfolg auf dem STK500 sehen, wo der gesamte Portb an den 8 LEDs hängt und einfach binär durchzählt.
Das Program soll wenns fertig ist, über INT1 eine "run-Variable" schalten, wenn die an ist soll er zählen und sich per INT0 resetten lassen.
PORTB-- funktioniert übrigens (Durch das DDRB hab ich ja festgelegt, dass PORTB immer den Wert von PINB annimmt), das is nich das Problem, nur diese Interrupt-Steuerung raff ich nicht, also wann und wo genau ich jetzt was wie setzen/lesen muss damits läuft...
philharmony ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:59 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag