Hi, Ich probiere im Moment den A90s8535 aus und hab mir ne Schaltung auf nem Steckbrett aufgebaut, Die Eingänge (PORTD - 8 Taster) sind jeweils invertiert sowie auch die Ausgänge ( PORTC - 8 LEDs ) invertiert sind. Nach einigen Lauflichtern wollte ich einmal etwas komplexeres schreiben mit dem ich z.b. einzelne programme auf verschiedene taster lege. Das klappt soweit auch im Moment Siehe Anhang. Nun will ich allerdings das ich nicht immer mindestens die Laufzeitabwarten muß damit der reagiert und was ändert genauso wie ich gerne ein "Toggle" Taster programmieren möchte. Nur komm ich da einfach nicht weiter. Die Tasten müßen entprellt werden etc und ich habe auch keinerlei Ahnung wie das mit den Interupts funzt. Hat mir da jemand ein Codebeispiel oder eine Seite mit "guten" ( Also für Neulinge )tutorials dafür ? Ich will die Entprellung auf jedenfall mit Software machen und keine monoflops oder externe Beschaltung dafür verwenden. Ich nutze den CodeVision C-Compiler und programmiere parallel mit dem Programmieradapter der hier auf der Site unter Tutorials steht. MFG
Kannst dir meinen Code auf http://www.ganter.at/elektronik/mikrocontroller/wecker.c ansehen. In readkeyboard() lese ich von einer Tastenmatrix. Das ganze ist auch Interruptgesteuert, vielleicht kannst dir da was abschauen. Und nein, ich werde den Code nicht Zeile für Zeile erklären, du sollst ja was lernen.
Ich hab Dir doch schon in der Codesammlung einen Link gegeben. Da ist doch alles drin (Interrupt, Entprellen, Toggle). Peter
@ Fritz Ganter : Was lernen is gut :) Ich bin blutiger anfänger und ich komme mit dem Code so einfach nicht richtig zurecht. @Peter Dannegger : Ich weiß aber wie beim Fritz Ganter ist der Code so komplex das ich noch nichtmal annähernd begreife wo ich was finde geschweige auch was finde was ich suche. Letzendlich finde ich es zwar super das gleich gesamte Codebeispiele gepostet werden jedoch bin ich damit einfach überfordert. Im Datenblatt stehen zwar Daten über den Interupt nur leider hilft mir das nicht. Sowie auch in der Online Hilfe vom CodeVision Compiler keine brauchbaren informationen stehen, bin ich vielleicht zu böd dafür ? ?
Hi, Ich hab mir nun selbst was geschrieben, der Code sollte selbsterklärend sein. Mein Problem ist das ich alles immer doppelt schreiben muß, gibt es da keine möglichkeit das etwas "eleganter" zu schreiben ? Und der Code wird immer nur in "Pausen" verwendet und nicht gerade dann wenn z.b. einer auf die Tasten drückt. Somit darf der Maincode einfach nicht zu lange gehen oder ich muß ständig die Funktion da aufrufen. Macht so eine Tastenentprellung überhaupt Sinn ? vor allemn dürfen ´die Delayintervale nicht so lange gehen das er gar kein drücken erkennt :()
Hi! Ich habe eine Interruptroutine, die 128mal pro Sekunde abgefragt wird, dann ist es kein Problem. Im Prinzip entprelle ich so: SIGNAL (SIG_OUTPUT_COMPARE2) // handler for Output Compare 2 { if (taste==alttaste) tastencount++; else tastencount=0; // also tastencount hochzählen, wenn der gleiche Tastenzustand wie // vorher alttaste=taste; if (tastencount>4) { // 4mal die selbe Taste, also Taste erkannt ergebnis=taste; alttaste=99; } } Im Hauptprogram kannst dann nach der Verarbeitung der Taste mit while (ergebnis!=0) ; auf das Tastenrelease warten. Mach das aber nicht in der Interruptroutine!!! ergebnis muss voilatile sein, also: volatile char ergebnis; Ist jetzt so trocken hingeschrieben, also selbst nochmal durchdenken! Ob du 4 oder einen anderen Wert nimmst, musst durchprobieren. Ich hoffe das hilft weiter.
Danke :) Das da ein Zähler mitlaufen muß verstehe ich schon, jedoch frage ich mich auch bei deinem Beispiel wie das genau funktioniert. du sagst du hast eine Interruptroutine, jo wie mach ich das und wie bekomem ich hin das in so einer interuptroutine das oben geschriebene losläuft ? Ich lass es glaub echt bleiben mit den µCs und machs wieder diskret mit Digitalbausteinen. Den ich raffe da echt NULL. Ich weiß das ich meine Tasten abrufen muß , wenns sein muß auch mehrere 100male pro Sekunde. Aber wie soll ich das bitte in mein program einbauen wenn ich dann teilweise delays von mehreren 100ms drinne habe ? Muß ich dann aufspilitten und alle 10ms mal abrufen lassen ? etc ? sieht dan echt wüscht aus. Gibts keinen Code mit dem ich einfach sehen kann ob sich ein zustand am Taster verändert hat oder nicht ? gnargl
Du musst nur einen Timer entsprechend setzen, dann läuft das automatisch. Die Interruptroutine wird automatisch aufgerufen, du brauchst dich dann im Programm nicht kümmern. Lies doch mal das Tutorial, ist dort sicher beschrieben.
Sodele ich habs nun endlich mal geschaft einen interupt zu bedienen :) Allerdings ist es ein Externer und arbeitet "nur" mit den 2 Interupteingängen. Hier mal kurz wie was ging : interrupt [2] void external_int0(void) { PORTC = 0x80 ; delay_ms(200); PORTC = 0x08 ; } Ich habs auch schon geschafft nen Tiemr laufen zu lassen allerdings läßt der sich nur auf minimal 6kHz einstellen und ich weiß nicht wie nun dieser "Timer" zum "Interupt" wird. In der referenz stehen da nähmlich nur Interupt für TimerOverflow : interrupt [8] void timer0_overflow(void) { /* Place your code here */ } Und ich weiß nicht wie ich nun bei jeder positiven timerflanke meine Tasten einlesen kann. Und das dann auch nur 100 mal in der Sekunde statt 6000 mal. Du hast nicht zufällig da mal noch einen Tip ? bzw weißt wie diese Interuptcodes ( Vectornumbers ) aufgelöst werden, das ich weiß bei welchem ich das machen soll ?
Hallo Schau doch mal hier rein http://www.mikrocontroller.net/articles/c/ Hilft am Anfang bestimmt erstmal weiter, auch wenn das nicht für deinen Compiler geschrieben ist. MFG Dieter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.