Sari la conținut
ELFORUM - Forumul electronistilor

Intrerupere TMR0 si HID terminal


Kreator

Postări Recomandate

Hi all!

Am facut montajul si exemplul de la mikroe referitor la HID terminal si precizez ca functioneaza OK

program HID_Read_Write_Interruptdim cnt as chardim readbuff as byte[64] absolute 0x500           ' Buffers should be in USB RAM, please consult datasheetdim writebuff as byte[64] absolute 0x540sub procedure Interrupt()   USB_Interrupt_Proc()                           ' USB servicing is done inside the interruptend submain:  ADCON1 = ADCON1 or 0x0F                         ' Configure all ports with analog function as digital  CMCON  = CMCON or 7                             ' Disable comparators  HID_Enable(@readbuff,@writebuff)                ' Enable HID communication  while TRUE    while(HID_Read() = 0)    wend        for cnt=0 to 63      writebuff[cnt] = readbuff[cnt]    next cnt        while(HID_Write(@writebuff,64) = 0)    wend  wend

Va rog sa-mi spuneti cum sa a afisez in HID terminal o variabila cand se executa TMR0 fiindca nu reusesc deloc, adica sa nu trebuiasca sa tot dau eu SEND.

Va multumesc

 

LE

eroarea la compilare este ca incerc sa incerc sa execut o procedura din doua locuri deodata.

Asta-i programul meu

program Usb_termodim cnt as chardim  readbuff as byte[64] absolute 0x500           ' Buffers should be in USB RAM, please consult datasheetdim writebuff as byte[64] absolute 0x540dim txt as   string[64]dim i  as bytedim kk, prim, j as bitsub procedure Interrupt()    if INTCON.TMR0IF then       i = i + 1       TMR0l = 96       INTCON.TMR0IF = 0           if i = 100 then              i  = 0              PORTA.4=NOT PORTA.4              ByteToStr(PORTA.4, txt)              for cnt=0 to 7                  writebuff[cnt] = txt[cnt]              next cnt              while(HID_Write(@writebuff,64) = 0)              wend           end if    end if   USB_Interrupt_Proc()                           ' USB servicing is done inside the interruptend submain:  ADCON1 = 0x0F  'ADCON1 = ADCON1 or 0x0F                         ' Configure all ports with analog function as digital  CMCON  = CMCON or 7                             ' Disable comparators  TRISA=0  PORTA.4 = 0  TMR0L = 100 '        //load timer0 with 100  T0CON = 0xC4 ';      //prescaler = 32  INTCON = 0xA0 ';     //enable TMR0 interrupt  HID_Enable(@readbuff,@writebuff)                ' Enable HID communication  prim = 0  j = 0      while TRUE    while(HID_Read() = 0)    wend  wendend.

si erorile sunt:

4158 365 Reentrancy is not allowed: function 'USB_Transfer_Packet' called from two threads __Lib_USB_genHID.c

2414 365 Reentrancy is not allowed: function 'USB_Handle_Busy' called from two threads __Lib_USB_genHID.c

Editat de Kreator
Link spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • gsabac

    3

  • Kreator

    2

  • mars01

    2

Top autori în acest subiect

Imagini postate

Dorinta mea e sa se afiseze o variabila in fereastra HID terminal fara a trebui sa apas butonul Send, dar nu stiu cum se face.

Editat de Kreator
Link spre comentariu
  • 2 luni mai târziu...

Exemplul functioneaza in mikroBasic demo in conlucrare cu "HID Terminal", din mediul IDE, meniul "Tools".

Daca am incercat sa recompilez, am obtinut urmatoarele date:

0 134 Compiled Successfully
0 434 Demo Limit Demo Limit
0 453 Unsuccessful linking 'HID_Read_Write_Polling.mbppi
0 102 Finished (with errors): 19 Apr 2017, 16:29:58 HID_Read_Write_Polling.mbppi

Adica a compilat dar nu face fisierul ".hex" deoarece se depaseste limita "demo"

In continuare, am facut un nou program cu acelasi continut mikroBasic, intr-un nou folder si mesajele de eroare

sunt altele si se indica ca lipseste libraria "__Lib_USB_genHID.c" si ca nu poate rezolva extern problema.

Am continuat cu acelasi program in mikroC si rezultatul este acelasi, in ambele medii IDE am folosit PIC18F2550 si PICF4550, PIC18F87J50.

 

Mediul de design si simulare Proteus poate simula acelasi HID_Read_Write_Polling, prin desenarea schemei, setarea si simularea ei.

Click pentru marire.

post-238209-0-58487700-1492613483_thumb.jpg

Pentru aceasta este nevoie de un Virtual USB driver, care este in chitul Proteus si se instaleaza. Atunci cind se ruleaza exemplul,

dupa citeva secunde se aude mesajul sonor de conectare a unui produs USB, exemplul este conectat la portul virtual USB si apare consola

de comunicatii din Proteus.

Pentru comunicare cu microcontrollerul, se foloseste orice program gen "USB HID Communication" se scriu date si se transmit cu "Send" si

aceleasi date se receptioneaza prin raspunsul PIC-ului.

 

Urmatorul pas este crearea unei console proprii de test in PC, pentru a transmite orice fel de date spre un produs fizic,

multimetru, frecventmetru, osciloscop, generator DDS, etc. prin portul USB:

- prin portul UARTCOM RS232, am reusit aceste transmisii cu consola proprie, pentru un generator DDS.

- prin portul USB am reusit recunoasterea codului de driver, VendorID si ProductID, transmiterea de date si deocamdata nu

receptionez decit "00000" pe primele 5 locatii ale bufferului, voi continua in orb prin incercari de exemple.

 

Ce ma intereseaza in mod deosebit este cum pot rezolva eroarea "__Lib_USB_genHID.c" nu se poate rezolva extern.

Poate stie un membru mai avansat al forumului.

Multumesc anticipat.

 

@gsabac

Editat de gsabac
Link spre comentariu

Nu programez in Basic dar spuneti ca ati compilat si exemplul in mikroC.

 

Daca cumva este vorba de acest exemplu (in Library Manager este selectata doar libraria 'USB'):

/*
 * Project name:
     HID Read Write Interrupt (USB HID Read & Write Test)
 * Copyright:
     (c) MikroElektronika, 2005-2010
 * Revision History:
     20100512:
       - initial release;
 * Description:
     This example establishes connection with the HID terminal that is active
     on the PC. Upon connection establishment, the HID Device Name will appear
     in the respective window. The character that user sends to PIC from the HID
     terminal will be re-sent back to user.
 * Test configuration:
     MCU:             PIC18F4550
                      http://ww1.microchip.com/downloads/en/DeviceDoc/39632D.pdf
     Dev.Board:       EasyPIC7
                      http://www.mikroe.com/easypic/
     Oscillator:      HS 8.000 MHz  (USB osc. is raised with PLL to 48.000MHz)
     Ext. Modules:    on-board USB-HID
     SW:              mikroC PRO for PIC
                      http://www.mikroe.com/mikroc/pic/
 * NOTES:
     (*) Be VERY careful about the configuration flags for the 18F4550 - there's
     so much place for mistake!
    - Place jumpers J12 in the right position
*/

unsigned char readbuff[64] absolute 0x500;   // Buffers should be in USB RAM, please consult datasheet
unsigned char writebuff[64] absolute 0x540;

char cnt;
char kk;

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

void main(void){
  ADCON1 |= 0x0F;                         // Configure all ports with analog function as digital
  CMCON  |= 7;                            // Disable comparators

  HID_Enable(&readbuff,&writebuff);       // Enable HID communication

  while(1){
    while(!HID_Read())
      ;

    for(cnt=0;cnt<64;cnt++)
      writebuff[cnt]=readbuff[cnt];

    while(!HID_Write(&writebuff,64))
      ;
  }
}

atunci sa stiti ca se compileaza corect in mikroC for PIC PRO, fara erori pentru un uC 18F4550 adica exact exemplul gasit in structura de directoare a mikroC.

 

 

254zgqu.jpg

 

LE: Oops, ati folosit exemplul cu polling si nu am fost atent. Acum l-am compilat si pe acela in mikroC for PIC PRO si se compileaza si acesta fara erori.

Editat de mars01
Link spre comentariu

Multumesc, am sa incerc sa schimb fisierul hex din Proteus, cu cel compilat din mikroBasic si cu consola

USB HID Communication, voi testa comunicarea de scriere si citire cu uC-ul. Codul Microsoft Basic este

in mare, cu modificari esentiale, nu se face autocorectie si spre disperarea utilizatorilor rodati cu Visual Studio,

este si "Case sensitive"

 

@gsabac

Link spre comentariu

In locatia originala cu exemple, compilarea se face cu succes, dar daca se face un proiect nou cu alt uC,

in alta locatie, apare eroarea "__Lib_USB_genHID.c" programul spune ca nu se poate rezolva extern.

Rezolvarea este simpla, la crearea unui nou proiect se scrie sau se copiaza fisierul programului

si se salveaza cu extensia "C" sau "mbas" dupa caz. La salvare, in directorul programului trebuie

sa existe un fisier numit "USBdsc.c" sau "USBdsc.mbas" Acesta se include in program si apoi se salveaza proiectul.

Scopul lui este sa descrie modul cum se va compila procesorul ales in proiect.

Dupa aceasta, la compilare nu mai apare eroarea "__Lib_USB_genHID.c" si fisierul hex se compileaza cu succes.

Urmeaza sa si functioneze in simulare, apoi pe modelul real.

 

@gsabac

Editat de gsabac
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări