PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC18F1220 Flankenerkennung



CinimoD
30.04.2009, 12:33
Hallo RN User,

ich bin schon einige Monate hier auf den Seiten des Forums unterwegs. Habe mir immer wieder Tipps und Infos über grundlegendes Wissen hier holen können. Soweit so gut... Heute hab ich mich angemeldet weil ich ein Problem feststellen musste und ich darauf hier keine Antwort oder Hilfestellung finden konnte - KAUM ZU GLAUBEN.

Es geht darum: Ich habe einen PIC18F1220 denn ich so programmieren möchte dass er mir ein Rechtecksignal von 144Hz "wandelt". Und zwar soll das Programm die fallende und ansteigende Flanke des Signals erkennen und dann (direkt) bei der ansteigenden Flanke einen Impuls von 20us, dann eine low-Phase von 60us und einen weiteren Impuls von 20us erzeugen. Danach wider low bis die abfallende Flanke des Rechtecks kommt. Hier soll dann direkt an der abfallenden ein 20us high, 20us low, 20us high, 20us low, 20us high und danach wieder low bis zur ansteigenden Flanke. Hier mal eine skizze:

Rechteck: ______--------------------____________________----------------
Flanken : ______-___-_________-_-_-________________-___-_______

Meine Frage hierzu ist dies überhaupt möglich mit diesem PIC (und WIE)? Weil ich habe den Pic jetzt so programmiert, desweiteren benutze ich den internen Oszilator des PIC mit 20MHz:

#use delay (clock=1000000)

#int_ext1
void ext_isr()
{
int j;
for(j=0;j<2;j++)
{
output_high(Pin_A0);
Delay_us(1);
output_low(Pin_A0);
Delay_us(1);
}
}
#int_ext2
void ext_isr2()
{
int j;
for(j=0;j<3;j++)
{
output_high(Pin_A1);
Delay_us(1);
output_low(Pin_A1);
Delay_us(1);
}
}
void main()
{
set_tris_a(0x0F);
set_tris_b(0xFF);

ext_int_edge(L_TO_H);
enable_interrupts(int_ext1); // Setup interrupt on rising edge
enable_interrupts(GLOBAL);

ext_int_edge(H_TO_L);
enable_interrupts(int_ext2); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);

while(TRUE) {
}
}

Jetzt werden zwar Flanken erkannt und auch "gewandelt", jedoch sind die high und low zustände viel zu lang und auch zeitlich zur ansteigenden/abfallenden Flanke stark verschoben. Das ganze funktioniert auch nicht bei 144Hz sondern läuft erst ab ca. 30Hz stabil.
use delay (clock=1000000) habe ich schon von 20MHz auf 1MHz heruntergeregelt, (noch niedriger ändert sich nichts mehr) dies machte die Impulse an sich kleiner jedoch immer noch zu groß mit ca.250us.

Hier nochmal eine Skizze vom erzeugten Signal:
Rechteck: ______--------------------____________________----------------
Flanken :_________---_____---______---___---___---________---____-


Ich hoffe jemand hat eine Iddee wie ich dies realisieren kann? Vielen Dank für Tipps und Tricks jeglicher form. Ansonsten wünsche ich nen schönen 1.MAI und ein verlängertes Wochenende!

Viele Grüsse

theborg
30.04.2009, 13:25
Hi ein Delay ist dafür ungeeignete da die zeiten nicht wirklich der echten zeiten entsprechen.

Zei lösungsmöglichkeiten:

1.) die Schleifen mit Inlineasembler machen und die genauen Takt Zirklen ausrechnen.
2.)einen timer nutzen der genau die Zeiten leuft

In beiden Fällen brauchst einen temperaturstabielen Quartz oder du nimmst für den timer nen uhrenquartz an RA4 mit dem du den timer taktest.

CinimoD
04.05.2009, 10:10
Danke,

schön das schon am Do direkt jemand geantwortet hat. Hat jemand Erfahrung mit Timer Geschichten oder kennt nen Quelltext der einem den Einstieg bissl leichter macht?

Vielen Dank nochmal an dieser Stelle!