-         

Ergebnis 1 bis 3 von 3

Thema: PIC18F1220 Flankenerkennung

  1. #1

    PIC18F1220 Flankenerkennung

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    988
    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.
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  3. #3
    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!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •