Fórum témák

» Több friss téma
Fórum » PIC18F4550
 
Témaindító: plokmi, idő: Szept 10, 2006
Témakörök:
Lapozás: OK   3 / 4
(#) watt válasza watt hozzászólására (») Júl 24, 2011 /
 
Most látom, hogy a képlet szétesett:
  1. [(PR2) + 1] * 4 * TOSC * (TMR2 Prescale Value)

Még annyit, hogy nekem 32MHz a Fosc (TOSC=1/Fosc).
(#) Soós Antal válasza watt hozzászólására (») Júl 26, 2011 /
 
Kösz még egyszer!
Komenteket magnak írom, hogy tudjam mit mire állítottam nem gépelgetem a regiszterek nevét.

Azt el kell ismerni hogy így tényleg átláthatóbb, és nem kell egyből az adatlap ha valamit át akarok állítani
Kérdés nem gyorsabb a soft ha egy be írom be a regiszter értékét nem pedig bitenként??

Akkor így tervezem! PR2=255; 10 fokozatban 10% ként tehát egy fokozat a 10 bites számlálón kb 100 egység
Az alsó két bittel meg nem is érdemes jelen estben foglakozni!
Tehát csak a CCPR1L növelem 5 - 255 10 lépésben 25 egységenként
(#) watt válasza Soós Antal hozzászólására (») Júl 26, 2011 /
 
Ezeket nem állítgatod állandóan, így mindegy, hogy inicializálásnál hány programlépés, egy vagy akár 8.

A tervet ki kell próbálnod, meglátod jó-e. Elrontani nem nagyon tudod...
(#) icserny válasza Soós Antal hozzászólására (») Júl 26, 2011 /
 
Idézet:
„nem gyorsabb a soft ha egy be írom be a regiszter értékét nem pedig bitenként?”
De igen. Viszont az alábbihoz hasonló sorok nehezen értelmezhetők:
  1. T0CON = 0x05;

Olvasmányosabb (öndokumentáló) lesz a program, ha az egyes bitekhez makrókat definiálunk, ahogy a Microchip támogatói könyvtárában is csinálják. A fenti sor megfelelője pl. így néz ki:
  1. T0CON = T0_16BIT | T0_SOURCE_INT | T0_PS_1_64;

A makrókat a C18 fordítóhoz tartozó timers.h állomány definiálja.
(#) watt válasza icserny hozzászólására (») Júl 26, 2011 /
 
Ezzel az a bajom, hogy eltávolít a hardvertől, ami nem mindig szerencsés. Szinte soha nem használom az osztályokat, főleg az usart-ot, mert az agyrém, hogy egy sorért külön szubrutint kell hívni. C-ben majdnem úgy programozom, mint asm-ban és úgy gondolom így a két nyelvet jól lehet ötvözni.
(#) Soós Antal válasza icserny hozzászólására (») Júl 27, 2011 /
 
Hello

Watt értek egyet a bitenkinti megoldás szerintem maximálisan érthető! Ha meg valami makrot szertnék mert egy műveletet többször használok akkor magam írok egy "makrót"

pl így

#define lcd_parancs() LATBbits.LATB5=0; // RB5 LCD Register Select Parancs
#define lcd_adat() LATBbits.LATB5=1; // RB5 LCD Register Select Adat

Az összes kimenetet és bemenetet így elnevezem az elején így C ben egyszerű őket kezelni és soft többi része jól elválik a hardvertől!

Ha máshova kötök valamit csak egy helyen kell átírnom


Ja és a gyári makró ugyan úgy angol akkor megmár inkább bitenként minthogy újabb parancsokat keressgesek
(#) l0rika hozzászólása Ápr 28, 2013 /
 
Hali

Én is ugyan ezzel a típussal kínlódok. Az USB kommunikáció működik. Most egy sima ledvillogtatást akarok létrehozni a megszakítások segítségével, azonban a megszakításban nem indítja újra a timert. Poling-al működik, ezért gondolom, hogy a megszakítással lehet a gond. A megszakítások engedélyezve vannak, másképp egyszer sem ugrana bele. Két napja nézegetem és próbálgatom de semmi. Mi lehet a gond? A microchipnek a demo programját alakítottam át.

MPlabot használok, c18-al kompillálom és c-ben programozok.
(#) watt válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
Kód nélkül nem sokat lehet mondani...
(#) l0rika válasza watt hozzászólására (») Ápr 28, 2013 /
 
Bocsi...igazad van. Leírom ide is, viszont csatolom az Mplab projektet is, ha úgy átlátható. Mint írtam a microchip demo programját alakítottam át.



  1. /** I N C L U D E S **********************************************************/
  2. #include <p18cxxx.h>
  3.  
  4. int j = 500;
  5. /** V A R I A B L E S ********************************************************/
  6. #pragma udata
  7.  
  8. /** P R I V A T E  P R O T O T Y P E S ***************************************/
  9.  
  10. /** V E C T O R  R E M A P P I N G *******************************************/
  11.  
  12. extern void _startup (void);        // See c018i.c in your C18 compiler dir
  13. #pragma code _RESET_INTERRUPT_VECTOR = 0x000800
  14. void _reset (void)
  15. {
  16.     _asm goto _startup _endasm
  17. }
  18. #pragma code
  19.  
  20. #pragma code _HIGH_INTERRUPT_VECTOR = 0x00808
  21. void _high_ISR (void)
  22. {
  23.  
  24.     if  (PIR1bits.TMR1IF)
  25.     {      
  26.                 if (j == 0)
  27.                 {        
  28.                         LATDbits.LATD0 =! LATDbits.LATD0 ;
  29.                         j = 500;
  30.                 }
  31.  
  32.                 TMR1H = 0xF4;
  33.                 TMR1L = 0x6D;
  34.  
  35.                
  36.                 PIR1bits.TMR1IF = 0;     // clear flag  
  37.                 j--;      
  38.     }
  39.  
  40. }
  41.  
  42. #pragma code
  43.  
  44. /** D E C L A R A T I O N S **************************************************/
  45. #pragma code
  46.  
  47. void main(void)
  48. {
  49.    
  50.  
  51.         ADCON1bits.PCFG3 = 1;
  52.         ADCON1bits.PCFG2 = 1;
  53.         ADCON1bits.PCFG1 = 1;
  54.         ADCON1bits.PCFG0 = 1;
  55.  
  56.         TRISDbits.TRISD0 = 0;
  57.         TRISDbits.TRISD1 = 0;
  58.         TRISDbits.TRISD2 = 0;
  59.         TRISDbits.TRISD3 = 0;
  60.  
  61.         LATDbits.LATD0 = 0;
  62.         LATDbits.LATD1 = 0;
  63.  
  64.        
  65.  
  66.         RCONbits.IPEN = 1;
  67.         INTCONbits.GIE = 1;
  68.         INTCONbits.PEIE = 1;
  69.  
  70.         PIR1bits.TMR1IF = 0;
  71.  
  72. //                                                                                              timer1 config
  73.         PIE1bits.TMR1IE = 0;
  74.         IPR1bits.TMR1IP = 1;
  75.  
  76.         T1CONbits.T1CKPS1 = 0;
  77.         T1CONbits.T1CKPS0 = 0;
  78.  
  79.         T1CONbits.RD16 = 0;
  80.         T1CONbits.T1OSCEN = 0;
  81.         T1CONbits.TMR1CS = 0;
  82.  
  83. //                                                                                              end timer1 config
  84.  
  85.  
  86.         T1CONbits.TMR1ON = 1;
  87.        
  88.  
  89.  
  90.  
  91.  
  92.         T1CON = 0b10000001;
  93.         TMR1H = 0xF4;
  94.         TMR1L = 0x6D;
  95.  
  96.  
  97.        
  98.         while (1)
  99.         {
  100.                        
  101.         }
  102.  
  103.  
  104. }//end main

Demo02.zip
    
(#) l0rika hozzászólása Ápr 28, 2013 /
 
Jaaaj...

A T1CON = 0b10000001; sor az utóbbi próbálgatásom műve.
Ugyanakkor a PIE1bits.TMR1IE = 0; is csak próbálgatás. Valójában PIE1bits.TMR1IE = 1;-el próbáltam és úgyem működött.
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 / 1
 
Szia!
Bár ilyenkor 86millió include fájlon át történik a fordítás (ezért is maradok inkább az asm-nél), de próbáld meg a megszakításvektort átírni 0x08-ra.
Tehát
  1. #pragma code _HIGH_INTERRUPT_VECTOR = 0x00808

ehelyett így:
  1. #pragma code _HIGH_INTERRUPT_VECTOR = 0x08
(#) watt válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
Bootloaderes a project?
Próbáld mindkét megszakítás vektort létrehozni, akkor is, ha nem használod. Ha véletlenül beleszakít valami, az keveredést okoz.
(#) l0rika válasza zenetom hozzászólására (») Ápr 28, 2013 / 1
 
Először 0x08-al csináltam mert a kontroller datasheet-ében is írta, hogy ezen a címen van a magas szintű megszakításvektor, de úgy nem lesz hely a resetnek, mivel bootloaderes és annak kell az elején a hely. Sajnos nem hiába csinálták másképp a demóban.
(#) l0rika válasza watt hozzászólására (») Ápr 28, 2013 /
 
Igen...bootloaderes

A másik megszakítás vektort azért vettem ki mivel ha írtam valamit az elsőbe a másodiknak már nem volt hely. Esetleg megpróbálom a memóriatérképét átrendezni és több helyet hagyni a megszakításoknak.
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 / 1
 
Ja igen, ráaádásul bootloaderes. Az megkavarja rendesen a dolgokat.
(#) l0rika válasza watt hozzászólására (») Ápr 28, 2013 /
 
Ígysem müxik Átírtam az lkr-t, hogy több hely legyen a vektoroknak de ugyanaz a hiba.

Teljesen tanácstalan vagyok. Egyszer beleugrik viszont utána vagy nem indítja el a timert vagy nem ugrik bele a rutinba.
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
Na kipróbáltam MPLAB szimulátorban, és az a hibajelenség, amit írtál.
Csak egyszer csordul túl a Timer1, utána már nem hajlandó belépni a megszakításba.
Valószínűleg a Timer1 huncutkodik. A következő túlcsorduláskor a TMR1 regiszter nem nullát vesz fel, hanem 65282-t, illetve a számunkra hozzáférhető regiszter. A belső, számunkra nem hozzáférhető regiszter normálisan működik. Valahol olvastam, hogy lehet ezt a hibát elkerülni, mindjárt megpróbálom előkeresni.
(#) l0rika válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
Nem csak a timer1-es teszi az eszét hanem a timer0 is...a többit nem próbáltam. De ha nem megszakítással csinálom akkor működik jól mindkettő. Érdekes.
MPlab-ban lehet követni a regiszterek értékét?
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
MPLAB-ban mindent lehet.
De megtaláltam a hiba okát.
A megszakításban az INTCON 7. bite nullázódik, azt újra 1-be kell állítani.
  1. PIR1bits.TMR1IF = 0;     // clear flag  
  2. INTCON = 0b11000000;

Továbbá az initnél Timer1 vezérlőt át kell állítani, hogy 2db 8 bites regiszterként kezeled a számlálóját.
  1. T1CON = 0b00000001;
A hozzászólás módosítva: Ápr 28, 2013
(#) Hp41C válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
A TMR1H kiolvasása bufferelt, akkor tárolódik bele a belső timer értéke, amikor a TMR1L -t kiolvassuk. A Watch ablakban a TMR1_Internal -t kell kiválasztani.
A hozzászólás módosítva: Ápr 28, 2013
(#) zenetom válasza Hp41C hozzászólására (») Ápr 28, 2013 /
 
De ha a T1CON 7. bitét (RD16) 0-ba állítom,
Idézet:
„Enables register read/write of Timer1 in two 8-bit operations”
akkor már jól működik, gondolom ez a bufferes dolog csak akkor igaz, ha az "RD16" bit 1-be van állítva.
A hozzászólás módosítva: Ápr 28, 2013
(#) Hp41C válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
Idézet:
„A megszakításban az INTCON 7. bite nullázódik, azt újra 1-be kell állítani.”

Ez tilos, a retfie -re kell bízni.
(#) l0rika válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
És működik!!! Ezer hála

Esetleg még egy annyit elmondanál, hogy hogyan jöttél rá a problémára? Hol nézted meg az egyes regiszterek értékét? Nem másért csak ha megint problémába ütközök ne kelljen napokat kínlódnom.
(#) zenetom válasza Hp41C hozzászólására (») Ápr 28, 2013 / 1
 
Na megnéztem jobban a megszakítást disassembly-ben.
Furcsálltam is ezt az INTCON 7. bitet, hisz sose kellett állítani, most hogy írod, eszembe us jutott hogy a RETFIE állítja vissza. Szóval a dissasemblyben a megszakításból nem RETFIE-vel tér vissza, hanem RETURN-nal. Ezért nem állítódik az INTCON.
Valószínűleg nem tudja a fordító, hogy megszakítással van dolga, tudatni kéne vele.
Sajnos most nincs időm kijavítani a kódot, de legalább a hiba forrása már megvan.
Szóval rosszul van deklarálva a megszakítás szubrutina.
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
Ez így nem a legjobb megoldás, közben kiderült hogy más bajok (is) vannak, mint az előző hozzászólásban írtam, a megszakítást kezelő szubrutin nem jól tér vissza.
A hozzászólás módosítva: Ápr 28, 2013
(#) l0rika válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
Ez a szubrutin nem a bootloaderben van megírva? Ezt a microchip oldaláról töltöttem le.
(#) zenetom válasza l0rika hozzászólására (») Ápr 28, 2013 /
 
Lehet, de nem tudom biztosan, nem foglalkoztam még bootloaderrel.
(#) l0rika válasza zenetom hozzászólására (») Ápr 28, 2013 /
 
Most ez megy, remélem, hogy más problémába nem ütközöm.

Köszönöm szépen mindenkinek aki megpróbált segíteni(és annak is aki segített is).
(#) l0rika hozzászólása Ápr 29, 2013 /
 
Na vége az örömnek...az egész megszakítás rendszer kaotikusan működik. Az érdekes, hogy ha nincs rajta bootloader akkor tökéletesen megy minden. Ebből azt következtettem ki, hogy a memóriatérképpel lehet gond, mivel csakis az változik a bootloader feltételekor. A linker scriptet próbáltam buherálni de akkor a cdc demó nem megy. A gyári linkert használom amit a demo programokban is használnak.
Gondoltam, hogy PIC hiba, de egy másikkal sem működött...sőt egy másik panelon sem.
Nem tudjátok honnan tudnék letölteni működő linker scriptet?
(#) zenetom válasza l0rika hozzászólására (») Ápr 29, 2013 / 2
 
Az INTCON bit állításával lesz a baj, mert azt a RETFIE utasításnak kéne visszaállítania.
Rakd fel az egész bootloados projektet!
Következő: »»   3 / 4
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