Fórum témák
» Több friss téma |
Kiszedtem belőle amit írtál +
Át írtam egyszerűbbre az egészet, a pwm megy, a timer rész nem ezek
Konkrétan úgy működik, hogy kinyitom az ajtót, bekapcsol a led. Ha kinyitva hagyom, akkor a 15mp után is világít a mindörökségig. Ha bezárom, akkor kellene 5mp-ig világítani + 3mp pwm, erre csak simán a pwm fut le Jelenleg erre írtam át:
A hozzászólás módosítva: Jún 6, 2024
Ha jól látom, Timer2-t használod időzítésre is, miközben az a PWM generálásához van rendelve. Megy egyáltalán a kettő egyszerre? Dereng valami, hogy annó próbáltam valamilyen PIC-en de nagyon nem volt jó. Lehet, hogy keverem valamivel, már nem emlékszem. Próbaképpen időzítésre használd a Timer1-et vagy a Timer0-át.
Szia!
Feltennéd a jelenlegi teljes kódod?
Ebben sok gond lehet szerintem.
Első: Nem tudom, hogy interruptban, vagy miben változik a szamlalo. Tuti kell ide a static? Ezt nem tudom, kérdezem. Ez miért ilyen? #define HA_IDO ((HALV_IDO/255)*255-1) Osztod is, meg szorzod is ugyanannyival. Szerintem a feltétel rendszered is hibás, de nem látom át egyelőre, kellene minden kód.
A kódod most nehezen átlátható, jobb lenne kiszervezni pár kis függvényt, és azokat meghívni a megfelelő if-ben. Úgy átláthatóbb lenne.
A jelenlegi if feltételekben a szamlalo NEM kap értéket, ha ki van nyitva és van gyújtás ÉS ha a szamlalo < HA_IDO kisebb! Bontsd kiesebb részegységekre például:
Több helyen is lehetne szerintem ilyenekkel egyszerűbbé tenni a kódod, de ahhoz kellene a teljes, hogy lássam. A hozzászólás módosítva: Jún 9, 2024
Ez a kód nekem nem tetszik.
Most fejből írom mindezt, lehet másképp van. Nem használ interrupot, kikapcsolja mind a Timer2 mind a globális interruptot. Akkor hogy lesz az interrupt flag 1, amire hivatkozik a for(; után rögtön? A for helyett is lehetne While(); PIE1=0; Egy egész regiszter értéke nulla. Ebben a regiszterben kellene bekapcsolni a timer2 interruptot is: 16. oldal DE nem teszi, így a flag soha nem lesz 1. (szerintem) Ok, lehet én is sokat hibázok, mert felületesen nézem a kódod, de így nem lesz jó. Látom, hogy ennél a PIC-nél a timer2 másképp van, mint ahogy nálam volt. Lépésről lépésre kell haladni, főleg a PIC-nél, az nem olyan mint az Arduino. Érdemes például Timer0, Timer1 stb. függvényeket írni, ahol van init, stop, start függvény. Ezeket ki kell szervezni .c és .h fájlokba, és include-olni. Ezeket tesztelni kell keményen. Utána lehet PWM-et is előállítani ugyanígy, például PWM_init, PWM_Satart, PWM_stop függvényekkel, mert akkor a kitöltési tényezőt lehet változtatni például egy Timer0-ban is.... Ez jó lehet például az oszcillátor init-re is, amit szintén nem látok, hogy hol miképp van beállítva. Szerintem túl sok így a hibalehetőség, persze lehet nem ez a hiba, de mintha tényleg ki lenne kapcsolva a global interrupt, ami miatt nincs flag, de tévedhetek. Illetve a PIC amit használtam külön interrupt függvényeket ad az ilyen esetekre, azaz a for(,,)-ban nem kell várni, mire oda jut a processzor. (mi ez a for(,,) pontosan?) Hát még valami:
Fordítva kellene. Így azt gondolom jobb lenne az elejéről írni a kódot, mert lehet sok a hiba. Ha kell segítség szólj, lépésről lépésre össze lehet ezt hozni.
Az a tiszta víz a pohárba:
1. Timer2 és a TMR2IF állapotbit kérdése. A TMR2IF bit működése és a megszakítás engedélyezése két külön dolog (ld. adatlap). Ha a TMR2 reriszter átfordul és az utóosztója is átfordul a TMR2IF bit 1 -re áll. Programból kell törölni. Akkor lesz belőle megszakítás, ha a TMR2IE és a PEIE valamint a GIE bitek is 1 értékűek. Ha ezek közül egy is 0, nem lesz megszakítás. 2. #define HA_IDO ((HALV_IDO/255)*255-1) kérdése. A műveleteket a fordítók a saját alapbeállításuk szerinti típussal végzik, mivel nincs megadva a változók típusa. A Hi-Tech C 32 bites egész típussal számol. Az osztás is egyész osztás. Így a sor egy kerekítési művelet. A Micro C a számítást az értékhez igazodó típussal végzi. Meg kellelne nézni, hogy mit számol ki. 3. PORTA - TRISA kérdés. Mindegy milyen sorrendben írjuk. A kérdés inkább az, hogy mi történjen, ha a kontrolleren a táp már megvan, de még nem indul el (Power On Reset Timer). Ha fontos, hogy a kimenet ilyenkor ne legyen aktív, gondoskodni kell kölső ellenállásssal az inaktív szintre való beállításról.
Én azt hittem, hogy timer2-nek nincs átfordulásra interrupt.
TMR2IF: Timer2 to PR2 Match Interrupt Flag bit 1 = Timer2 to PR2 match occurred (must be cleared in software) 0 = Timer2 to PR2 match has not occurred A Timer2-nek van overflow interruptja? Nem csak egyezésre? Az adatlapot nem néztem olyan mélyen át, nekem úgy tűnt, hogy ennél a típusnál nincs a timer2-nek, a timer1-nek és a timer0-nak van. Ezért írtam hogy más, mint amivel találkoztam eddig. A PR2-vel való egyezésre ad interuptot, ha jól értem. (most lehet keverem, mert épp Arduino Timer1 ComparA, ComparB, és overflow interrupt van a fejemben) A kódot felületesen olvasva egyik interrupt sincs engedélyezve, nincs erre függvény felhúzva, ebben az esetben lesz egyezés? Mikor? Idézet: „ 2. #define HA_IDO ((HALV_IDO/255)*255-1) kérdése. A műveleteket a fordítók a saját alapbeállításuk szerinti típussal végzik, mivel nincs megadva a változók típusa. A Hi-Tech C 32 bites egész típussal számol. Az osztás is egyész osztás. Így a sor egy kerekítési művelet. ” Ezt nem tudtam, köszi! De épp az ilyenek adják az okát, hogy ki legyen szervezve minden és tesztelve legyen rendesen minden, akár csak egy blink-kóddal is, amivel a timer-t ellenőrizni lehet könnyedén. Megnézem milyen van nekem itthon, azt tudom, hogy 16F, de nem tuti, hogy 648-as. A hozzászólás módosítva: Jún 9, 2024
Idézet: „ 3. PORTA - TRISA kérdés. Mindegy milyen sorrendben írjuk. A kérdés inkább az, hogy mi történjen, ha a kontrolleren a táp már megvan, de még nem indul el (Power On Reset Timer). Ha fontos, hogy a kimenet ilyenkor ne legyen aktív, gondoskodni kell kölső ellenállásssal az inaktív szintre való beállításról. ” Utána olvastam, azt mondták tényleg jobb bizonyos esetekben, hogy előbb az érték és utána a típusa. Azt írták, hogy ilyenkor tuti tudja előre mi lesz a kimeneten, mielőtt változtatna a port ki vagy bemenet típusán. Én előbb beállítottam minden esetben a Tris biteket, utána a Port-okat, bár futás közben soha nem változtattam a port lábain. Megpróbálom fejbe tartani.
Induláskor minden láb bemenet, amíg meg nem változtatod.
Idézet: „Én előbb beállítottam minden esetben a Tris biteket, utána a Port-okat” Ez így teljesen rendben is van. Idézet: „futás közben soha nem változtattam a port lábain.” Pl. 1-Wire használata esetén ha a kontroller nem ismeri a nyitott kollektoros kimeneti üzemmódot (többnyire ODCONx regiszter az újabb kontrollereken), akkor nincs más opciód.
Azt nem használtam dsPIC-ben soha, jó tudni ezt, legközelebb remélem eszembe is jut, hogy így is lehet, sőt pár esetben kell is.
De a témafelvető nem reagál, már kezdtem azt hinni lesz egy kis programozási feladat.
Idézet: „Utána olvastam” Én előtte szoktam utánaolvasni. A hozzászólás módosítva: Jún 9, 2024
Üdv!
Gépkocsimba szeretnék belső világítás vezérlést kreálni. Az eredei kódot nem én írtam, itt az oldalon találtam egy hasonlót amit mintaként szerettem volna némi átalakítással felhasználni. Az eredetit potyo készítette 2008-ban. Itt a linkben megtalálod. A 3. oldalon leírja miért ilyen a kód, az 5. oldalon fent van a hex. és c. is. Ő úgy oldotta meg, hogy nem használ interruptot. Én csak egy táki-máki ember vagyok, aki "talán" sejti hogy hogyan is kell ilyet csinálni. Azért csak a kód első részletét raktam fel, mert a delay és a pwm is benne van. A pwm megy, a számláló viszont sem timer2 vel, sem timer1-el nem működik. Idézet: „ Ez miért ilyen? #define HA_IDO ((HALV_IDO/255)*255-1) ” Nem tudom miért ilyen, de ez működik. Nem tudom, hogy ennek pl működnie kellene, de ez sem működik és nem értem miért:
Idézet: „ De a témafelvető nem reagál, már kezdtem azt hinni lesz egy kis programozási feladat. ” Ha gondolod leírom miről is szólna ez az egész, de gondoltam kilogikázom én, bár jelenleg úgy látszik túlnő rajtam
Ok, már értem, elolvastam a cikket is. Megpróbálok összedobni valamit ma és esetleg holnap. Nekem MPLAB-X, és Proteus van, azokban meg is írhatom és le is modellezhetem.
Jelentkezem, mikor van némi eredmény.
Nem sürgős, ha megvan majd megosztod.
Én sem nagyon leszek, a tegnapi vihar kicsapta a net modemet... Köszi! A hozzászólás módosítva: Jún 10, 2024
Időzítést meglehetoldani timer használata nélkül is. Én sem hsználtam a timer-t .Sima szoftveres alkalmazást használtam amikor megnyomtak egy menügombot. Abba beléoett ha nyugtázta az indítást elondittta PWM-t adottértékkel és ha bizonyos idő után nem történt újabb gomblenyomás (mert nem állította más értékre a PWm-t vagy nem nyugtázta az indtást akkor visszalépet a főmenübe és nullázta a PWM-t
Nem tudom ez melyik program nyelv de ezzel szamlalo= 3000; csak értéket adtál kell egy késleltető ciklus
Szia!
Még dolgozok rajta, nincs kész, de már vannak fejlemények. Sajnos nem tudtam foglalkozni vele az elmúlt napokban, de ma már haladtam is vele. Még a fő logika hiányzik, minden egyéb kész. Megpróbálom darabokra szedni a logikát is, hogy minél könnyebben átlátható legyen az is. Pár függvényt már kiszerveztem .c és .h fájlokba is, mint például a Timer1, PWM, és a PIN_setup-ot is. Ezek jól működnek, így a fő programban csak meg kell hívni őket 1x, ezáltal a fő program sokkal átláthatóbb lesz szerintem. Jelentkezem mihamarabb, és bocs a késlekedésért!
Üdv!
Nem számít, mint mondtam, ráér. Csináld ahogy jónak látod, én csak tanulni fogok belőle bármilyen is lesz. Köszi!
Szia!
Írtam privát üzenetet, találtam egy sokkal szebb megoldást, a jelenlegi kód is sokkal jobb lenne vele, mert pár if lenne az egész. Gondoltam itt jelzek, mert én is sokszor úgy nézem az oldalt, hogy nem jelentkezek be és nem látom, hogy van üzenet, vagy sem.
Nyílvános? Hátha mást is érdekel, ha már fórum.
Még nem, mert nem biztos a megoldás, de valójában működnie kell, azonban át kell írnom a jelenlegi kódot, ki lehet dobni belőle jó pár sort ha működik.
Majd ha tényleg beválik akkor. (ne legyen túl nagy blama! A hozzászólás módosítva: Jún 15, 2024
Tudna valaki segíteni?
Egy kis telefonközpontban (PX-4) villámlás miatt meghibásodott a 64 lábú vezérlő IC. Típus: uPD75106 (nincs foglalatban, be van forrasztva) Az 57. láb (P82) nem él. Csak a csere nem segít, mert programozni kellene. Erre semmit sem találtam a NET-en. Van esély arra, hogy valahogy valaki kiolvassa, és visszaírja? Én csak a ki/beépítést tudnám megcsinálni talán. Bár ekkora IC-t még sosem szedtem ki sérülésmentesen.
Szia!
Az alábbi táblázat szerint nincs rá mód. A uPD75106 adatlapja szerint a program memória ROM - azaz a tartalma a gyártás során alkalmazott maszk szerinti lesz (ld. adatlap).
Köszi szépen.
Akkor kuka az egész központ. Nagyon sajnálom, korrekt szerkezet volt. Az a baj, hogy nem tudok már ilyet szerezni sehol sem, se pénzért, se ingyen Mindenhol kerestem, itt is. Ez van.
Sziasztok! Most kezdtem el foglalkozni PIC programozással.
Évek óta hobbi szinten c# programozással foglalkozok pic-et csak led villogtatásig jutottam el. Szeretnék segítséget kérni hogy c nyelvben hogyan tudok visszaszámláló időzítőt készíteni 12F675-el? Nagyon egyszerű számláló kellene mondjuk 5-perctől. Semmilyen visszajelzés nem kell csak a kimenetet kapcsolja le. Köszönöm előre is válaszotokat. Üdv Gábor.
Szia.
Összedobtam egy példát, ami a timer0-át használja, kb. 5 perc múlva kikapcsolja a GP0 lábat, Proteusba teszteltem.
Jujj de jó. Nagyon szépen köszönöm. Holnap le is tesztelem...
Sziasztok,
Segítséget szeretnék kérni a LIN busz kommunikációval kapcsolatban a PIC18F57Q84 mikrokontroleren. Az UART2-t "LIN Master/Slave mode"-ra állítottam, amikor az "U2P1L = 0x0D;" sor lefut, a LIN buszon megjelenik az üzenet Break, Sync és PID része, amire a Slave (jelen esetben egy gombsor) válaszol. A probléma az, hogy nem találtam dokumentációt a LIN busz használatához. Szinte semmit se találtam a PIC18F57Q84 adatlapján kívül, abban az 611. oldaltól kezdve van szó a LIN buszról, ami leírást talátam azokban az MCC-vel generálták le a program egy részét, de én nem szeretném az MCC-t használni mert folyamatosan változnak a PID-ek és nem akarom mindegyik PID-et (kb. 64 kombináció) a listához hozza adni. Ezek lennének a kérdéseim: 1. Melyik regiszterből tudhatom meg, hogy az "U2P1L = ..." sor befejezte a Break, Sync és PID küldését? 2. A Break, Sync és PID elküldése után hogyan küldhetek további adatbájtokat? A megszokott "U2TXB = ...;" utasítás nem működik, az "UART2_Write(...);"-tól pedig lefagy a program. 3. Hogyan dolgozható fel a Slave-től visszajövő adat? Hogyan lehet megállapítani azt ha a Slave nem válaszol egy adott időn belül? Előre is köszönöm a segítséget. A hozzászólás módosítva: Júl 13, 2024
|
Bejelentkezés
Hirdetés |