www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei C-Code ( Beginner )


Autor: Robert Nägele (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab Dir doch schon in der Codesammlung einen Link gegeben.

Da ist doch alles drin (Interrupt, Entprellen, Toggle).


Peter

Autor: Robert Nägele (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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
? ?

Autor: Robert Nägele (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 :()

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Robert Nägele (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Robert Nägele (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: Dieter B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.