Sida 1 av 1

USB HID mikroC 18f4550

Postat: 27 januari 2011, 22:01:01
av Pajn
Jag har problem att få USB att rulla med kod för nexa sändare.
Windows säger "Windows has stopped this device because it has reported problems. (Code 43)" och rapporterar den som "Unknown device"

Exempelkoden från mikroelektonika funkar så hårdvaran är ok. Dessutom använder jag samma USBdsc.c så den är också ok.

Här är den andra koden:

Kod: Markera allt

//
// Example code for a NEXA transmitter produced by Sonny -11
// Needs adjustment depending of wich microcontroller choosen.
//

// Defines for connected processor port
#define TX_HI PORTB.F5 = 1
#define TX_LO PORTB.F5 = 0

unsigned long saved_sender = 123456; // The "remote-control" id
unsigned short saved_recicpient = 7; // Receiver channel
unsigned short saved_group = 0;      // no "group" message
unsigned short saved_action = 1;     // "on" :)
unsigned short PACKETS = 7;          // Packets to send out
//unsigned short true = 1;
//unsigned short false = 0;
unsigned char readbuff[64];
unsigned char writebuff[64];

char cnt;
char kk;

void interrupt(){
   USB_Interrupt_Proc();                   // USB servicing is done inside the interrupt
}

void sendBitNEXA(unsigned short b) {
    if (b == 1) {
        TX_HI;
        delay_us(320);
        TX_LO;
        delay_us(200);
    } else {
        TX_HI;
        delay_us(320);
        TX_LO;
        delay_us(1210);
    }
    return;
}

void sendPairNEXA(unsigned short b) {
    // Manchester data is 01 or 10, never 11 or 00
    if(b == 0) {
        sendBitNEXA(1);
        sendBitNEXA(0);
    } else {
        sendBitNEXA(0);
        sendBitNEXA(1);
    }
    return;
}

void transmitNEXA( unsigned long SenderID, unsigned short RecCh, unsigned short Group, unsigned short Enabled, unsigned short Repeats, unsigned short dimm){
  //
  // Takes approx. 80mS / packet
  //
  unsigned short i,cnt;
  unsigned long DA;
  unsigned short RCP;
  for (cnt = 0;cnt < Repeats;cnt++) {
      //
      DA = SenderID;
      RCP = RecCh;
      //
      TX_HI;
      delay_us(320);
      TX_LO;
      delay_us(2510);
      //
      for(i=0; i<26;i++) {     // Send bits 0-25 ,Device Address..
        //
         if((DA & 0x02000000)==0x02000000) {
             sendPairNEXA(1);
         } else {
             sendPairNEXA(0);
         }
         DA <<= 1;
      }

      // Send 26th bit - group 1/0
      sendPairNEXA(Group);

          // Send 27th bit - on/off 1/0
          if(Enabled == 2) {
              sendBitNEXA(1);
              sendBitNEXA(1);
          } else {
              sendPairNEXA(Enabled);
          }

          // 4 bit button
          //
          for(i=0; i<4;i++) {
             //
             if((RCP & 0x8)==0x8) {
                 sendPairNEXA(1);
             } else {
                 sendPairNEXA(0);
             }
             RCP <<= 1;
          }

          // 4 bit dimm level
          //
          if(Enabled == 2) {
              for(i=0; i<4;i++) {
                 //
                 if((dimm & 0x8)==0x8) {
                     sendPairNEXA(1);
                 } else {
                     sendPairNEXA(0);
                 }
                 dimm <<= 1;
              }
          }

      //
      // Now send "EndOfMessage" pattern ...
      //
      TX_HI;
      delay_us(310);
      TX_LO;
      delay_us(9810);  // put low for at least this time :)
  }
  //
  return;
}

void main(void){
  ADCON1 |= 0x0F;                         // Configure all ports with analog function as digital
  CMCON  |= 7;                            // Disable comparators
  PORTA = 0;
  TRISA = 0;
  PORTB = 0;
  TRISB = 0;
  HID_Enable(&readbuff,&writebuff);       // Enable HID communication
  Delay_ms(1000);
     while( 1 ) {
         while(!HID_Read());
         for(cnt=0;cnt<64;cnt++) {
             transmitNEXA(saved_sender, readbuff[0], readbuff[1], readbuff[2], readbuff[3], readbuff[4]);
             writebuff[cnt]=readbuff[cnt];
             /*if (readbuff[cnt] = ',') {
                 strToInt(readbuff[cnt]);
             } else if (readbuff[cnt] = 'S') {
             } else {
                 temp[tcnt]=readbuff[cnt];
                 tcnt++;
                 strToInt(readbuff[cnt]);
             } */
         }
         while(!HID_Write(&writebuff,64));
     }
}
Som ni kanske ser är USB kopierat från exemplet och nästan hela nexa delen är från http://www.switchking.net/forum/viewtopic.php?f=8&t=113
Så jag fattar inte varför USB'n går snett. Har ju inte rört den?
Jag har avkoppling på processorn + sändaren (100nF)
Har även kondensator på vusb (3*100nF tot 300nf)
Pullup på Mclr

EDIT:Bortkommenterad kod bort

Re: USB HID mikroC 18f4550

Postat: 27 januari 2011, 22:34:51
av sodjan
USB är väl lite beroende på att man, så att säga, pollar av linjen
regelbundet. Jag ser att du disablar interrupt i NEXA koden, dock
ser jag inte direkt för hur lång tid. Men det är inte omöjligt att
du har tidskritiska saker i NEXA koden som kommer i konflikt med
USB delarna...

Re: USB HID mikroC 18f4550

Postat: 27 januari 2011, 22:51:23
av Pajn
GIE = 0; är utkommenderat så det kan väl inte störa?

Re: USB HID mikroC 18f4550

Postat: 27 januari 2011, 23:02:39
av sodjan
OK. Då är det ett dåligt exempel du har postat.
Kör bara minsta möjliga kod (utan extra bortkommenterad kod)
som faktiskt uppvisar problemet. Ingen kod i onödan och ingen
bortkommenterad kod som stör sikten om det inte är viktigt för
exemplet i sig.

Fungerar det (d.v.s USB loggar inte nåra fel) om du ersätter
NEXA koden med något helt annat, som t.ex gör ingenting ?

Re: USB HID mikroC 18f4550

Postat: 27 januari 2011, 23:33:30
av Pajn
Förlåt.

Att ta bort nexa koden funkade.
Men lyckades lösa det genom att ta en ny pic som då funkade med nexakoden.
Det var den andra picen idag från samma paket som inte funkade (den första vägrade ta emot ext osc).
Tror mitt paket har haft otur i postens paketpress :(

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 01:00:05
av sodjan
Ja, det låter ju lite märkligt...
Det ska *inte* vara "fel" på flera exemplar i samma sändning!
Är du 100% säker på att det inte är något annat ?

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 07:07:06
av Pajn
100% är jag ju inte (omöjligt) men det verkar ju så.
Om man tar bort en pic utan att ta bort det anda och tycker ner en ny på samma ställe samt kör ner exakt samma program,
då är det inte mycket annat som kan gå fel. Picarna har haft olika matning, den första från wispen och den andra från usbn,
så jag antar vi kan utesluta den. Möjligtvis har jag glapp i mitt labbdäck, men det borde ju inte visa sig först när man trycker ner ett tyngre program.
Men visst, ett glapp vid banorna till kristallen kan ha gjort det då den tyngre kodn lär ha varit mer kritisk. Om det händer igen ska jag testa att flytta picen.

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 09:55:17
av ds77
Kör du med kristall i ett labbdäck? Visst kan det funka men vill man vara säker så är man noga med lastkapacitanser och ledningslängder, alltså inte på ett labbdäck.

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 15:51:19
av Pajn
Jag vet. Men vad ska jag annars göra?

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 16:30:27
av sodjan
Ja, alltså. Om labbdäcket är dåligt, så byter man väl ut det ??
Med ett labbdäck som ör OK så ska det inte vara något problem
mned kristall...

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 16:36:43
av v-g
Har kört massor med kristall i labbdäck utan probs men det är klart mina labbdäck är inte så slitna iom att jag har ett gäng :vissla:

Numera kör jag nästan uteslutande INTOSC :hacker:

Hade ett liknande problem där en ny krets gick att programmera men inte en gammal efter att man tryckt i ett visst program. Där visade sig WISP firmware vara felaktig vid utbyte av den levde kretsen upp.

Däremot har jag dödat en 877a när det kom lite ström i fel portar så blev den opålitlig och till slut oprogrammerbar men men knappast microchips fel. :roll:

Fast har du osis KAN den ju dö/Ofungera av ESD eller någon slags felkoppling, oftast det senare ;) De är väldigt tåliga så normalt är de svåravlivade om man håller sig inom rimliga gränser.

Re: USB HID mikroC 18f4550

Postat: 28 januari 2011, 18:09:07
av ds77
Nu är ju inte usb så väldigt krävande men om man försöker sig på något som man vill ha någorlunda bra koll på vilken frekvens man har lovar jag att ett labbdäck inte är det optimala. Men som sagt usb är ju inte speciellt känsligt, däremot kan det vara så att kristallen inte svänger så bra. Har du kondensatorer till kristallen? Testa i så fall att minska dessa eller ta bort helt på de som inte fungerar. Har du inga så kan det vara läge att prova lägga till ett par.

Re: USB HID mikroC 18f4550

Postat: 29 januari 2011, 19:37:07
av Pajn
Labbdäcket är ganska nytt (under ett halvår) vilket var anledningen att jag skyllde på posten
Jag har nu kört utan problem (nåja, absolutdimningen funkar inte, men det rör knappast detta) så jag är rätt säker på att det var posten. ESD tror jag inte då det var helt nya picar som jag tog ur ESD röret och rörde dessutom nollan på wispen innan jag satte i dem.

Självklart har jag kondensatorer på kristallen, tyvärr bara 33pF då det var det närmaste 37pF (som det ska vara enligt databladet) som elektrokit hade.