Fórum témák

» Több friss téma
Cikkek » Egyszerű PIC-es, digitális oszcilloszkóp folytatás
Egyszerű PIC-es, digitális oszcilloszkóp folytatás
Szerző: bbatka, idő: Márc 18, 2022, Olvasva: 7553, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   4 / 8

Ez a panel vezérli az egész áramkört. Tartja a kapcsolatot a számítógéppel USB-UART-on keresztül. Olvassa az SRAM tartalmát. Kezeli a triggert. Az áramkört többcélú felhasználásra terveztem, egész jól sikerült. Megtalálható rajta, ami az önálló működéshez szükséges. Az oszcilloszkópban közel 30 MIPS sebességgel üzemel. A chip hőmérséklete 50 °C.

A kvarc frekvencia választásának az volt az oka, hogy 13 éve ezeket lehetett a ChipCAD-nél kapni.

A tényleges utasítás végrehajtási sebességnek nagy szerepe van az áramkörben, ugyanis időzítések határozzák meg a mintavétel idejét, a CPLD számláló indítását és leállítását. Ezeknek az időzítéseknek a számítására egy számolótáblát készítettem. Neve ugrótábla.xls.

Az SRAM-ot nem szabad túlcímezni !!!

dsPIC panel:

dspic_sema_570.png

Kattints a képre a nagyobb méretért!

Két kép a megvalósításról:

dspic_panel_teteje_570.jpg

dspic_panel_alja_570.jpg

A PIC-ben egy Pascal nyelvű program fut. Sokat nem akarok róla beszélni. Hosszú, és sok ismétlődő részből áll. A teljes projekt letölthető.

Fő ciklus:

  1. while (TRUE) do              // Végtelen hurok
  2.     begin
  3.       if UART2_Data_Ready() = 1 then     // Adat érkezik?,
  4.         begin
  5.           uart_rd := UART2_Read();          // Adat olvasás,
  6.           tr := tr + 1;
  7.           sdf[tr] := uart_rd;
  8.           as1 := sdf[1];//Mintavétel sebesség választó
  9.           as2 := sdf[2];//Trigger Felfutó=1 Lefutó=2 Nincs=0
  10.           as3 := sdf[3];//Trigger 1-9
  11.          
  12.           if tr = 3 then
  13.           begin
  14.                       case as1 of
  15.             1 : begin IRAS_DIV1;varakoz1;OLVAS_32768; end;
  16.             2 : begin IRAS_DIV1;varakoz10;OLVAS_4096; end;
  17.             3 : begin IRAS_DIV2;varakoz2;OLVAS_32768; end;
  18.             4 : begin IRAS_DIV2;varakoz11;OLVAS_4096; end;
  19.             5 : begin IRAS_DIV3;varakoz3;OLVAS_32768; end;
  20.             6 : begin IRAS_DIV3;varakoz12;OLVAS_4096; end;
  21.             7 : begin IRAS_DIV4;varakoz4;OLVAS_32768; end;
  22.             8 : begin IRAS_DIV4;varakoz13;OLVAS_4096; end;
  23.             9 : begin IRAS_DIV5;varakoz5;OLVAS_32768; end;
  24.             10 : begin IRAS_DIV5;varakoz14;OLVAS_4096; end;
  25.             11 : begin IRAS_DIV6;varakoz6;OLVAS_32768; end;
  26.             12 : begin IRAS_DIV6;varakoz15;OLVAS_4096; end;
  27.             13 : begin IRAS_DIV7;varakoz7;OLVAS_32768; end;
  28.             14 : begin IRAS_DIV7;varakoz16;OLVAS_4096; end;
  29.             15 : begin IRAS_DIV8;varakoz8;OLVAS_32768; end;
  30.             16 : begin IRAS_DIV8;varakoz17;OLVAS_4096; end;
  31.             17 : begin IRAS_DIV9;varakoz9;OLVAS_32768; end;
  32.             18 : begin IRAS_DIV9;varakoz18;OLVAS_4096; end;
  33.             19 : begin digpotert(as3);comp1(as2); end;
  34.             20 : begin digpotert(as3);comp2(as2); end;
  35.             21 : begin digpotert(as3);comp3(as2); end;
  36.             22 : begin digpotert(as3);comp4(as2); end;
  37.             23 : begin digpotert(as3);comp5(as2); end;
  38.             24 : begin digpotert(as3);comp6(as2); end;
  39.             25 : begin digpotert(as3);comp7(as2); end;
  40.             26 : begin digpotert(as3);comp8(as2); end;
  41.             27 : begin digpotert(as3);comp9(as2); end;
  42.             28 : begin digpotert(as3);comp10(as2); end;
  43.             29 : begin digpotert(as3);comp11(as2); end;
  44.             30 : begin digpotert(as3);comp12(as2); end;
  45.             31 : begin digpotert(as3);comp13(as2); end;
  46.             32 : begin digpotert(as3);comp14(as2); end;
  47.             33 : begin digpotert(as3);comp15(as2); end;
  48.             34 : begin digpotert(as3);comp16(as2); end;
  49.             35 : begin digpotert(as3);comp17(as2); end;
  50.             36 : begin digpotert(as3);comp18(as2); end;
  51.             end;
  52.  
  53.           tr := 0;
  54.           sdf[1] := 0;
  55.           sdf[2] := 0;
  56.           sdf[3] := 0;
  57.           as1 := 0;
  58.           end;
  59.         end;
  60.     end;

 

Korábban már beszéltem róla, hogy három adat érkezik a számítógépes programból, amelyek as1, as2, as3 változóban tárolódnak le.

Összesen 36 alap állapot van.

Írási ciklus:

  1. Procedure IRAS_DIV1(); //12,5MHz
  2. begin
  3. TRISB := %1111111111111111;//A0-A15 címző
  4. TRISC.1 := 1; //DACLK bemenet
  5. TRISC.2 := 1; //WE bemenet
  6. TRISC.13 := 0; //OENG kimenet
  7. TRISC.14 := 0; //CS1 kimenet
  8. TRISD.9 := 0; //OEAD kimenet
  9. LATC.14 := 0; //CS1 értéke L szint
  10. LATC.13 := 1; //OENG értéke H
  11. LATD.9 := 0; //OEAD értéke L szint
  12. LATF.0 := 0; //CLKSEL(0) Az alábbi 5 sor a nullázás
  13. LATF.1 := 0; //CLKSEL(1)
  14. LATF.2 := 0; //CLKSEL(2)
  15. LATF.3 := 0; //CLKSEL(3)
  16. LATF.6 := 0; //GTS = 0
  17. Delay_Cyc_Long(1);
  18. LATF.6 := 1; //GTS = 1 Mintavétel indul
  19. LATF.0 := 1; //CLKSEL(0)
  20. LATF.1 := 0; //CLKSEL(1)
  21. LATF.2 := 0; //CLKSEL(2)
  22. LATF.3 := 0; //CLKSEL(3)
  23. end;

Olvasási ciklus:

  1. Procedure OLVAS_32768();
  2. begin
  3. LATF.0 := 0; //CLKSEL(0) = 0
  4. LATF.1 := 0; //CLKSEL(1) = 0
  5. LATF.2 := 0; //CLKSEL(2) = 0
  6. LATF.3 := 0; //CLKSEL(3) = 0
  7. LATF.6 := 0; //GTS1 = 0
  8. TRISB := %0000000000000000;//A0-A15 címző kimenet
  9. TRISC.2 := 0; //WE kimenet
  10. TRISC.14 := 0; //CS1 kimenet
  11. TRISC.13 := 0; //OENG kimenet
  12. TRISD.9 := 0; //OEAD kimenet
  13. LATC.2 := 1; //WE = 1
  14. LATC.14 := 0; //CS1 = 0
  15. LATC.13 := 0; //OENG = 0
  16. LATD.9 := 1; //OEAD = 1
  17. For J := 0 to 32767 do
  18. begin
  19. PORTB := J;//RAM címzés
  20. Delay_Cyc_Long(3);
  21. mem := PORTD and %0000000011111111;
  22. Delay_Cyc_Long(3);
  23. UART2_Write(mem);
  24. Delay_us(10);
  25. end;
  26. end;

Trigger:

  1. procedure comp1(as2:byte);
  2. begin
  3. While true do
  4. begin
  5. S1 := PORTD.10;
  6. Delay_Cyc_Long(2);
  7. S2 := PORTD.10;
  8. if (S2>S1) and (as2=2) then //Lefutó élre, egy mintavétel, 12500000Hz
  9. begin
  10. IRAS_DIV1;
  11. varakoz1;
  12. OLVAS_32768;
  13. as2:=0;
  14. Break;
  15. end;
  16. if (S2begin
  17. IRAS_DIV1;
  18. varakoz1;
  19. OLVAS_32768;
  20. as2:=0;
  21. Break;
  22. end;
  23. end;
  24. end;

Potméter értékének a beállítása:

  1. procedure digpotert(as3:byte);
  2. var p1:byte;
  3.  
  4. begin
  5. DigPot_CS_Direction := 0;  //PORTG6 kimenetre állítása
  6. p1:=ceil(31+(as3*102/9));  //2V/5V*255=102  0,6V/5V*255=31
  7. DigPot_CS := 0;            // Potmeter kiválasztása
  8. SPI2_Write(0x11);          // Írás parancs
  9. SPI2_Write(p1);            // Adat bájt küldése
  10. DigPot_CS := 1;            // Potmeter leválasztása
  11. as3:=0;
  12. end;


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem