Fórum témák
» Több friss téma |
Hello mindenkinek!
Problémám a köv.: PicBasic fordítot használok 16F877A programozáshoz. Valamiért nem működnek benne az időzítéssel kapcsolatos parancsok (PAUSE, SLEEP, stb). Simulátorban nézve, ha program eléri ezeket a parancsokat egyszerűen csak egy végtelen ciklusként működik, és a program nem megy tovább az adott idő leteltéve. Egy egyszerű példában: Define CONF_WORD = 0x3f72 Define OSC 20 i var Byte TRISB = 0 loop: For i = 0 To 255 PORTB = i PAUSE 70 Next i Goto loop A PAUSE parancsnál "beragad". Mit csinálok rosszul? ![]()
nem értek a picbasic-hez, de az oszcillátoros beállításnál nem 20 000 000-nek kellene lennie 20 helyett? gondolom 20 MHz-eset használsz
Én sem látok hibát, bár még nem programoztam Picbasic-ben. Próbáld meg kisebb idözítéssel mondjuk PAUSE 1
Nemtom mit takar a számszerűsített config bellításod. Lehet hogy ott kell keresni a hibát?
Köszönöm mindenkinek a segítséget. Valóban a program jó
![]() ![]()
Keresek a Pic programozáshoz MPLAB hoz Basic fordított, de nem találok.
Tud valaki segíteni ? Ajánlati esetleg olyan programot amivel Basic nyelven tudnák chipeket programozni?
http://www.mikroe.com/en/download/
Basic, Pascal és C fordítójuk is van. A pascalt kipróbáltam, nagyon egyszerű volt használni. Bár én maradtam az assemblynél, hiszen igazán megtanulni a pic programozást azzal lehet.
Üdv!
Oshonsoft PIC Simulator IDE Ez nem csak BASIC fordító hanem egy egész fejlesztő környezet. Igaz nem ingyenes, de 7e Ft-ot megér. Én ezt használom egy jó ideje és szerintrem nagyon jó. Bővebben: Link
Majd akkor látjátok meg mennyit ér a Basic, meg a Pascal, mikor elakadtok és kérdeztek! Alig van, aki ilyen nyelven nekiállna PIC-et programozni kezdő szintnél magasabb szinten...
Én egy Mikrobasic nevű progit használok.Egész korrekt és van asm fordítója is.Igaz az mplabal nem tudod megnyitni utánna de a hex fájt amit generál azt már be tudod égetni a pic-be.
Keress rá a goglin biztos kidob pár letölthető verziót.
Vizor éppen ezt a progit linkelte be ebben a hozzászólásában.
Sziasztok! A segítségeteket szeretném kérni egy igen egyszerű probléma megoldásához. Most kezdtem foglalkozni a PIC programozással, először Assembly nyelven kezdtem el tanulgatni, de ez számomra még nagyon távolinak tűnik használni mivel a program struktúra is közrejátszik, ezért találtam egy jónak tűnő Basic fordítót a Mikro Basic-et. Előszöris PIC16F628-as mikrokontrollert használok, a PortB-t kimenetre a PortA-t viszont bevitelre alkalmaznék. A kivitellel semmi problémám nincsen már szépen ki tudom küldeni az adatot, viszont amikor figyelni kell egy bemenetet itt mégha bele is szakadok sem sikerül.
![]() RA0 : 1-es gomb 17-es láb RA1 : 2-es gomb 18-as láb Alapba felengedett állapotban fel van huzva egy 2.2K-val a tápra, lenyomva közveten a földre húzza. Már 4 órája megállás nélkül ezzel a problémával kisérletezek és már kezdek fáradni, ezért is kérdezlek titeket. Ha tudnátok valami ötletet adni megköszönném! üdv: Zsuscsinyo
Az adatlapban az 5. fejezetben levő Note1-et olvasd el, illetve az 5.1 cím alatti negyedik bekezdést, különös tekintettel az utolsó mondatára.
Idézet: „de ez számomra még nagyon távolinak tűnik használni” Pedig jobb lenne, és a Basic-et pedig elfelejthetnéd örökre a kontrollerek terén.
Köszönöm a segítséget!!!
![]() ![]() ![]() Sikerült megoldani!
Bizony, a Basic-et el kell felejteni!
"Egyszerűbb" dolgokhoz jó, de engem nagyon megszívatott. PicBasicPro-val dolgoztam és megpróbáltam "összeházasítani" egy timer interruptot egy eeprom kezeléssel. Külön külön mindkét progi darabka remekül működött, együtt meg sehogy. A szkóp mutatta meg, hogy a megszakítás kiszolgálása teljesen meghülyítette az eeprom órajelét! Nem lehet tudni, hogy egy utasítás végrehajtásakor mi zajlik a háttérben. Basic ment a levesbe, most C-ben bütykölök és minden a helyére került.
És a C-ben nem fordulhat elő úgyanez az eset? A nyelv milyenségétől függ hogy a programozó környezet fejlesztője hanyag munkát végzett?
![]()
Ebben igazad van, nem a nyelv fajtája a meghatározó.
A bajom viszont azzal volt, hogy Basic-ben egyátalán nem tudtam ezt a feladatot megoldani. Két elfecsérelt nap, eredmény 0... ![]() Kaptam C-t, tanulgatom, a fenti problema már rég leküzdve... ![]()
Hali!
Vak a következő PIC basices program, amit ha leszimulálok pl. Oshon-al akko tökéletesen működik, de ha a hardverkörnyezet összerakom, akkor nem azt csinálja amit kéne. PORTB7-en egy kapcsoló van, amit ha bekapcsolok akkor bekapcsol a 2 relé. Ha kikapcsolom, akkor a PORTA0-án lévő relé kikapcsol, majd kis idő múlva pedig a másik. Az e változót az eepromba tárolom. Szerintetek a hardverben van a hiba? Csatolom a kapcsirajzot is.. device=16f627 xtal=4 Dim i As Byte Dim e As Byte dim pwd as byte dim be as byte dim auth as byte dim auth2 as byte i=0 pwd=150 TRISA = %00000 TRISB = %10000010 OPTION_REG = %10000111 CMCON = 7 INTCON.5=1 ON INTERRUPT GOTO int disable loop: i = 0 TMR0 = 0 If PORTB.7 = 1 Then PORTA.0 = 1 PORTA.1 = 1 Endif If PORTB.7 = 0 And PORTA.0 = 1 Then PORTA.0 = 0 e=eRead 0 TMR0 = 0 enable While i <> e If PORTB.7 = 1 Then disable TMR0 = 0 i = 0 Goto loop Endif Wend disable PORTA.1 = 0 Endif Goto loop End int: i=i+1 INTCON.2=0 resume Előre is köszönöm. Bye
Sziasztok!
Egy ötlet érdekelne engem, ugyanis Propeller clock-ot építek és mikrobasic-kel irom a programot. Odáig eljutottam hogy kimaszkoltam a számokat pontosan így: (ez az 1-nek a maszkja) PORTA = %000100 PORTB = %00001100 delay_us(600) PORTA = %001111 PORTB = %00111100 delay_us(600) PORTA = %000000 PORTB = %00001100 delay_us(600) PORTA = 0 PORTB = %00000100 delay_us(1200) A kérdésem a következő, hogyan tudnám megoldani azt hogy ha egy változó folyamatosan növekszik, akkor annak az értékének megfelelően ugrik az ilyen programrészekhez. Mondjuk GOSUB utasítással lenne a legjobb de hogy tudnám rávenni arra, ha a 'perc' változó épp 3-at mutat akkor a 3-as szám maszkjához ugorjon? A rengeteg if...then-be belehalna ez a csöpp kis 16F628-as ![]() Amúgy a "Select case" utasítás felkeltette az érdeklődésemet hogy hátha ezzel megoldható, de sajnos még nem teljesen tiszta hogy is működik ![]() Ez egy kicsivel komplikáltabb mint a multiplexelt 7 szegmens, de nagyon kitartó vagyok és nem adom fel, ha esetleg valakinek akad egy jó ötlete azt szívesen fogadom. ![]()
nézegesdd a branch utasítást, az szerintem segíthet, én is azt használtam
és akko r avégén sorban küldöd ki a karakter 5-6 elemét, amit korábban betöltöttél egy tömbböl a 5-6 változóba.
már nem tudom módosítani az előző hsz-omet...:
így gondoltam:
A: reszA=$3F : reszB=$44 : reszC=$44 : reszD=$44 : reszE=$3F : goto betukiir B: reszA=$7F : reszB=$49 : reszC=$49 : reszD=$49 : reszE=$36 : goto betukiir C: reszA=$3E : reszB=$41 : reszC=$41 : reszD=$41 : reszE=$22 : goto betukiir D: reszA=$7F : reszB=$41 : reszC=$41 : reszD=$22 : reszE=$1C : goto betukiir és a kor a betükiir értelemszerűen kiküldi az 5db resz* változókat egymás után egy portra.
Oké sikerült megoldani
![]() ... kijelzo = tora gosub kijelzes kijelzo = eora gosub kijelzes kijelzo = tperc gosub kijelzes kijelzo = eperc gosub kijelzes ... kijelzes: select case kijelzo case 0 PORTA = %000111 '1 PORTB = %00110100 delay_us(600) PORTA = %001000 '2 PORTB = %00001100 delay_us(1200) PORTA = %000111 '3 PORTB = %00110100 delay_us(600) PORTA = 0 PORTB = %00000100 delay_us(1200) case 1 PORTA = %000100 PORTB = %00001100 delay_us(600) PORTA = %001111 PORTB = %00111100 delay_us(600) PORTA = %000000 PORTB = %00001100 delay_us(600) PORTA = 0 PORTB = %00000100 delay_us(1200) case 2 ... case 3 ... case 4 ... case 5 ... case 6 ... case 7 ... case 8 ... case 9 PORTA = %000110 '1 PORTB = %00000100 delay_us(600) PORTA = %001001 '2 PORTB = %00001100 delay_us(1200) PORTA = %000111 '3 PORTB = %00110100 delay_us(600) PORTA = 0 PORTB = %00000100 delay_us(1200) end select return Köszi a megerősítést, tényleg ezzel kellett babrálni ![]() ![]()
érdekes, .. ez a select case és nem a branch utasítás, ..
![]() ![]()
Use the select case statement to pass control to a specific program branch, based on a certain condition. The select case statement consists of a selector expression (a condition) and a list of possible values.
azért van benne "valami" ![]() ![]() Ez PicBasic nyelven van amit küldtél? ![]()
Ismét én vagyok
![]() ![]() Szerintem amikor küldi az adatot akkor történik a megszakítás, és nem bírja végiküldeni azt a 8 bitet. Szerintetek hogy tudnám megoldani a helyzetet, szükséges minden alkalommal amikor küldi az adatot akkor tiltsam a megszakítást? minden megoldást várnék ![]() üdv
Minden megszakításhoz tartozik engedélyező bit is (globálisan GIE, perifériákra PEIE stb.). Adatlapból keresd ki a kívánt bit nevét, soros küldés előtt töröld, aztán kapcsold vissza.
Szerintem is jobb, ha az ember egyenesen bináris kódokat pötyögtet.
Így, minden pillanatban fel lehet találni a kereket, meg a melegvizet.
Amilyen egyszerűnek tűnik annyira nem könnyű :no: Ez nem jött össze, perpillanat még fogalmam sincs hogy oldjam meg
![]()
és mivan ha adatkiküldésenként figyelnéd a timer 1-et? megszakitás nélkül?
Mi lenne ha usart-ot használnál? nézd ezeket meg: 12-16F megszakításkezelő picbasichez 18F megszakításkezelő picbasichez
Nah, megint összehoztam valamit, bár nemtudom hogy mennyire lesz pontos
![]() A lényeg annyi hogy "próba kemence" képpen kivettem az interrupt ciklust (gondoltam felesleges másodpercenként 32768-szor előhívódnia és csak a TIMER1 IF-et figyelnie ![]() Ezért úgy döntöttem hogy igaz Pollinggal figyeltetem a TIMER1 IF-et, de minden soros kiírásnál, a léptető programrészt is kijelzés utánra tettem. Nemnagyon szeretem hogy a kvarc rutinjában delay-ok futnak, mert nembiztos hogy időben fog interruptolni, nah meg főleg Pollinggal ![]() ![]() Remélem azért nagyjából lehet érteni amit elmondtam ![]() ![]() üdv |
Bejelentkezés
Hirdetés |