PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Counter extern zählen



Memby
12.01.2005, 04:23
Hallo,

ich möchte bei einem Atmega8 den Counter extern über einen Taster
(aktive Low) zählen lassen und den Wert am Ausgang als Bitmuster anzeigen lassen.
Wie übergebe ich die Flanke des Tasters an T0 und wie vermeide ich Tastenprellung.
Hat jemand einen Vorschlag. Dürfte ja nicht so tragisch sein. (Für mich schon)

Über Codes, die verschiedene Funktion des Timer/Counter verdeutlichen würde ich mich auch freuen.
Im Downloadbereich habe ich nichts passendes gefunden/übersehen.

Danke
memby

12.01.2005, 12:45
hab ichs richtig verstanden, was du vorhast...du willst einen Taster an einen AVR anschließen und immer, wenn du auf den Taster drückst, wird eine Zählvariable um 1 erhöht und diese Variable wird an einem Port ausgegeben?

falls ja, würde ich den Taster an einen externen Interrupt anschließen(INT0, oder INT1 üblicherweise), der Schaltplan dazu ist im Tutorial auf www.mikrocontroller.net zu sehen, nur als Anschlusspin muss man eben einen interruptfähigen nehmen
und dann wird, wenn dieser Interrupt ausgelöst wird, die Variable um 1 erhöht

mit dem Entprellen kenn ich mich nicht aus, such mal danach

bluebrother
12.01.2005, 13:08
du könntest zum entprellen einfach in deinem Programm darauf warten dass der Signalpegel vom Taster eine bestimmt Zeit lang anliegt -- eine Hand ist nun mal deutlich langsamer wie ein Prellsignal ;)

Memby
12.01.2005, 16:39
Danke für die Antworten.
Doch mit Interrupt kenne ich mich noch nicht aus. Im Tutorial steht auch nur der Assemblercode.
Kann jemand einen Beispielcode posten, der das Interruptthema und das Warten auf ein Signal an Hand eines C-codes erklärt.

So eben bin ich auf eine andere Idee gekommen.
Könnte ich die ganze Sache nicht einfach mit einem Inkrement lösen. Bei jedem Tastendruck eine Variable um eins erhöhen und einfach an einem Port ausgeben? Soweit die Theorie. Wie sieht das ganze in C aus.

Ich komme von der SPS-Schiene und da is alles ein wenig einfacher (für mich) und möchte aber gerne auch C verstehen und programmieren.

Danke
memby

Gottfreak
12.01.2005, 18:11
So eben bin ich auf eine andere Idee gekommen.
Könnte ich die ganze Sache nicht einfach mit einem Inkrement lösen. Bei jedem Tastendruck eine Variable um eins erhöhen und einfach an einem Port ausgeben? Soweit die Theorie. Wie sieht das ganze in C aus.

Klar kannst du das machen. Hier ist mal der Code einer "Uhr". Das Programm verwendet einerseits einen Timer-Interrupt um eine Variable hochzuzählen und überprüft andererseits zwei Taster und einen Schalter, mit denen man die Uhr stellen kann.


#define __AVR_ATmega8
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>

volatile uint8_t zeitZaehl, second, minute, hour;

void ioinit (void)
{
/*Ports*/
DDRB = 0;
DDRD = 2; //alles bis auf TX auf Ausgang
PORTD = 28; //Pullups an PD2-4 an

/*Timer2 - Prescale 64*/
ASSR=BV(AS2); //externen Uhrenquarz verwenden
TCCR2=1; //kein Prescale
TIMSK=BV(TOIE2); //Interupt an

sei (); /*Interrupts an*/
hour=17;minute=52;
}

int main (void)
{
ioinit ();

for (;;) /* Endlosschleife */
{;}

return (0);
}

SIGNAL (SIG_OVERFLOW2)
{
if (++zeitZaehl>127){
zeitZaehl=0;
if (++second>59)
{
second=0;
if (++minute>59)
{
minute=0;
if (++hour>23)
{
hour=0;
}
}
}
if (!(PIND&4))
{
if (PIND&16) {if (++hour>23) hour=0;}
else if (++minute>59) minute=0;
}
if (!(PIND&8))
{
if (PIND&16) {if (--hour>200)hour=23;}
else if (--minute>200)minute=59;
}
}
}

Wenn du Fragen zu einzelnen Codestellen hast, nur zu!

Gottfreak
12.01.2005, 18:12
folgender Fehler taucht bei mir sporadisch(ca. jedes 50ste mal) beim Aufrufen von Threads auf, deshalb auch eben die "Doppelpost". Geht das sonst noch wem so? Woran mag es liegen?



Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.


--------------------------------------------------------------------------------

Das Endtag 'script' stimmt nicht mit dem Starttag 'SCRIPT' überein. Fehler beim Bearbeiten der Ressource 'https://www.roboternetz.de/phpBB2/posting.php'. Zeile 59, Position 3

</script>

Pascal
12.01.2005, 19:47
der Gast war ich



Könnte ich die ganze Sache nicht einfach mit einem Inkrement lösen. Bei jedem Tastendruck eine Variable um eins erhöhen und einfach an einem Port ausgeben?

hab ich doch gesagt...


und immer, wenn du auf den Taster drückst, wird eine Zählvariable um 1 erhöht und diese Variable wird an einem Port ausgegeben?

Memby
13.01.2005, 20:56
Danke für euere Anregungen. Ich werde mich leider erst am Wochenende drüber machen können. Melde mich aber bei Fragen.
MfG Stefan