Hallo,
ich benutze einen Mica2dot Mote von Crossbow, der mit dem Atmega 128L
bestückt ist. Der Prozessor wird mit 4MHz getaktet. Als
Programmierplattform nehme ich tinyOS. Ich möchte eine Frequenzmessung
eines Rechtecksignals vornehmen, das am INT0 angeschlossen ist und bei
jeder aufsteigender Flanke einen HardwareInterrupt auslöst. Die
aufsteigenden Flanken sollen jeweils 15ms lang gezählt werden (ich
brauche das resultat nicht in Hz). Die Zählwerte werden zunächst im
Speicher gehalten und am Ende gemeinsam über UART ausgegeben.
Das Problem, das ich habe, ist, dass das Ganze nur bis ~30kHz
funktioniert, ich möchte aber bis 100kHz messen.
Laut Datenblatt können die I/O-Pins des ATmegas Impulse mit bis zu 50ns
Dauer detektieren, daher nehme ich an, dass rein physikalisch 2MHz die
Grenzfrequenz für den Hardwareintzerrupt wäre. Liege ich mit der
Überlegung richtig oder habe ich da noch einen denkfehler gemacht ?
Kann mir jemand sagen, ob ich den Chip überfordere? Oder liegt es daran,
dass ich tinyOS verwende und ich käme mit Assembler hin?
... Hier ist der Sourcecode in nesC:
1 | #include <printf.h>
|
2 |
|
3 | module UltraMicP {
|
4 | uses {
|
5 | interface Boot;
|
6 | interface HplAtm128Interrupt as SignalRead;
|
7 | interface Timer<TMilli> as Timer;
|
8 | interface Timer<TMilli> as Timer2;
|
9 | }
|
10 | }
|
11 |
|
12 | implementation {
|
13 |
|
14 | uint32_t zaehler[255];
|
15 | uint8_t index;
|
16 |
|
17 | event void Boot.booted() {
|
18 | /* legt ein array an, in dem die zählwerte gespeichert sind */
|
19 | for (index = 0;index<255;index++)
|
20 | zaehler[index] = 0;
|
21 | index = 0;
|
22 | /* Initialiserung vom Hardware-Interrupt */
|
23 | call SignalRead.edge(TRUE);
|
24 | call SignalRead.enable();
|
25 | /* Timer starten */
|
26 | call Timer.startPeriodic(15);
|
27 | }
|
28 |
|
29 | async event void SignalRead.fired() {
|
30 | /* Zählt die Flanke an der aktuellen Speicherstelle*/
|
31 | zaehler[index]++;
|
32 | }
|
33 |
|
34 | event void Timer.fired(){
|
35 | atomic {
|
36 | /* wählt die nächste Speicherstelle aus */
|
37 | if (index<255) index++;
|
38 | else {
|
39 | /* oder startet die Ausgabe der Zählwerte*/
|
40 | call SignalRead.disable();
|
41 | call SignalRead.clear();
|
42 | call Timer.stop();
|
43 | index = 0;
|
44 | call Timer2.startPeriodic(200);
|
45 | }
|
46 | }
|
47 | }
|
48 |
|
49 | event void Timer2.fired() {
|
50 | printf("%ld ",zaehler[index]);
|
51 | printfflush();
|
52 | if (index < 255) index++;
|
53 | else call Timer2.stop();
|
54 | }
|
55 | }
|
Vielen Dank schon mal für sachdienliche Hinweise