Fórum témák
» Több friss téma |
Most látom, hogy a képlet szétesett:
Még annyit, hogy nekem 32MHz a Fosc (TOSC=1/Fosc).
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
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...
Idézet: De igen. Viszont az alábbihoz hasonló sorok nehezen értelmezhetők:„nem gyorsabb a soft ha egy be írom be a regiszter értékét nem pedig bitenként?”
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:
A makrókat a C18 fordítóhoz tartozó timers.h állomány definiálja.
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.
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
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.
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.
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.
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
ehelyett így:
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.
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.
![]()
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.
Ja igen, ráaádásul bootloaderes. Az megkavarja rendesen a dolgokat.
![]()
Ígysem müxik
![]() ![]() Teljesen tanácstalan vagyok. Egyszer beleugrik viszont utána vagy nem indítja el a timert vagy nem ugrik bele a rutinba.
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.
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?
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.
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.
A hozzászólás módosítva: Á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
De ha a T1CON 7. bitét (RD16) 0-ba állítom,
Idézet: 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. „Enables register read/write of Timer1 in two 8-bit operations” A hozzászólás módosítva: Á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.
É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.
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.
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
Ez a szubrutin nem a bootloaderben van megírva? Ezt a microchip oldaláról töltöttem le.
Lehet, de nem tudom biztosan, nem foglalkoztam még bootloaderrel.
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 ![]()
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? |
Bejelentkezés
Hirdetés |