Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interrupt o polling?

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Interrupt o polling?

Messaggioda Foto Utentec1b8 » 15 ott 2010, 22:44

aduri ha scritto:...
2 cicli da 150 x 30us + 6us x150 = 2 x 150 x 30 + 6 x 150 = 9900 usec
7 gradini x 9.9msec= 69.3 anzichè 70msec alla fine dei cicli. ...

Sul calcolo dei tempi concordo. I tempi dovrebbero essere realmente quelli, ma in assembler, avrei qualche dubbio sull'utilizzo del basic (mi pare che hai utilizzato quello per il tuo esempio giusto?)
Temo che il basi introduca una serie di imprecisioni nel calcolo dei tempi reali.

aduri ha scritto:... In memoria ci staranno tutti questi dati?
300x7=210 word ----> 16bitx2100=33,6K
mi sembra che la ram sia 32 K magari riduco un po' i sampling.

Qui mi sembra ci sia un errore...
Se abbiamo 300 campioni per ogni Vg, ossia 600 byte per ogni Vg, e le Vg possibili sono 7 allora avremo un totale di 600*7=4200 byte.
Il 18F4550 ha massimo 2048 byte di RAM e quindi non ci stiamo.
Possiede 32KByte di FLASH, ma scrivere e leggere sulla flash non ci consente di rispettare i tempi calcolati in precedenza. La scrittura sulla flash avviene a blocchi di 64 byte ed impiega un tempo di circa 8ms a blocco.
Devi necessariamente utilizzare la ram e quindi ridurre i campioni da 300 a circa 140 (70 campioni per canale).
Questo significa aumentare il tempo di acquisizione a circa 71us pari ad una frequenza di 14kHz circa.
Solita domanda: bastano?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[12] Re: Interrupt o polling?

Messaggioda Foto Utenteaduri » 15 ott 2010, 23:59

Penso possano bastare. :D
Non otterrò dei grafici eccelsi ma farò delle interpolazioni in VB6.
Volendo potrei fare diversi cicli di lettura e poi fare la media (su PC) comunque se riuscissi già ottenere ciò che ci siamo detti col mikrobasic non sarebbe male.
Certo che se avessi dei PIC più veloci o, meglio, degli adc esterni otterrei migliori risultati ma lo scriverò nel capitolo delle evoluzioni future.
Farò dei test e poi mi rifaccio vivo.
Ancora una cosina:
Se attivassi il PLL nei modi XTPLL, HSPLL, ECPLL ed ECPIO produrrei un segnale di riferimento a 96MHz, con un ingresso fisso di 4MHz.
L'uscita può essere divisa ed usata, sia per USB, che per il clock del microcontroller e aumentare così le prestazioni dell'adc o dico una fesseria?

grazie mi sei stato veramente d'aiuto. =D>
ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[13] Re: Interrupt o polling?

Messaggioda Foto Utentec1b8 » 16 ott 2010, 0:13

Purtroppo non aumenteresti le prestazione dell'ADC ma solo della cpu.
L'acquisizione richiede dei tempi minimi dettati dalla carica del condensatore di hold e da altri fattori, questi tempi sono molto vicini a quelli che abbiamo ipotizzato prima, potresti scendere forse di qualche microsecondo ma non di più.

Lo scrivere il programma in basic temo possa peggiorare i tempi di cui sopra, aspettiamo qualche prova e poi vediamo.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[14] Re: Interrupt o polling?

Messaggioda Foto Utentecrestus » 16 ott 2010, 0:24

Anticipato da c1b8...

se vuoi più prestazioni con gli adc forse dovresti passare ai 24 o ai dspic ( che sono fatti apposta per quello)...:)
...:::Pivello allo sbaraglio:::...

MY WEBSITE! come and see... ;) <-- Di nuovo online... spiacente per i problemi tecnici!
Avatar utente
Foto Utentecrestus
1.295 2 7 13
Expert EY
Expert EY
 
Messaggi: 478
Iscritto il: 3 ott 2008, 10:28
Località: studente al politecnico di torino

0
voti

[15] Re: Interrupt o polling?

Messaggioda Foto Utenteaduri » 16 ott 2010, 1:01

Grazie a tutti spero di riuscire a fare qualcosa domani.

ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[16] Re: Interrupt o polling?

Messaggioda Foto Utenteaduri » 18 ott 2010, 9:49

Salve a tutti,
ho portato un po' avanti il progettino ma ho qualche problema.
Portando fuori il trigger si creano forti disturbi, spero di poterli risolvere schermando.
Ho tirato giù questo piccolo codice in Mikrobasic e sul pic18F877A ricevo i valori su Yperterminal col 18F4550 solo degli zeri.
Non mi sembra di aver visto, nel datasheet del 18F4550, dei settaggi particolari per la Usart ma forse mi sono sfuggiti, ho visto che sono previste diverse tipologie di seriali Eusart ecc...
Premetto che ho ridotto al minimo i samplig nei cicli for /next per un debug più veloce il nr. vero è nelle note.


Ecco il codice che compila perfettamente:

Codice: Seleziona tutto
program prova_da_adc_232_4550

'in prova_da_adc_232 ok test rb0 pooling

dim t as word
    Text as char[20]
    tword as string[5]
    i as byte

    dim Va as word[4][4] 'matrice bidim. anodica
    dim Vk as word[4][4] 'matrice bidim. catodica
    dim Ca,g,ch as byte      'Ca ---> campioni, g---->tens. griglia
   
  sub function ReadADC(dim Ch as Byte) as word
    ADCON2 = %10001010 '  FOSC/32  ,  2 TAD  ,Right Justified
    ADCON0 =  Channel * 4
    SetBit(ADCON0,ADON)
    SetBit(ADCON0,GO)
    while TestBit(ADCON0,GO) wend   'Wait for Conversion
    Result = ADRESH  * 256 + ADRESL  '10 Bit  Right Justified
    ClearBit(ADCON0,ADON)
  end sub

sub procedure Usart_out

  Usart_Init(9600)

for g=0 to 3
          for Ca=0 to 1

              t=Va[g][Ca] 'carico matrice anodica dove k indice tensione di griglia
                     wordtostr(t,tword)
                     Usart_Write_text(tword)
                     Usart_Write(",")

              t=VK[g][Ca] 'carico matrice catodica dove k indice tensione di griglia
                     wordtostr(t,tword)
                     Usart_Write_text(tword)
                     Usart_Write(";")
          next Ca
next g

end sub

sub procedure setup

    lcd_cmd(LCD_CLEAR)
    lcd_out(1,1,"Inizializzazione")
    lcd_chr(2,9,"S")
    lcd_chr(2,10,"T")
    lcd_Out(2,11,"ART")
    delay_ms(1000)

end sub

main:

  TRISC=0x00
  PORTB  =0
  TRISB  =0
  intcon =0
  Lcd_init(PORTD)
  lcd_cmd(LCD_CURSOR_OFF)
  lcd_cmd(LCD_CLEAR)
  'Text ="Tracciacurve per valvole"
  lcd_out(1,1,"Tracciacurve per valvole")
  Text ="A. Durighello"
  lcd_out(2,1, Text)
  'Setbit(PORTB,1)     'for USB project
  OPTION_REG = $80
  ADCON1     = $82
  TRISA      = $FF
  Delay_ms(1000)
  lcd_cmd(LCD_CLEAR)
  Text  = "Ciclo letture:"
  Delay_ms(2000)
  lcd_out(2,1,Text)

  setup

while true
if (portb. 0 = 1) then

for g=0 to 3  'nr. 7 misure x ogni tensione di griglia

  for Ca=0 to 1   '70 campioni per ogni tensione
             'Va[g][Ca]=Adc_Read(0)  'carico matrice anodica dove k indice tensione di griglia
             'Vk[g][Ca]=Adc_Read(1)  'carico matrice catodica dove k indice tensione di griglia
             
             'adc con registri x 18f4550
             Va[g][Ca]=ReadADC(0)
             Vk[g][Ca]=ReadADC(1)
             

             delay_us(3)            'ritardo per ottenere circa 10msec di tempo totale di acquisizione

  next Ca
  'g=g+1   ' se volessi sincronizzami per ogni gradino di Vg (togliere ciclo for g)

next g
    if (g = 3)  then
       usart_out
    end if

end if
wend

end.


Ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[17] Re: Interrupt o polling?

Messaggioda Foto Utentec1b8 » 18 ott 2010, 11:58

In questo momento non riesco a guardare per bene tutto il codice, ma la prima cosa che noto è che la:
Codice: Seleziona tutto
  sub function ReadADC(dim Ch as Byte) as word
    ADCON2 = %10001010 '  FOSC/32  ,  2 TAD  ,Right Justified
    ADCON0 =  Channel * 4
    SetBit(ADCON0,ADON)
    SetBit(ADCON0,GO)
    while TestBit(ADCON0,GO) wend   'Wait for Conversion
    Result = ADRESH  * 256 + ADRESL  '10 Bit  Right Justified
    ClearBit(ADCON0,ADON)
  end sub

riceve Ch come valore del canale, ma poi fai
Codice: Seleziona tutto
    ADCON0 =  Channel * 4

che credo sia da correggere in
Codice: Seleziona tutto
    ADCON0 =  Ch * 4


Il resto lo guardo con un po' di calma più tardi.

Edit: un chiarimento a me che non uso il basic. Il basic è case sensitive?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[18] Re: Interrupt o polling?

Messaggioda Foto Utenteaduri » 18 ott 2010, 12:46

No,
non mi risulta sia case sensitive.

Che errore stupido :oops: l'unica scusante..."era domenica notte" ed ero un po' demoralizzato.

ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[19] Re: Interrupt o polling?

Messaggioda Foto Utenteaduri » 21 ott 2010, 11:46

Questo è un errore macroscopico che ho subito corretto:

Codice: Seleziona tutto
  dim Va as word[4][4] 'matrice bidim. anodica
    dim Vk as word[4][4] 'matrice bidim. catodica

in

Codice: Seleziona tutto
dim Va as word[7][70] 'matrice bidim. anodica
    dim Vk as word[7][70] 'matrice bidim. catodica


ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 10
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti