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ó , a hardverrel volt a gond , a simulátornál meg az idővel (türelmetlen voltam)
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. Kapcsolási rajzot nem csinálok mert igen egyszerű:
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 (Fogy a memória) 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. A válaszokat köszönöm!
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 valóban a branch-ot kellett nézni, úgy csináltam hogy kiolvastam az óra változóit, utána kiküldtem gosub-bal hogy return-nal visszatérhessen, így oldottam meg:
... 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, .. de mind1, lényeg hogy megy...
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" amúgy köszi a segítséget, ugyanezen az elven működik. Ez PicBasic nyelven van amit küldtél?
Ismét én vagyok Most az a gondom hogy Soft_uart-tal küldök adatot egy 8-bites shift regiszternek (74LS164N), közben pörög a 32.768-as kvarc oszcillátor, félő az a gyanúm hogy ez avatkozik bele, ugyanis ha megszakítás érkezik vagyis engedélyezve van a TIMER1 megszakítás, akkor számok helyet 0-át ír ki a 2. és a 3. kijelzőre. Viszont ha kikapcsolom a külső megszakítást akkor normálisan megy minden...
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 Ha nem lesz másik mód akkor ezt kell fényesre csiszoljam, lehet megeszi a memóriát de talán 2K elég egy szimpla órának Remélem azért nagyjából lehet érteni amit elmondtam üdv |
Bejelentkezés
Hirdetés |