Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema configurazione sensore AVR

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 29 nov 2012, 23:31

xyz ha scritto:Dalla domanda vedo che conosci poco l'assembler e questo non è bene visto che stai programmando in assembler.


:shock: perché sminuirmi così , sono solo un laureando in ingegneria elettronica e poi si sa che i linguaggi a basso livello danno un sacco di problemi...

xyz ha scritto:Il tuo problema è come fare le divisioni di un numero intero in assembler con un numero non potenza di 2 (sono le divisioni più facili con i numeri binari).


Esatto! in quel caso basta semplicemente effettuare degli shift a destra...

xyz ha scritto:Per convertire un numero binario senza segno in una sequenza di caratteri ASCII devi eseguire una serie di divisioni per 10 (il divisore), prendere il resto di ogni divisione, convertire il resto in un carattere ASCII, salvare il carattere in un buffer, il quoziente diventa il nuovo dividendo fino all'azzeramento.


Cioè se ad esempio io voglio inviare il valore 27 all'lcd devo dividere 27 per 10 e otterrò 2 con resto di 7 , mi converto il 7 in ascii sommandogli 0x30 e lo invio , dopodichè 2 diventerà il nuovo dividendo ma in questo caso è inutile dividere di nuovo per 10 :?
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

1
voti

[22] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentexyz » 30 nov 2012, 9:49

LesStrato ha scritto:perché sminuirmi così , sono solo un laureando in ingegneria elettronica e poi si sa che i linguaggi a basso livello danno un sacco di problemi...

Anch'io sono un ingegnere elettronico, conosco molto bene assembler di molte CPU. Una CPU con qualche problema sull'assembler sarebbe invendibile. Tutti i linguaggi ad alto livello compilati generano del codice macchina alla fine.

LesStrato ha scritto:... dopodichè 2 diventerà il nuovo dividendo ma in questo caso è inutile dividere di nuovo per 10

Questa è una ottimizzazione, comunque la divisione per 10, almeno una, la devi fare (gli AVR non hanno istruzioni assembler per le divisioni o istruzioni come "daa" del x86_32).
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[23] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 1 dic 2012, 0:37

xyz visto che come detto lavoro a 10 bit ma finché non supererò il valore 255 è come se stessi lavorando ad 8 bit e quindi in pratica prenderò sempre in considerazione adcl , ho seguito quel diagramma di flusso su come effettuare una divisione ad 8-bit contenuto in quella documentazione atmel da te inviatami nello scorso post e ho scritto il codice assembly , te lo posto per avere da te una conferma se va tutto ok. Intanto il diagramma di flusso lo riporto in allegato, mentre il codice è il seguente:

Codice: Seleziona tutto
;*********************
;   Declarations    *
;*********************

.def   remainder = r20      ; Resto
.def   divid = r21              ; Dividendo / Risultato
.def   divis = r22              ; Divisore
.def   lcnt = r23              ; Loop-Counter

;***********
;   Code  *
;***********
                                   
div8u:   
   sub remainder , remainder      ; Clear remainder and carry
        ldi lcnt , 9             ; Init loop counter
        d8u_1:   
      rol divid         ; Shift left dividend
                dec lcnt         ; Decrement counter
                brne d8u_2     ; If done
                ret             ; Return
        d8u_2:   
      rol remainder                 ; Shift left remainder
                sub remainder , divis           ; Remainder = remainder - divisor
                brcc d8u_3                      ; If result negative
                add remainder, divis           ; Restore remainder
                clc                         ; Clear carry to be shifted into result
                rjmp d8u_1              ; Else
        d8u_3:   
      sec           ; Set carry to be shifted into result
                rjmp d8u_1


Prima di richiamare la routine dovrei fare:

Codice: Seleziona tutto
in divid , ADCL      ; Leggo ADCL (dovrei leggere anche ADCH ma a titolo d'esempio non lo faccio)
ldi divis , 10          ; Carico sul registro divisore il valore 10
lsr divid                ; Effettuo 2 shift a destra sul dividendo (come detto il risultato è Temperatura*4)
lsr divid
rcall div8u
adiw divid , 0x30             ; Conversione in ascii
adiw remainder , 0x30


A tutto ciò seguirà l'invio su lcd...non l'ho ancora testato , spero almeno la logica sia giusta...
Allegati
Cattura.PNG
Cattura.PNG (19.03 KiB) Osservato 3755 volte
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[24] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentecyclone » 1 dic 2012, 17:17

Ciao,
ti allego il sorgente in asm che ho scritto per configurare l'adc a 10bit, leggere una valore da un ingresso analogico, convertire questo valore in stringa e visualizarlo su un lcd 16x2.
E' chiaro che si tratta di una linea guida e magari potrai provare ad ottimizzarlo ma a mio avviso ti può aiutare per capire come fare.

Codice: Seleziona tutto
;
.include   "C:\AVRASM\inc\m163def.inc"
;
      .DSEG
voltraw:            .Byte    2
      
      .CSEG
.ORG   0

_Reset:
      ldi      yl,Low(RAMEND)
      out      SPL,yl
      ldi      yh,high(RAMEND)
      out      SPL+1,yh
      sbiw   yl,32
      call   LcdIni

;Start Adc
      ldi      zl,0x86
      out      ADCSR,zl

;metti il cursore Off
      ldi      r24,0xC
      call   _LCtr

;inizia il Loop per l'acquisizione, conversione e visualizzazione                  
L0000:

;acquisisci dall'adc
      ldi      zl,Low(1)
      in      zh,ADMUX
      andi   zh,0xe0
      Or      zl,zh
      out      ADMUX,zl
      call   _Adc
      sts      voltraw,zl
      sts      voltraw+1,zh

;visualizza il valore sul Display
      ldi      r24,0x7F
      push   r24
      ldi      zl,Low(1)
      pop      r24
      add      r24,zl
      call   _LCtr
      ldi      zl,Low(S000*2)
      ldi      zh,high(S000*2)
      call   _LSc
      lds      zl,voltraw
      lds      zh,voltraw+1
      call   _W2Str
      call   _LBW
      ldi      zl,Low(S001*2)
      ldi      zh,high(S001*2)
      call   _LSc

;aspetta 10 msec prima della prossima acquisizione
      ldi      zl,Low(10)
      call   _Wms

      rjmp   L0000
L0001:

;fine del programma
L0002:
      jmp   L0002

;tabella costanti
S000:   .db   "Valore: ", 0
S001:   .db   "   ", 0

;inizializza l'lcd
LcdIni:   in      zl,DDRC
      ori      zl,0xf0
      out      DDRC,zl
      sbi      DDRC,3
      sbi      DDRC,2
      cbi      PORTC,3
      cbi      PORTC,2
      ldi      zl,0x10
      rcall   _Wms
      ldi      r24,0x03
      rcall   _LOut
      ldi      zl,0x05
      rcall   _Wms
      rcall   _LEN
      ldi      zl,0x06
      rcall   _Wus
      rcall   _LEN
      cbi      PORTC,4
      rcall   _LEN
      ldi      r24,0x28
      rcall   _LCtr
      ldi      r24,0x06
      rcall   _LCtr
      ldi      r24,0x0c
      rcall   _LCtr
      ldi      r24,0x01
      rcall   _LCtr
      ldi      zl,0x03
      rcall   _Wms
      ret

_Lch:   sbi      PORTC,3
      rjmp   _LNib
      
_LCtr:   cbi      PORTC,3
_LNib:   mov      r21,r24
      Swap   r24
      rcall   _LOut
      mov      r24,r21
_LOut:   in      r23,PORTC
      andi   r23,0x0f
      Swap   r24
      andi   r24,0xf0
      Or      r24,r23
      out      PORTC,r24
      rcall   _LEN
      ret

;Lcd Enable
_LEN:   sbi      PORTC,2
      Nop
      Nop
      Nop
      Nop
      cbi      PORTC,2
      push   zl
      ldi      zl,0x04
      rcall   _Wus
      pop      zl
      ret

;Lcd Byte & Word
_LBW:   ld      r24,Z+
      tst      r24
      breq   _LBW1
      rcall   _Lch
      rjmp   _LBW
_LBW1:   ret

;Lcd String constants
_LSc:   lpm
      tst      r0
      breq   _LSc1
      mov      r24,r0
      rcall   _Lch
      adiw   zl,1
      rjmp   _LSc
_Lsc1:   ret

;Adc
_Adc:   sbi      ADCSR,0x06
_Adc1:   sbic   ADCSR,0x04
      rjmp   _Adc1
      in      zl,ADCL
      in      zh,ADCH
      sbi      ADCSR,0x04
      ret

;converti Intero To Stringa
_B2str:   clr   zh
      clt
      rjmp   _W2st4
_W2str:   clt
      rjmp   _W2st4
_I2str:   clt
      sbrs   zh,0x07
      rjmp   _W2st4
      Com      zl
      Com      zh
      subi   zl,-0x01
      sbci   zh,-0x01
      Set
_W2st4:   push   yl
      push   yh
      push   r6
      clr      r6
      st      -Y,r6
_N2str:   ldi      r21,0x10
      Sub      r22,r22
_N2st1:   lsr      r6
      rol      zl
      rol      zh
      rol      r22
      rol      r6
      cpi      r22,0x0a
      brcs   _N2st2
      sbci   r22,0x0a
      inc      zl
_N2st2:   dec      r21
      brne   _N2st1
      subi   r22,-0x30
      st      -Y,r22
      mov      r22,zl
      Or      r22,zh
      brne   _N2str
_N2st5:   brtc   _N2st3
      ldi      zl,0x2d
      st      -Y,zl
_N2st3:   mov      zl,yl
      pop      r6
      mov      zh,yh
      pop      yh
      pop      yl
      ret

;WaitMs
_Wms:   ldi      r20,0x14
_Wms1:   ldi      r21,0x85
_Wms2:   dec      r21
      brne   _Wms2
      dec      r20
      brne   _Wms1
      dec      zl
      brne   _Wms
      ret

;WaitUs
_wus:   ldi      r22,25
_wus1:   dec      r22
      brne   _wus1
      dec      zl
      brne   _wus
      ret



spero possa essere stato di aiuto.
ciao.
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

-4
voti

[25] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 6 dic 2012, 19:31

Ma qui siete abituati a lasciar le discussioni insospese? Avevo postato un codice e nessuno si è degnato di dare un giudizio se fosse corretto o meno. A me ancora non funziona nulla , sull'lcd compare il solo cursore lampeggiante senza alcuna temperatura, una cosa del genere:

Temp: _ °C

In pratica non mi invia i numeri perché ci saranno problemi nella conversione a/d ma non capisco cosa.
Nel caso in cui vi foste dimenticati vi riepilogo sostanzialmente ciò che fa il mio codice sperando in un'illuminazione concreta:

1) Lavoro con un mcu atmel con l'ADC a 10 bit per cui ADLAR = 0 e leggo prima ADCL e poi ADCH
2) L'lm35 mi da 1°C ogni 10mV = 0.01V
3) Utilizzo la Vref interna di 2.56V con un ceramico da 100nF sul pin di AREF
4) Il risultato della conversione è : ADC=\frac{Vin\cdot 1024}{Vref}=\frac{0.01\cdot 1024}{2.56}=4

Cioè per 1°C ottengo il valore 4 , per 2°C il valore 8 , per 3°C il valore 12 , in pratica ottengo sempre ADC=4\cdot Temperatura. Considerando che a me interessa un range compreso tra 0°C e 50°C , il valore massimo che otterrò (per 50°C) sarà ADC = 200. Per cui non supererò mai il valore 256 ed è come se stessi lavorando ad 8bit , quindi è vero che leggo sia ADCL o ADCH ma ADCH sarà sempre vuoto, quindi mi basterà lavorare su ADCL giusto?

5) Setto ADMUX e ADCSRA (scelgo Vref , canale di acquisizione, 10bit ecc ecc..) e MCUCR con la modalità di sleep per l'ADC noise reduction , ma non inizio ancora la conversione (ADSC = 0)
6) Leggo ADCL e ADCH con questa routine:
Codice: Seleziona tutto
sbi ADCSRA , ADSC
         sleep
wait: sbis ADCSRA , ADIF
        rjmp wait
        in r18 , ADCL
        in r19 , ADCH
        rjmp convert


7) Vado alla routine convert in cui faccio le seguenti operazioni:
- Faccio 2 shift a destra (divido x 4 in modo da ottenere la temperatura) su r18 (che contiene il risultato di conversione)
- Eseguo la routine di divisione per 10 ad 8 bit che trovate nello scorso post , in modo da ottenere decine ed unità.
- Aggiungo sia alle decine che alle unità 0x30 per convertire in ASCII ed invio al display

Io ancora non capisco cosa c'è che non vada , questi miei ragionamenti non fanno una grinza :?
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

5
voti

[26] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentemarco438 » 6 dic 2012, 19:45

LesStrato ha scritto:Ma qui siete abituati a lasciar le discussioni insospese? Avevo postato un codice e nessuno si è degnato di dare un giudizio se fosse corretto o meno.

Qui nessuno lavora a cottimo ne viene pagato per risponderti.
Avrai le risposte quando chi ne e' in grado avra il tempo e la voglia di farlo.
marco
Avatar utente
Foto Utentemarco438
37,1k 7 11 13
-EY Legend-
-EY Legend-
 
Messaggi: 16323
Iscritto il: 24 mar 2010, 15:09
Località: Versilia

-3
voti

[27] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 6 dic 2012, 21:21

marco438 ha scritto:Qui nessuno lavora a cottimo ne viene pagato per risponderti.
Avrai le risposte quando chi ne e' in grado avra il tempo e la voglia di farlo.


Certamente non lo metto in dubbio , non pretendo nulla infatti , dico solo che non è carino lasciare a metà una conversazione avviata, qui sul forum ci sono molti professionisti per cui questi miei problemini sono bazzeccole , vabbè non importa, mi sono beccato anche -4 per aver espresso un'opinione...
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[28] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 6 dic 2012, 21:54

Non ho parole...
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

0
voti

[29] Re: Problema configurazione sensore AVR

Messaggioda Foto Utentexyz » 6 dic 2012, 22:48

LesStrato ha scritto:Ma qui siete abituati a lasciar le discussioni insospese? Avevo postato un codice e nessuno si è degnato di dare un giudizio se fosse corretto o meno

Non c'era nulla di rilevante o errori che saltano subito all'occhio o ragionamenti sbagliati, poi sei tu che stai programmando il codice e nessun qui è tenuto a risponderti O_/
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[30] Re: Problema configurazione sensore AVR

Messaggioda Foto UtenteLesStrato » 6 dic 2012, 22:58

xyz ha scritto:nessun qui è tenuto a risponderti


Mi spiace che vi siate messi tutti conto me per aver detto la mia e mi spiace anche che la pensiate tutti in questo modo...Lo spirito giusto di un forum dovrebbe esser quello di scambiare opinioni e di aiutare persone in difficoltà...invece sembra solo che vi divertiate a toglier punti senza ricevere e cogliere il vero spirito del messaggio di un utente in difficoltà iscrittosi al forum con la speranza di migliorare le proprie conoscenze...
Avatar utente
Foto UtenteLesStrato
-13 3
 
Messaggi: 35
Iscritto il: 20 mar 2012, 23:48

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti