Datum: 15.05.2008 11:55
Hallo! Folgendes Problem. Ich habe einen PIN der EXTERN auf HIGH geht. Wenn dieser PIN mehrere Sekunden auf HIGH ist, dann soll alle z.B. 4ms Daten durch die EXT_INT_FUNC ausglesen werden. Ich möchte allerdings nicht in der Funktion drinbleiben solange der PIN auf HIGH ist. Ich möchte den EXT per Hand resetten (durch z.B. einen Timer) und wenn der PIN dann noch auf HIGH ist, dann soll er gleich wieder in meine Interruptfunktion reinspringen. Ist das verständlich??
/* deaktivierte Timerfunktion
void Timer0(void)
{
if(FIO0PIN & PIN0_30)
{
EXTINT = 0x03; // clearen, damit der Interrupt wieder ausgelöst wird
}
}*/
|
void EXT3_INT_Func(void) //__irq { // clear EXTINT; muss gemacht werden laut Handbuch EXTINT = 0x03; // some code ...; // clear Interrupt VICAdress = 0x0; } |
der ExtInt geht, habe ihn getestet. die TimerInt geht auch. Also an den Funktionen liegt es nicht. Es ist ein programmierlogisches Problem. Wäre nett, wenn es Ratschläge gibt! Gruss Krugman
Datum: 15.05.2008 15:38
Sorry Leute, war recht einfach meine Frage selber zu loesen .. Fuer alle Neueinsteiger:
void Timer0(void) { EXTINT = 0x03; // damit wird der Externe Interrupt gecleart (03 steht für einen bestimmten PIN). // Wenn wir das nicht machen, würden wir keine Interrupts (Extern) mehr mitbekommen. } void Ext_Int_Func(void) { if( !(FIO0PIN & P0_30) ) // wenn nicht PIN30 { EXTINT = 0x03; // falls am Anfang irgendetwas versehentlich den PIN auf high setzt, // muessen wir das abfangen, sonst kriegen wir gewollte Interrupts nicht // mehr mit! Ne bessere Lösung ist mir nicht eingefallen. }else if( (FIO0PIN & P0_30) ) // wenn PIN30 { ...; // do something } VICAdresse = 0x0; // Vectored Adresse auf 0 setzen. Ist wichtig wenn man den VIC verwendet! } |
Anmerkung: Ich hab hier nicht die Init fuer den Timer und die Ext_Int_Func hinterlegt. Dies kann man recht einfach aus dem Manual rausbekommen. Zur Erklärung: Wenn der PIN30 extern (andere Hardware) auf High geht, springen wir in die EXT_INT_Func hinein und führen den Code aus. Wir setzen aber nicht das Clearflag für den Ext-Interrupt, was man normalerweise direkt nach dem Funktionsaufruf machen sollte. Wir setzen das Flag erst in der Timerfunktion. Dadurch erreicht man ein "Abtasten" des PINs, weil nur alle X ms (je nach Timerconfig) den Clearflag setzt. Gruss Krugman PS: Wer mir erlären kann warum ich mir mit der if-Abfrage aushelfen musste, dem bin ich dankbar. Ich weis nicht warum es ohne bei mir nicht ging. Hat bestimmt was mit dem Reset zu tun ..
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel