Polling? Microchip
-
Hallo Leute,
ich befass mich zur zeit bischen mit Microchips, und will eine Rechteckkurve bzw. eine Impulskurve messen.. das geht anscheinend wunder bar mit Poling an einem Digitalen Eingang? Nun ich hab bischen gesucht.. aber nichts gescheits gefunden. Kennt jemand ein gute Tutorial mit beispiel Code (C).
achja, es geht und den Atmel Atmega8 Chip...
Noch ne frage: Umso höher ich ein chip takte, um so höhr ist die IRQ Intervall oder?
Bspw. Code:
#define IRQS_PER_SECOND 2000 /* 500 µs */ // Anzahl IRQs pro 10 Millisekunden #define IRQS_PER_10MS (IRQS_PER_SECOND / 100) / ////////////////////////////////////////////////////////////////////// // Die Interrupt Service Routine (ISR). // In interrupt_num_10ms werden die IRQs gezählt. // Sind IRQS_PER_10MS Interrups geschehen, // dann sind 10 ms vergangen. // timer_10ms wird alle 10 ms um 1 vermindert und bleibt bei 0 stehen. SIGNAL (SIG_OUTPUT_COMPARE1A) { static uint8_t interrupt_num_10ms; // interrupt_num_10ms erhöhen und mit Maximalwert vergleichen if (++interrupt_num_10ms == IRQS_PER_10MS) { // 10 Millisekunden sind vorbei // interrupt_num_10ms zurücksetzen interrupt_num_10ms = 0; // Alle 10ms wird timer_10ms erniedrigt, falls es nicht schon 0 ist. // Wird verwendet in wait_10ms if (timer_10ms != 0) timer_10ms--; } }
In dem code beispiel müsste die Konstante IRQS_PER_SECOND je nach taktfrequenz erhöht oder vermindert werden oder?
-
also mal davon abgesehen das ich deine frage nicht so richtig verstehe, ist das hier auch glaube ich das falsche forum
-
frag doch mal da: http://www.mikrocontroller.net/forum/mikrocontroller-elektronik
-
Dazu benutzt man die Capture-Einheit. Wenn dein Ding nichtmal das hat ist es die falsche Wahl für ein Hobbyprojekt. Polling...
-
So ein Teil heißt Microcontroller. Und du solltest erstmal ein paar Tutorials durcharbeiten, bevor du irgendwas anderes versuchst. Gute Anlaufstelle ist www.mikrocontroller.net
-
Tim schrieb:
Dazu benutzt man die Capture-Einheit. Wenn dein Ding nichtmal das hat ist es die falsche Wahl für ein Hobbyprojekt
geht meistens ohne. ein hardware-timer und ein interruptfähiger input sollten genügen.
-
Moin
also das was du vorhast sollte funktionieren, wenn die zu messende Freqenz eine grössere perioden dauer hat als die deines timers ( glaub faktor 2 sollte es schon sein, irgend was mit abtast theorem ) IRQ stösst alle n µs die abstastung an.
oder wenn das möglich ist, den port als IRQ konfigurieren, auf beide flanken einstellen. bei jedem auslösen, den port zustand auslesen, und von einem Timer den Zeitpunkt dazu auslesen.
Das ganze geht auch über eine capture compare einheit. da muss dann nur noch der Timer wert ausgelesen werden, der für High und low wechsel gekapturet wurde.
ggf. lassen sich auch andere input Funktionen dazu missbrauchen. z.B. data in einer SSC einheit. zustand kontinuierlich über n Bits einlesen lassen. und anschliesend auswerten. ( mit UART und I2C funktioniert das nicht da hier start und stop bedingungen ausgefiltert werden )
gruss
-
das mit dem "capture compare " müsste funktionieren, wenn ich nen Timer mit 1Mhz laufen lasse und dabei einen Zähler hochzähle so kann ich die differenin in Mircosekunden zwischen zwei flankne ermitten. Muss nur auf überlaug aufpassen
-
weiso auf überlauf aufpassen? nur dann wenn eine periode grösser als 232 wird. für den rests gibts mathematische gemeinheiten
tx = 0xFFFFFF00
tx+1 = 0x00000100 ( aufgrund eines überlaufs fangen wir wieder von vorne an )somit ist tx+1 - tx = -0xFFFFFE00
Da wir aber nur positive zahlen verwenden. und wir das - gar nicht in der zahl darstellen können, wird daraus 0x000002000x00000100 - 0xFFFFFF00 nach 2 er complement 0x00000100 + 0x000000FF + 0x00000001 = 0x00000200 0x00000100 + 0x00000100 = 0x00000200
Basiert eigentlich darauf, das nur mit ganzen zahlen positiven zahlen gerechnet wird. negative ergebnisse gibt es nicht, und diese werden dadurch wieder positiv. ( und vorallem simmt das dann auch noch ) funktioniert aber nur mit Module 2x