Fórum témák

» Több friss téma
Fórum » MikroPascal kérdések
 
Témaindító: bozsokiandras, idő: Máj 15, 2006
Témakörök:
Lapozás: OK   24 / 29
(#) gapati válasza gapati hozzászólására (») Okt 13, 2013 /
 
Az RA4-RA5 az OSC1-OSC2 láb külső oszcillátornál. Valami itt nem OK! Én belső 4MHz-t használok.
(#) progee válasza gapati hozzászólására (») Okt 13, 2013 /
 
szerintem a ra4. lábat állítottad bemenetre.
A hozzászólás módosítva: Okt 13, 2013
(#) gozi válasza gapati hozzászólására (») Okt 14, 2013 /
 
Szerintem a konfigurációs bitek környékén van a probléma, konkrétan az oszcillátorra vonatkozó részen. Ha belső oszcillátort használsz, akkor az INTOSCIO üzemmód kell az RA4 és az RA5 I/O használatához.
(#) gapati válasza gozi hozzászólására (») Okt 15, 2013 /
 
Igen!

gozi megoldotta a "fura" jelenséget.

Köszönöm a segítséget, további szép estét mindenkinek!
(#) zbartalos hozzászólása Okt 25, 2013 /
 
Sziasztok!
Egy kis segítségre lenne szükségem. Adott egy 16F877A és 2db HD44780 kompatibilis LCD. Egy 2x20 és egy 4x20 charakteres. Összehoztam próbapanelon egy kis áramkört, hogy leteszteljem, de nem akar elindulni az kiíratás az LCD-re. Az LCD megjelennek az első sorban a kockák, de nem ír ki rá semmit sem. Oshon-os szimulátorban minden működik. Mikropascalban írtam rá progit. Először a B protra kötöttem az lcd-t a vezérlő és adatbiteket is (trisb:=0x00; lcd_init(portB); lcd_out(1,1, ' szöveg') utána megpróbáltam szétosztani az adat biteket a B és D port között, de így is semmi. Órajel 20MHz ezt ellenőriztem az osc2 kimeneten skóppal az szép tiszta. az MCLR lábat 10k-val felhúztam VDD-re. Program beírása után vissza olvastam a pic-ből a progit az ok. Tudna valaki segíteni, hogy mi lehet a hiba, amiért nem akar írni az LCD a PIC? A segítséget előre is köszönöm.
Üvd.: Zoli!
(#) proli007 válasza zbartalos hozzászólására (») Okt 26, 2013 /
 
Hello! Nekem nincs Pascal-om, de ha csak az első sorban kockák vannak, az azt jelenti, nem történt meg az LCD inicializálása. Vagy a program nem jó, vagy a hardver bekötés, vagy a bekötés nem felel meg a programnak. (4-8 bit üzemmód stb.) Általában az LCD-ről nincs visszaolvasás, így az RW vonalat fixen a GND-re kell kötni. üdv!
(#) zsoltee0001 válasza zbartalos hozzászólására (») Okt 27, 2013 /
 
Szia
Digitálisra át vannak állítva a lábak?
ADCON0 := 0x07;
Üdv
(#) zbartalos válasza proli007 hozzászólására (») Okt 27, 2013 /
 
Köszönöm a választ. Közben megoldódott a dolog. A próba panelban volt a hiba. Szakadás volt benne az egyik oldalon, amit nem láttam, mivel be van öntve és csak a jelöléseket figyeltem. Egyébként meg egy 8 zónás lakás riasztó prigiját írtam és előtte le akartam próbálni az lcd.

Üdv.: Zoli
(#) zbartalos válasza zsoltee0001 hozzászólására (») Okt 27, 2013 /
 
Hali! Nem állítottam át a portot az LCD miatt, mivel az adatlap szerint a B port alapból digitális, csak kimenetnek állítottam. Viszont közben akadt még1 kisebb gondom a beépített eeprommal. Kiolvasni az eeprom_read-del ki tudom az eeprom adott byte-ját viszont írni valahogy nem igazán akarja eeprom_write-al (eeprom_write($01, 0x04). Az adatlap szerint van benne 256byte eeprom. A segítséget előre is köszönöm.
Üdv.: Zoli
(#) zsoltee0001 válasza zbartalos hozzászólására (») Okt 27, 2013 /
 
Szia
Ha jól emlékszem nekem is volt hasonló problémám.
Próbálj betenni egy kis késleltetést az írás elé.
delay_ms(100);
Üdv
(#) zbartalos válasza zsoltee0001 hozzászólására (») Okt 27, 2013 /
 
Köszi a választ. Tettem be várakozást, mivel a mikropascal is írta, hogy 20ms-re szükség van írás előtt, de így csinálja meg az írás. Arra gondoltam még, hogy esetleg nem-e kell beállítani valami kapcsolót még a project elején és nem a default-ot kellene használni. Gondolok itt (WRT_ENABLE_ON vagy OFF).
Köszönöm a segítséget.
Üdv.
(#) progee hozzászólása Nov 7, 2013 /
 
Tudnátok segíteni?
Az alábbi kód egy 16F628A PIC-re küldene RS232-n karaktereket.
Adott karakternél, egy relét kellene behúzni a PIC RB4 lábán.
Ha a kikommenterezett részt engedélyezem, akkor az RA0 lábon lévő nyomógombbal tudom működtetni a relét. PC-ről küldött karakterrel viszont nem csinál semmit.
A PC-nek visszaküldött karakter (UART1_Write(uart_rd)) helyesen jelenik meg a monitoron.

  1. begin
  2.   CMCON := 0x07;                    
  3.   UART1_Init(9600);                        
  4.   Delay_ms(500);    
  5.                      
  6.   PORTA := 0;  
  7.   trisb.4 := 0;
  8.   portb.4 := 0;
  9.   uart_rd := 0;  
  10.  
  11.  
  12.   while (TRUE) do                          
  13.     begin    
  14.      
  15.       //if porta.0 = 1 then portb.4 := 1 else portb.4 := 0;
  16.  
  17.       if (UART1_Data_Ready() <> 0) then    
  18.         begin
  19.           uart_rd := UART1_Read();        
  20.           UART1_Write(uart_rd);            
  21.           if (uart_rd = 'A') then portb.4 := 1;
  22.         end;
  23.        
  24.     end;
  25. end.
A hozzászólás módosítva: Nov 7, 2013
(#) progee válasza progee hozzászólására (») Nov 7, 2013 /
 
Nem pascal kód volt a hiba oka. Egy elkötés miatt nem működött.
(#) progee hozzászólása Nov 21, 2013 /
 
Valaki meg tudná mondani, hogy a timer1 időzítőt hogyan kell helyesen használni?
Hiába próbálom a leírások alapján, nem akar sikerülni a t1 változó számlálása.

  1. procedure Interrupt;
  2. begin
  3.   if PIR1.TMR1IF = 1 then
  4.   begin
  5.     inc(t1);
  6.     PIR1.TMR1IF := 0;
  7.   end;
  8. end;
  9.  
  10.  
  11. begin
  12.   T1CON.T1CKPS1  := 0;  
  13.   T1CON.T1CKPS0  := 0;  
  14.   T1CON.T1OSCEN  := 1;  
  15.   T1CON.SYNC_bit := 1;  
  16.   T1CON.TMR1CS   := 0;  
  17.   T1CON.TMR1ON   := 1;  
  18.   INTCON.PEIE    := 1;  
  19.   INTCON.GIE     := 1;    
  20.   PIE1.TMR1IE    := 1;
  21.   PIR1.TMR1IF    := 0;
  22.  
  23. ...
  24.  
  25. end.
(#) progee válasza progee hozzászólására (») Nov 22, 2013 /
 
Sikerült megoldanom. Így működik:
  1. T1CON.TMR1CS   := 0;  
  2.   T1CON.T1CKPS1  := 0;  
  3.   T1CON.T1CKPS0  := 0;
  4.   T1CON.TMR1ON   := 1;  
  5.   TMR1H          := 0;  
  6.   TMR1L          := 0;
  7.   INTCON.GIE     := 1;
A hozzászólás módosítva: Nov 22, 2013
(#) progee válasza progee hozzászólására (») Nov 22, 2013 /
 
Timer0 osztásával van viszont további problémám. Hiába állítom 0-ról 1-re a ps2, ps1, ps0 értékeit, az intrerruptban lévő számláló értéke ugyanolyan sebességgel növekszik. Mi hiányzik még a kódból?

  1. procedure Interrupt;
  2. begin
  3.   if INTCON.T0IF = 1 then
  4.   begin
  5.     inc(t0);
  6.     INTCON.T0IF:= 0;
  7.     TMR0 := 0;      
  8.   end;
  9. end;
  10.  
  11.   OPTION_REG.T0CS := 0;    
  12.   OPTION_REG.T0SE := 0;  
  13.   OPTION_REG.PSA  := 0;  
  14.   OPTION_REG.PS2  := 1;
  15.   OPTION_REG.PS1  := 1;
  16.   OPTION_REG.PS0  := 1;
  17.   TMR0            := 0;    
  18.   INTCON.T0IE     := 1;    
  19.   INTCON.GIE      := 1;
(#) robing16 hozzászólása Dec 1, 2013 /
 
Sziasztok!

Egy kis segítséget szeretnék kérni, mert nem értem az I2C folyamatát egy PIC 16F887 -ben.

A célom az lenne, hogy egy Raspberry PI -t I2C master-ként, folyamatosan lekérdezek értékeket egy PIC16F887 -es IC-ről. Találtam egy MicroC -ben megírt példaprogramot, amit átírtam MikroPascal nyelvre.

Jelenleg most úgy működik, hogy ha az eszközre írok egy adatot, azt a PORTB -re kirakja. Ha beolvasok adatokat, akkor meg a programban megadott 234-es értéket kellene vissza kapnom! Ez így működik is, csak annyi a szépséghibája, hogy olvasásnál a regiszter címzést a PORTB-re íratja ki.

Raspberry kódok:
bus.read_byte_data(DEVICE,0x00) // Olvasom az adott eszközről a 0x00 -ás regiszterben lévő adatot
bus.write_byte_data(DEVICE,0x00,0x20) // Írok a 0x00 regiszterbe 0x20 -as értéket
A DEVICE változó a 0x34, amit a definiáláskor megadtam.

A Raspberryben a fent leírt két módon szoktam adatot olvasni és írni. Hasonló megoldást szeretnék eléni, mint pl. az MCP23017 -es IC-nek van.

Azt szeretném elérni, hogy ha mondjuk a PIC 0x20 -as címére ráírok egy bármilyen értéket, akkor a PORTB -n jelenjen meg. Ha 0x30 -as címére írok rá, az meg a PORTD-re kerüljön ki.

Ugyan így olvasásnál. 0x20 -nál a PORTB értékét tudjam beolvasni, 0x30-nál pedig a PORTD értékét.

Természetesen lenne még két regiszter, ahol a portok olvasását/írását tudnám beállítani, de ezzel elbűvészkedek én is

Az lenne a kérdés, hogy a megszakításnál hol, milyen módon és mit kell összehasonlítani, hogy a fent említett megoldás megszülessen?

A válaszokat előre is köszönöm

  1. program I2C_Slave;
  2.  
  3. { Declarations section }
  4.  
  5. // Valtozok definialasa
  6. var tx_data   : byte;
  7. var rxbuffer  : byte;
  8. var j         : byte;
  9.  
  10. // Allando valtozok definialasa
  11. const Addy = 0x69;                    // Megadjuk az eszkoz cimet
  12. const Delay_Time = 250;               // Portfigyeles kozotti ido
  13.  
  14. Procedure Setup;
  15.  begin
  16.   ADCON1 := 0;                          // All ports set to digital
  17.   TRISA := 0;  PORTA := 0;              // Set PORTA as output
  18.   TRISB := 0;  PORTB := 0;              // Set PORTB as output
  19.   TRISD := 0;  PORTD := 0;
  20.  
  21.   PORTD.0 := 1; PORTD.1 := 1;
  22.   delay_ms(1300);
  23.   PORTD.0 := 0;
  24.   delay_ms(600);
  25.   PORTD.1 := 0;
  26.   delay_ms(400);
  27.   TRISC := 0xFF;                        // PORTC-t inputra allitjuk
  28.   SSPADD :=  Addy;                      // Beallitjuk az eszkoz cimet
  29.   SSPCON := 0x36;                       // Beallitjuk az I2C Slave modot
  30.   PIE1.SSPIF := 1;                      // Engedelyezzuk az SSPIF megszakitasvezerlot
  31.   INTCON := 0xC0;                       // Engedelyezzuk a globalis megszakitasvezerlot
  32.  end;
  33.  
  34. Procedure Interrupt;
  35.  begin
  36.  if PIR1.SSPIF = 1 then
  37.   begin
  38.   PIR1.SSPIF := 0;                       // Vissza állítjuk az Interrupt FLAG-et.
  39.  
  40.  if SSPSTAT.R_W = 1 then               // 1 - READ olvasási BIT-et kaptunk
  41.    begin
  42.  
  43.    SSPBUF := 234;                      // tx_data;
  44.    SSPCON.CKP := 1;                    // Órajel levágás, Master felé nyuktázva
  45.    j := SSPBUF;
  46.    exit;
  47.    end;
  48.  
  49.   if SSPSTAT.BF = 0 then                 // Tároló televan, vagy üres. 0 = üres 1 = FULL
  50.    begin
  51.    j := SSPBUF;
  52.    exit;
  53.    end;
  54.  
  55.   if SSPSTAT.D_A = 1 then                // Data / Address -> 1 Data, 0 Address
  56.    begin
  57.    rxbuffer := SSPBUF;
  58.    j := SSPBUF;
  59.    exit;
  60.    end;
  61.  
  62.   j := SSPBUF;
  63.   end;
  64.  
  65.  end;
  66.  
  67.  
  68.  
  69. begin
  70.  Setup;
  71.   while true do
  72.    begin
  73.     PORTB   := rxbuffer;
  74.     tx_data := PORTC;
  75.     Delay_ms(Delay_Time);
  76.    end;
  77. end.
A hozzászólás módosítva: Dec 1, 2013
(#) progee válasza progee hozzászólására (») Dec 3, 2013 /
 
senkinek semmi ötlete a timerrel kapcsolatban?
(#) gthomas válasza robing16 hozzászólására (») Dec 3, 2013 /
 
Szia, pont most botlottam bele:

Gert van Loo wrote:
If you have a choice then don't use I2C for the connection as the Pi has a bug in its I2C interface.

Topic

A serial nem jó?
(#) robing16 válasza progee hozzászólására (») Dec 3, 2013 /
 
Szia!

Picit elvesztettem a fonalat, mivel először egy relé működtetéséről beszéltél, utána jött a Timer1, majd később a Timer0... Most akkor miről is van szó?

Ha Timer0 ban elakadok, először mindig a példaprogramot veszem elő!

A te kódodban nem látom a következő sor egyik részét
INTCON := 0x20; // Set T0IE, clear T0IF
Itt azt írják helyesen, hogy a T0IE -t 1-re húzzák, amivel vissza állítják a túlcsordulást engedélyező bitet, (Bár nem tudom, hogy egyáltalán ez a Bit túlcsordulásnál megváltozik-e) majd a T0IF -et viszont 0-ra húzzák, hogy a túlcsordulási zászló alaphelyzetbe álljon.

A példaprogramban még egy osztó is található a fő program részben, ahol még egy számláló segít a lassításban. Ennyi ötletem lett hirtelen

  1. program Timer0_Interrupt;
  2. var counter : word;
  3.  
  4. procedure Interrupt();
  5.   begin
  6.     Inc(counter);             // Increment value of counter on every interrupt
  7.     TMR0   := 96;
  8.     INTCON := 0x20;           // Set T0IE, clear T0IF
  9.   end;
  10.  
  11. begin
  12.   OPTION_REG := 0x84;       // Assign prescaler to TMR0
  13.   ANSEL  := 0;              // Configure AN pins as digital I/O
  14.   ANSELH := 0;
  15.   TRISB := 0;               // PORTB is output
  16.   PORTB := 0xFF;            // Initialize PORTB
  17.   TMR0  := 96;              // Timer0 initial value
  18.   INTCON := 0xA0;           // Enable TMRO interrupt
  19.   counter := 0;             // Initialize counter
  20.  
  21.   while TRUE do
  22.     begin
  23.       if (counter = 400) then
  24.         begin
  25.           PORTB := not PORTB;       // Toggle PORTB LEDs
  26.           counter := 0;             // Reset counter
  27.         end;
  28.     end;
  29. end.
(#) robing16 válasza gthomas hozzászólására (») Dec 3, 2013 /
 
Szia!

Furcsa, hogy ezt írják, hisz eddig nem nagyon találkoztam I2C hibával. Nagyon sokáig teszteltem egy másik projektemben az MCP23017 -es IC-t, remekül működik a mai napig.

Az én esetemben most reléket kellene rákötni egy 16F887-es IC-re, amit I2C -n keresztül vezérelve ki-be kapcsolgatok, és ez mellett 3db DS18B20 -as hőmérséklet IC-t is hozzá kellene csatolnom az IC-hez.

A példaprogramból amúgy addig jutottam, hogy a megszakítást a SSPBUF telítettségi értéke indítja el a megszakítást, és a megszakítás eléggé gyorsan lefut. Tehát elméletileg, ha megjön az első érték, ami írásnál, vagy olvasásnál a regiszter címet mondja meg, azt kellene először összehasonlítanom az előre definiált értékkel, majd a következő megszakításnál egy, a regiszter címhez írt rutint kellene végrehajtania?

Vagy esetleg, ha bejön mind a két adat (írásnál a regiszter és az adat), akkor utána kell valami feltételben definiálni?

És akkor itt a másik kérdés, hogy az eszköz ID-ját ki, vagy mi ellenőrzi? A sotfvware, vagy a hardware? Hisz a program legelején SSPADD := Addy; beadjuk az address-t és pont.
(#) progee válasza robing16 hozzászólására (») Dec 4, 2013 /
 
Valójában az összes időzítővel szenvedek valamilyen hibával.
Maradjunk a timer0-nál egyenlőre.

A INTCON := 0x20; szerintem azért felesleges az interrupt-ba, mert a INTCON.T0IF:= 0; nullára állítja a T0IF bitet, a T0IE bit értéke pedig az inicializáláskor már 1-re lett állítva.
A counter változó számlálásával valóban lehetséges a késleltetés, viszont szeretném megérteni a timer teljes működését, amiben az OPTION_REG.PSA PS2..PS0 bitekkel lehetne megoldani a problémát. És ezt nem sikerül működésre bírnom.
(#) gozi válasza progee hozzászólására (») Dec 4, 2013 /
 
Próbáld ki az alábbi programot, és hasonlítsd össze a kapott eredményt a saját programkódoddal:
http://www.libstock.com/projects/view/398/timer-calculator
(#) Ktulu válasza progee hozzászólására (») Dec 4, 2013 /
 
Szia.
Ezzel a minimális kiegészítéssel próbáltam, és jól működik. (Proteus szimulátor PIC16F877A)
Mindent úgy állítottál be, ahogy kell.

  1. program MyProject;
  2.  
  3.  var t0:byte;
  4.  
  5.       procedure Interrupt;
  6.       begin
  7.         if INTCON.T0IF = 1 then
  8.         begin
  9.           inc(t0);
  10.           INTCON.T0IF:= 0;
  11.           TMR0 := 0;
  12.           PortB.1:=not(PortB.1);
  13.         end;
  14.       end;
  15.  
  16. begin
  17.         OPTION_REG.T0CS := 0;
  18.         OPTION_REG.T0SE := 0;
  19.         OPTION_REG.PSA  := 0;
  20.         OPTION_REG.PS2  := 0;
  21.         OPTION_REG.PS1  := 0;
  22.         OPTION_REG.PS0  := 0;
  23.         TMR0            := 0;
  24.         INTCON.T0IE     := 1;
  25.         INTCON.GIE      := 1;
  26.         CMCON := 7;
  27.         TrisB:=0;
  28.         PortB:=0;
  29. end.
A hozzászólás módosítva: Dec 4, 2013
(#) progee válasza Ktulu hozzászólására (») Dec 4, 2013 /
 
Köszönöm mindenkinek a segítséget!
Úgy gondolom, hogy három hibát vétettem egyszerre.
- Az első, hogy az option_reg és intcon regisztereknek nem minden bitjét állítottam be, így alapértelmezetten azok 1-es értéket vettek fel.
- A második, hogy az interrupt-ban számlált változó értékét a PORTB lábakra kötött LCD-n írattam ki, így ez bezavarhatott a portok megszakítás engedélyezésébe.
- A harmadik hiba, hogy változóból próbáltam átadni inicializáláskor a PSA, PS2, PS1, PS0 értékeit, és a változóknak ugyanezeket a neveket adtam. Míg procedure-ban deklaráltam ezeket a változókat, addig nem is panaszkodott a fordító, csak amikor globális változók közzé helyeztem át őket.
Én nem szeretem hexa értékkel beállítani a regisztereket, mert akkor nem látom a forrásban világosan, hogy mely bitek hogyan is állnak.
Így készítettem el az inicializáló részt, ami végre működik sebességosztással is:
  1. procedure timer0_init(oszto: word);
  2. var t0_psa, t0_ps0, t0_ps1, t0_ps2: byte;
  3. begin
  4.   case oszto of
  5.     1:   begin t0_psa:= 1; t0_ps2:= 0; t0_ps1:= 0; t0_ps0:= 0; end;
  6.     2:   begin t0_psa:= 0; t0_ps2:= 0; t0_ps1:= 0; t0_ps0:= 0; end;
  7.     4:   begin t0_psa:= 0; t0_ps2:= 0; t0_ps1:= 0; t0_ps0:= 1; end;
  8.     8:   begin t0_psa:= 0; t0_ps2:= 0; t0_ps1:= 1; t0_ps0:= 0; end;
  9.     16:  begin t0_psa:= 0; t0_ps2:= 0; t0_ps1:= 1; t0_ps0:= 1; end;
  10.     32:  begin t0_psa:= 0; t0_ps2:= 1; t0_ps1:= 0; t0_ps0:= 0; end;
  11.     64:  begin t0_psa:= 0; t0_ps2:= 1; t0_ps1:= 0; t0_ps0:= 1; end;
  12.     128: begin t0_psa:= 0; t0_ps2:= 1; t0_ps1:= 1; t0_ps0:= 0; end;
  13.     256: begin t0_psa:= 0; t0_ps2:= 1; t0_ps1:= 1; t0_ps0:= 1; end;
  14.   end;
  15.  
  16.   TMR0               := 0;       //Timer0 számláló nullázása
  17.  
  18.   OPTION_REG.RBIE    := 0;       //PortB megszakítás engedélyezése / tiltása
  19.   OPTION_REG.INTEDG  := 0;       //RB0 INT megszakítás engedélyezése / tiltása
  20.   OPTION_REG.T0CS    := 0;       //Óra választás:   1 - Külső időzítő az RA4 lábon   0 - Belső ciklus óra
  21.   OPTION_REG.T0SE    := 0;       //RA4/TOCKI  Alacsony és magas átmenet közötti váltás, ha külső számlálót használunk: 0=low/high (pozitív impulzusok) / 1=high/low (negatív impulzusok)
  22.   OPTION_REG.PSA     := t0_psa;  //Időzítő kapcsoló:  1 - WDT-n keresztül    0 - PS0, PS1, PS2 figyelembevétele késleltetéshez
  23.   OPTION_REG.PS2     := t0_ps2;  //Sebesség osztó beállítások (PS2, PS1, PS0)
  24.   OPTION_REG.PS1     := t0_ps1;
  25.   OPTION_REG.PS0     := t0_ps0;
  26.  
  27.   INTCON.GIE         := 1;       //Globális megszakítás engedélyezése
  28.   INTCON.PEIE        := 0;       //Perifériás megszakítások engedélyezése / tiltása (PortB, RB0/Int)
  29.   INTCON.T0IE        := 1;       //Timer0 engedélyezése
  30.   INTCON.INTE        := 0;       //RB0 INT Sleep felébresztés engedélyezése / tiltása
  31.   INTCON.RBIE        := 0;       //PortB állapotváltozása miatti megszakítás engedélyezése / tiltása
  32.   INTCON.T0IF        := 0;       //TMR0 túlcsordulásának állapota (0- nem csordult túl, 1- Túlcsordult)
  33.   INTCON.INTF        := 0;       //RB0/Int port megszakítás állapota (0- nem történt megszakítás, 1- megszalítás történt)
  34.   INTCON.RBIF        := 0;       //PortB állapotváltozása miatti megszakítás állapota (0- nem történt megszakítás, 1- megszalítás történt)
  35. end;


A kommentekben remélem nem írtam nagy hülyeségeket. Próbáltam magyarul megfogalmazni, melyik bit mire is jó.
A hozzászólás módosítva: Dec 4, 2013
(#) robing16 válasza progee hozzászólására (») Dec 4, 2013 /
 
Szia! A Counter tényleg nem szükséges, ellenben, mikor a timer -eket nézegettem, nem volt oszcilloszkópom, és váltig állítottam, hogy a 20MHz-es kvarc remek lesz Igen, akkor, ha komolyabb munkába akarok fogni. Nálam akkor a LED counter nélkül világított, illetve vibrált. Akkor én is próbálgattam az osztókat

Mégvalami! Nekem nagyon tetszett az, mikor a goolge-ban rákerestem egy Timer kalkulátorra. Ott ha jól emlékszek, beadom, hogy milyen kvarc-om van, és hogy mit szeretnék vissza kapni, és a kis webes program kidobta a beállításokat

PIC Timer Calculator

Közben látom, hogy gozi is belinkelt egy kalkulátoros linket
A hozzászólás módosítva: Dec 4, 2013
(#) progee válasza robing16 hozzászólására (») Dec 5, 2013 /
 
Igen ismerem a programot.
Hiányolom belőle a regiszterek összes bitjének beállítását.
Próbáltam a segítségével órát készíteni egy 16F628A PIC-re. 4Mhz-es belső oszcillátorral.
A program által megadott beállításokkal 1ms-os megszakításokat kellett volna kapnom 1:4 osztó (PSA := 1 mellett) és TMR0 := 6 beállításával.
Sajnos nagyon pontatlan lett a végeredménye.
Ha a TMR0-át 60-ra állítom akkor már közelít a valósághoz, de abban az esetben is 10 percen belül 3mp-es késéssel működik. Az interrupt részben így számolom az időt:
  1. var o, p, mp: byte;
  2. var ms: word;    
  3.  
  4. procedure Interrupt;  
  5. begin
  6.   if INTCON.T0IF = 1 then
  7.   begin
  8.     TMR0 := 60;    
  9.     INTCON.T0IF:= 0;
  10.     inc(ms);
  11.     if ms = 1000 then
  12.     begin
  13.       inc(mp);
  14.       ms := 0;
  15.       if mp = 60 then
  16.       begin
  17.         inc(p);
  18.         mp := 0;
  19.         if p = 60 then
  20.         begin
  21.           inc(o);
  22.           p := 0;
  23.         end;
  24.       end;
  25.     end;
  26.   end;
  27. end;


Nem tudom, hogy az oszcillátor ennyire pontatlan, vagy a kódban van-e hiba.
A hozzászólás módosítva: Dec 5, 2013
(#) gthomas válasza robing16 hozzászólására (») Dec 6, 2013 /
 
Szia!
Linux oldalon miben programozol? Csak érdeklődés képen, mert nekem is itt van az asztalomon egy PI, ha lenne időm én is foglalkoznék vele egy kicsit. Nekem egy Lazarus van rajta egyenlőre.
(#) Hp41C válasza progee hozzászólására (») Dec 6, 2013 /
 
Ha mindenárom timer0 -val szeretnéd megoldani: Bővebben: Link
Timer2 -vel egyszerűen lehet 4MHz -es órajelből 1ms, 10ms -os periódikus megszakításkérst előállítani.
(#) progee válasza Hp41C hozzászólására (») Dec 6, 2013 /
 
Timer2-t hogyan kell paraméterezni egy pontos órához?
Timer0-val hiába próbálkozok, csak közelítőleg pontos időt kapok vissza.
Proteusban tesztelem a kapcsolást, így a PIC kristály pontatlanságát kizárom mint hibalehetőséget.
Azt tapasztalom, hogy az LCD-re kiíratott idő, mintha néha, kb 3-4 mp-ként később váltaná a mp-et.
Az interrupt-ot szinte teljesen kiürítettem, csak egy számláló, meg a működéséhez szükséges TOIF és TMR0 beállítások vannak benne.
Következő: »»   24 / 29
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