Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   40 / 118
(#) Petroimro válasza Jossz hozzászólására (») Szept 14, 2010 /
 
A negyedik sorban hívom meg, csak az oldal valamiért nem írta oda.
(#) Jossz válasza Petroimro hozzászólására (») Szept 14, 2010 /
 
Ha a programot szövegszerkesztővel másolod át, akkor előfordul, hogy a szövegszerkesztő "láthatatlan" vezérlőkaraktereit az MPLab-ban a fordító hibaként értelmezi, ill. meg sem jelenít egyes szavakat. Esetleg itt is?!
(#) Jossz válasza Petroimro hozzászólására (») Szept 14, 2010 /
 
Kézzel töröld ki a sort és kézzel írd be újra (az előző végével és a következővel együtt)
(#) icserny válasza Petroimro hozzászólására (») Szept 14, 2010 /
 
Ezt írtad:
  1. #define LCD_ENABLE_PIN PIN_D3
  2. #define LCD_RS_PIN PIN_D2
  3. #define LCD_RW_PIN PIN_D1
  4. #define LCD_DATA4 PIN_D4
  5. #define LCD_DATA5 PIN_D5
  6. #define LCD_DATA6 PIN_D6
  7. #define LCD_DATA7 PIN_D7


pedig ez a "hivatalos" kiosztás:
// D0 enable
// D1 rs
// D2 rw

// D4 D4
// D5 D5
// D6 D6
// D7 D7
(#) Petroimro válasza icserny hozzászólására (») Szept 14, 2010 /
 
De egyszer már működött ezzel a kiosztással, most nem tudom mi lehet a baj.
(#) Petroimro válasza Petroimro hozzászólására (») Szept 14, 2010 /
 
Na most működik az lcd.c kóddal.
Csak #include < lcd.c > helyett bemásoltam az egészet a main elé.
Köszi mindenkinek a segítséget!
(#) efiscp válasza icserny hozzászólására (») Szept 14, 2010 /
 
Igazából ahogy elnézem, mindegy neki. Van egy gyári midi-usb kábelem (amiből kölcsönöztem a VID-PID-et), abban a 2-es endpointon van az in, és az 1-esen az out (ráadásul még működik is). De visszajavítom, ha az okosak azt mondják.
(#) efiscp válasza Petroimro hozzászólására (») Szept 14, 2010 /
 
  1. #define LCD_ENABLE_PIN  PIN_C3
  2. #define LCD_RS_PIN      PIN_C1
  3. #define LCD_RW_PIN      PIN_C2
  4. #define LCD_DATA4       PIN_D4
  5. #define LCD_DATA5       PIN_D5
  6. #define LCD_DATA6       PIN_D6
  7. #define LCD_DATA7       PIN_D7
  8. #include <lcd.c>


Nálam így tökéletesen működik. Próbáld meg a definiálásokat az include elé rakni.

szerk.: Ha jól emlékszem, a definíciók úgy vannak a gyári könyvtárban, hogy infdef blabla define blabla. Tehát ha utána írod a define dolgokat, akkor egy már létező definícióra definiálsz rá. Nem tudom, hogy ilyenkor felül írja-e, vagy figyelmen kívül hagyja, de egy lehetséges hibaforrást látok benne.
(#) efiscp válasza efiscp hozzászólására (») Szept 14, 2010 /
 
Na az alábbi változtatásokat eszközöltem:
  1. while (1)
  2.    {
  3.     if (usb_enumerated())
  4.      {
  5.       if (usb_put_packet(2,&note_on[0],4,USB_DTS_TOGGLE))
  6.       output_toggle(PIN_B7);
  7.       delay_ms(1000);
  8.      }
  9.    }


Erre már érdekesebb dolgokat művel. Először elindítom a fruity loops-t, utána rádugom. Ekkor kigyullad a led, és úgymarad. Ezután scanneltetem vele a midi eszközöket, és amikor megtalálja, elkezd a led villogni. Ebből én arra következtetek, hogy az adatátvitel működik, de valami egyéb gubanc van, ami miatt nem játssza le a hangot. Megnézettem midi monitorral, és ekkor se mutatja, hogy érkezne (érvényes) adat.


szerk.: az usb_put_packet() elvileg akkor ad vissza 1-et, ha sikeres volt az átvitel.
(#) efiscp válasza efiscp hozzászólására (») Szept 14, 2010 /
 
Sikerült meghegeszteni, működik. Az volt a probléma, hogy a midi üzenethez az usb class specification előírja, hogy egy plusz byte-ot elé kell rakni, ami a cable numberből, és a code index numberből áll. (CN<<4|CIN). A CIN általában a MIDI üzenet parancsbyte-jával egyezik meg, ott van a táblázat a múltkor csatolt pdf-ben. Namármost valamiért csak akkor dolgozza fel a midi event packetet, ha a 0-ás CN-en jön, én meg eddig az 1-esen próbáltam küldeni. Nem tudom, mi okozza ezt, talán a vindózban a class driver hülyesége, majd valamikor kipróbálom ubuntu alatt is.
Egyszóval aki usb-midi cuccot szeretne implementálni, a 0-ás CN-en keresztül tegye.

ps: icserny: igazad volt, jó az 1-es endpointon az in. >>
(#) brugo hozzászólása Szept 19, 2010 /
 
hol tudnek olvasni a kovetkezo utasitasokrol :
init( )
for(;
(#) potyo válasza brugo hozzászólására (») Szept 19, 2010 /
 
Az első meghívja az init nevű függvényt paraméterek nélkül.
A második meg egy egyszerű végtelen ciklust csinál.
(#) Norberto válasza brugo hozzászólására (») Szept 19, 2010 /
 
Google-ban rákeresve is olvashatsz ezekről bővebben (van szép számmal mindenféle jegyzet PDF vagy PPT formátumban a neten, magyar nyelven is), vagy akár a CCS súgójában is nézelődhetsz.
(#) brugo válasza potyo hozzászólására (») Szept 19, 2010 /
 
Köszönöm szépen !
(#) sirály12 hozzászólása Szept 22, 2010 /
 
Egy kis segítséget kérnék.

Írok egy progit, aminek az lenne a feladata, hogy egy bejövő jelsort vizsgál meg és usb-n továbbítja az eredményt.

Az usb része megy a dolognak, vagyis eddig az működik.

A jelsor a következő: jelsor

Minden sor egy byte.
Az első magas szint hosszú és utána egy alacsony szint ez így a stratbit.
Ezután minden felfutó élnél kezdődik egy bit, és attól függően 1 vagy 0 hogy a magas vagy az utána jövő alacsony szint tart-e tovább.

Én eddig annyira jutottam, hogy kell egy külső magszakítás, ami nullázza a timer0-át, itt indul a mérés. És a lefutó élre megint nullázok. Ekkor a visszaadott értékből kiderül, hogy strat, 1 vagy 0.

A külső megszakítás, amivel megnézem, hogy mikor jön a jel:
  1. #INT_EXT
  2. void ext_isr() {
  3. static short egy=FALSE;
  4.   if(!egy)        // jel érkezett
  5.    {
  6.       egy=TRUE;    //jel érzékelve
  7.       ext_int_edge(L_TO_H);   // állapot csere
  8.       if (jel >= 50)
  9.       {ch=0;
  10.       db++;
  11.       }
  12.       else
  13.       if (jel >= 8)
  14.       {
  15.       ch =(ch << 1);
  16.       ch+=1;
  17.       }
  18.       else
  19.       {
  20.       ch =(ch << 1);
  21.       ch+=0;
  22.       }
  23.     jel=0;
  24.    }
  25.    else                       // jel nincs
  26.    {
  27.       egy=FALSE;                  // jel nincs
  28.       ext_int_edge(H_TO_L);   // állapot csere
  29.       jel=0;
  30.    }
  31.  ch =(ch << 1);
  32.  printf("\r\n aaa: 0x%X 0x%X", db, ch);
  33. }


Megszakítások és timer beállítása:
  1. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT);
  2.    set_timer0(0);
  3.    enable_interrupts(INT_RTCC);
  4.    ext_int_edge(L_TO_H);      // init interrupt triggering for button press
  5.    enable_interrupts(INT_EXT);// turn on interrupts
  6.    enable_interrupts(GLOBAL);


A progi összevissza számokat irkál, mi lehet a gond?
Mit rontottam el?

Előre is kösz a választ.
(#) sirály12 hozzászólása Szept 22, 2010 /
 
Ezt kihagytam.

timer:
  1. int8 ch;
  2. int8 adat;
  3. int32 jel = 0;
  4.  
  5. #INT_TIMER0 //HIGH
  6. void timer0_isr()
  7. {
  8.    jel++;
  9. }



És 20Mhz-es kvarccal jár a pic, ami egy 18f4550-es.
(#) icserny válasza sirály12 hozzászólására (») Szept 22, 2010 /
 
Szerintem elszámoltad az időzítést, mert j ~21 us-onként lép, a j>=8 feltétel így a rövidebb impulzusokra is teljesül (ha jól látom, akkor ~200 us a sűrűbb osztás).

Nem azt kell nézni, hogy hány MHz-es a kvarc, hanem azt, hogy mekkora frekvenciát állít elő belőle az előosztó, a PLL és az utóosztó. Normál esetben az FSUSB miatt 48 MHz-en ketyeg az USB SIE és a CPU is, azaz Fosc = 48 MHz, Fcy pedig Fosc/4, azaz 12 MHz. Ez Timer0 bemenőjele.

A printf hívását sürgősen vedd ki az interrupt kiszolgáló eljárásból! Másold át az adatokat, s állíts be egy szemafort. Amikor a szemafor bebillent, akkor a főprogramból írass ki!
(#) Muffin hozzászólása Szept 22, 2010 /
 
Egy kis segítséget szeretnék kérni tőletek.
Egy 2x16-os LCD-t szeretnék életre kelteni egy pic 16f877A -val.

ahogy elnéztem az lcd_init() -nél akad el és onnan nem megy tovább a program.
* a #include nem jelenik meg itt teljesen de ott van a #use delay... alatt
a program:

#include <16F877A.h>
#FUSES NOWDT,XT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT,
#use delay(clock=20M)
#include
//------------------------------
void main() {
//------------------------------

delay_ms(50);
lcd_init();
delay_ms(50);

//-----------------------------
while (1) {
//-----------------------------

delay_ms(50);
lcd_gotoxy(1,1);
printf(lcd_putc,"\fHello World!");
delay_ms(50);

} //end while
} //end main
(#) vicsys válasza Muffin hozzászólására (») Szept 22, 2010 /
 
3 dolgot nem tudunk:
- Milyen LCD meghajtó programot használsz?
- Hogyan van konfigurálva?
- Mit iratnál ki?
  1. lcd_gotoxy(1,1);//ugrás első sor első kar.-re
  2. printf(lcd_putc,"\f");//képernyő törlés
(#) Muffin válasza vicsys hozzászólására (») Szept 22, 2010 /
 
igen bocsi ahogy bemásoltam ide a programot kihagyott pár dolgot közben, de már módosítottam az előző hozzászólásban ezeket. Bár most nézem, hogy az lcd.c -t még mindig nem akarja kiírni a kacsacsőrök közé
(#) vicsys válasza Muffin hozzászólására (») Szept 22, 2010 /
 
Ha nem találod a Kód gombot, csatolt be mellékletként.
(#) Muffin válasza vicsys hozzászólására (») Szept 22, 2010 /
 
Jogos én voltam a figyelmetlen.
most csatolom az a biztos
A kérdésem az, hogy mi lehet a program baja ami miatt nem megy.

lcd_3.c
    
(#) vicsys válasza Muffin hozzászólására (») Szept 22, 2010 /
 
  1. printf(lcd_putc,"\fHello World!");

Ez a sor vajon mit fog csinálni? Menj rajta szépen sorba végig...
(#) Petroimro válasza Muffin hozzászólására (») Szept 22, 2010 /
 
Nekem is ezt csinálta. Az lcd_init(); -nél behalt.
Aztán nyitottam egy új projektet, de ott meg nem tudta megnyitni az lcd.c fájlt, ezért bemásoltam a tartalmát a main elé. Ezek után működik rendesen.
(#) Muffin válasza vicsys hozzászólására (») Szept 22, 2010 /
 
Már próbáltam az MPlab sim-el leszimulálni, de az lcd_ini()-nél elekad onnan nem megy tovább.
Addig a sorig el sem jut a szimuláció.
(#) Muffin válasza Petroimro hozzászólására (») Szept 22, 2010 /
 
Az egész lcd.c tartalmát bemásoltad?
(#) Petroimro válasza Muffin hozzászólására (») Szept 22, 2010 /
 
Igen, mert ha nem másoltam be, akkor nem akarta lefordítani.
(#) Muffin válasza Petroimro hozzászólására (») Szept 22, 2010 /
 
megpróbáltam de még mindig az lcd_init()-nél akad el a szimuláció. Egészen pontosan az lcd_init() hatására belép az lcd.c-be és onnan nem akar kijönni, olyan mintha valami végtelen ciklus ként futna az lcd.c-ben
(#) Petroimro válasza Muffin hozzászólására (») Szept 22, 2010 /
 
Nekem is az volt, hogy először lefordította, aztán az lcd_init() -nél behalt. Ott még nem jelzett fordítási hibát.
Aztán nyitottam egy teljesen új projektet (MPLAB-al használom a ccs-t) más néven.
Itt nem akarta lefordítani, ezért bemásoltam az lcd.c tartalmát. Így már működött minden. Kicsit zavaró, hogy ott van a kód elején az a sok minden az lcd.c-ből, de működik.
(#) pppsss hozzászólása Szept 24, 2010 /
 
Sziasztok !

Sokat küszködöm manapság az I2C kommunikációval, bár most ismerkedem a C-vel és a CCS-el is, tehát ha nagy marhaságot írok akkor az ezért van.
A programom egyszerű mégsem működik, egy címre írok egy adatot amit egy kis várakozás után /6 ms/ visszaolvasok és összehasonlítom az eredetivel a Proteusban de nem jó !
Aki megteszi hogy szán a problémámra egy kis időt és rájön a hibámra annak köszönöm és ne kíméljen a válasszal!

eeprom I2C.c
    
Következő: »»   40 / 118
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