PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Counter Programmieren



Squatmario
25.11.2005, 07:22
Muss mich wegen einem Projekt mit dem Counter und Interrupt beschäftigen.

Habe aber eigentlich wenig Ahnung wie man einen Counter programmiert.
Könnte mir jem. bitte ein leicht zu Verstehendes Programm online stellen, mit dem ich mich beschäftigen kann. Möchte sollch ein Programm verstehen und daraus andere Programme entwickeln.

Weiß aber nur wie ich die Register setzen muss, also die betriebsart.

Bin für jede Hilfe Dankbar

PS: Muss mit dem Counter innerhalb einer Zeitperiode von 100µs die impulse eines Sensors Zählen der sich kapazitiv verändert. Diese Werte sollen dann eine Datenreihe ergeben.(Verlauf)

Ich weiß was ich will, aber ich hab wenig Ahnung wie.

Hoffe es kann mir wer helfen

askazo
25.11.2005, 07:33
Da stellt sich erst mal die Frage, welchen ATMega Du benutzt und welche Taktfrequenz Du verwendest.
Dann könnten wir uns auch über die entsprechenden Register unterhalten :)

Grundsätzlich ist es so, dass Du Dein Vorhaben mit der Output-Compare Funktion des Counters bewältigen kannst. Du schreibst einen Wert in das OC-Register, der den verlangten 100µs entspricht (kann man über die Taktfrequenz ausrechnen). Dann muss der OC-Interrupt aktiviert werden. Alle 100µs wird dann dieser Interrupt ausgelöst.

askazo

Squatmario
25.11.2005, 11:49
Iche verwende den Atmega 32,
mit einer Taktfrequenz von 3,6864MHz.

Danke schon mal für die Antwort.
Hoffe es kann mir wer anhand eines source codes witerhelfen.

askazo
25.11.2005, 13:20
Ok, ich versuchs mal. Ohne Garantie, der Code ist nicht getestet.
Als Compiler benutze ich avr-gcc.

Zunächst mal kurz die Berechnung für's OC-Register:
f=3,6864 MHz -> Ein Takt dauert 1/f = 271,27ns
100µs/271ns = 368,64 -> Anzahl der Taktzyklen in 100µs
368 = 0x170


//Register setzen

//Mode = CTC (Clear Timer on Compare)
TCCR1B = 0x04;

//Output-Compare Register einstellen.
OCCR1AH = 0x01;
OCCR1AL = 0x70;

//Output Compare Match - Interrupt einschalten
TIMSK = 0x10;

//Timer starten mir clock-Devider = 1
TCCR1B |= 0x01;

//Interrupts global freigeben
sei();

while (1)
{ //do nothing
}


//Interrupt-Routine
//Wird alle 100µs aufgerufen
signal (SIG_OUTPUT_COMPARE1A)
{
//Hier kommt rein, was auch immer Du alle 100µs machen willst
}

askazo

Squatmario
02.12.2005, 12:22
Dankeschön!!!!

Hat mir sehr geholfen!