ADC e microcontrollore Atmega8535

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

ADC e microcontrollore Atmega8535

Postby fram » 09 May 2013, 14:37

salve, devo realizzare un sensore di temperatura con LM35 con microcontrollore 8535 in assembly, ho gia studiato il microcontrollore e ho capito come devo iniziare a programmare, quello che non capisco è come faccio a conoscere il valore in binario che mi ritrovo nel ADC DATA REGISTER a 16 bit.esempio se ho una temperature di 25,5 °c come lo capisco dal registr??
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: microcontrollore 8535

Postby deluca » 09 May 2013, 15:00

benvenuto al forum fram, (ferroelectric random acces memory) :)

innanzi tutto, per parlare la stessa lingua e poterti aiutare, abbiamo bisogno dello schema e del codice che hai intenzione di utilizzare o che stai scrivendo.
quando parli di 8535 stai indicando un atmega8535 o un at90s8535? .... poichè qualcosina cambia.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore 8535

Postby fram » 09 May 2013, 15:20

Grazie per il benvenuto.
mi scuso se sono stato molto impreciso ma sono nuovo sia dei forum che dei micro controllori, cmq si tratta dell'atmega8535, devo scrivere il codice in AVR Studio in codice assembly. il codice ancora non l'ho scritto perchè sto cercando di organizzare il lavoro e capire bene il funzionamento.per quanto riguarda lo schema a quale si riferisce?
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore 8535

Postby deluca » 09 May 2013, 19:49

@fram,
Mi riferisco allo schema elettrico del circuito.
I collegamenti tra il sensore e il micro.
Dove collegherai il segnale d'uscita, il canale dell'ADC scelto, il modo in cui vuoi leggere la temperatura, display, seriale, ecc ecc.
Il quarzo che utilizzerai.....

Ovvero: lo schema elettrico

Stai usando una schedina fatta in casa o una demo board?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore 8535

Postby fram » 13 May 2013, 15:33

Salve, per il momento sto utilizzando una demo board la STK500. lo schema dell'ADC non mi carica il file cmq se può lo si osserva anche dal data sheet dell'atmega8535. il sensore di temperatura LM35 lo voglio mettere su ADC0 il sensore di temperatura mi deve dare 10mV/°C per farlo devo avere un guadagno x5, lo faccio all'esterno del microcontrollore , lo vorrei visualizzare su di un display 16x2, come posso fare per la visualizzazione?.
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore 8535

Postby deluca » 13 May 2013, 18:58

fram wrote:Salve, per il momento sto utilizzando una demo board la STK500. lo schema dell'ADC non mi carica il file cmq se può lo si osserva anche dal data sheet dell'atmega8535. il sensore di temperatura LM35 lo voglio mettere su ADC0 il sensore di temperatura mi deve dare 10mV/°C per farlo devo avere un guadagno x5, lo faccio all'esterno del microcontrollore , lo vorrei visualizzare su di un display 16x2, come posso fare per la visualizzazione?.


Ciao fram,
quando dici che vorresti visualizzare su un display la temp, intendi dire che non sai:

- come fare dal punto di vista hw o fw?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore 8535

Postby fram » 14 May 2013, 09:53

Salve, mi spiego meglio, avendo la temperatura in digitale nel registro ADC data register a 16 bit come fare per prelevare il dato e trasformarlo in 8 bit e poi in codice ascii per il displey.
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore 8535

Postby fram » 14 May 2013, 15:40

Salve, mi dite come trasformo un segnale analogico Es. il segale che mi da LM35 per una temperatura di 25,5°C è di 0,255V in digitale come faccio a trasformarlo in codice ASCII?
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore 8535

Postby Fagos » 14 May 2013, 19:11

fram,
puoi mostrare il codice asm che stai usando per leggere il valore dall'adc?
perchè devi convertire il valore in codice ascii? non capisco.
Forse stai confondendo con BCD, cioè vuoi visualizzare in qualche posto, lcd, display 7seg, il valore 255, giusto?
non riesco a capire cosa vuoi dire.... scusa.
User avatar
Fagos
 
Posts: 100
Joined: 31 Aug 2011, 15:01

Re: ADC e microcontrollore 8535

Postby deluca » 14 May 2013, 20:21

Ciao fram,
volevo fare alcune premesse a proposito del sensore che stai per utilizzare.
L'atmega8535 ha un ADC a 10 bit che può apprezzare 1024 valori discreti.
Con una alimentazione di 5V tu hai una risoluzione di 5000mV/1024 = 4.8mV.
Poichè LM35 ha una uscita di 10mV/C° la risoluzione del termometro sarà di 10mV/4.8mV ~ 0.5ºC .

Ora vorrei capire bene quale è il tuo problema, ma se non inizi a postare qualche riga di codice difficilmente sarò in grado di capire quali sono i tuoi dubbi per poterti aiutare.

Tutto il resto, conversione dei dati, gestione LCD, può essere affrontata in un secondo momento...... anche perchè mi sembra un tantino più complessa.

Puoi postare il codice con la quale configuri l'ADC ed avvii la conversione? iniziamo dal primo step.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore Atmega8535

Postby fram » 16 May 2013, 15:33

Salve ho scritto il programma per inizializzare l'ADC volevo sapere se va bene, mi sono aiutato da un esempio che avevo sull'ADC, mi fate sapere se può andare bene cosa devo cambiare, il mio obbiettivo è quello di avere il dato trasformato in binario in un registro per poi trasformarlo in un numero con la virgola.ora posto il programma:

Code: Select all
.nolist
.include "m8535def.inc"
.list

;--------------------------------------------------------------
.def temp = r16

;Interrupt vector table ---------------------------------------
.cseg
.org 0x00
rjmp RESET       ; Reset Handler
reti          ; IRQ0 Handler
reti          ; IRQ1 Handler
reti           ; Timer2 Compare Handler
reti           ; Timer2 Overflow Handler
reti           ; Timer1 Capture Handler
reti           ; Timer1 Compare A Handler
reti           ; Timer1 Compare B Handler
reti          ; Timer1 Overflow Handler
reti          ; Timer0 Overflow Handler
reti          ; SPI Transfer Complete Handler
reti           ; USART RX Complete Handler
reti          ; UDR Empty Handler
reti           ; USART TX Complete Handler
rjmp TX_USART    ; ADC Conversion Complete Handler
reti          ; EEPROM Ready Handler
reti          ; Analog Comparator Handler
reti          ; Two-wire Serial Interface Handler
reti           ; IRQ2 Handler
reti           ; Timer0 Compare Handler
reti           ; Store Program Memory Ready Handler

;Main --------------------------------------------------------------

RESET:
   
   ;Initializzazione Stack Pointer
   ldi      temp,low(RAMEND);metto la parte finale dello stack pointer in temp
   out      SPL,temp ;metto temp in spl
   ldi      temp,high(RAMEND)
   out      SPH,temp
   
   ;###Clear registro###
   clr      temp

   ;###porte I/O###
   ;PortB è output
   ser      temp   ;scrivo in temp 0b111111111      
   out      DDRB, temp ;imposto la portaB come out
   out      PORTB, temp ;abilito la rete pull-up sulla portaB

   ;###USART setup###
   sbi      UCSRB, TXEN   ;Abilito il trasmettitore di USART
   ldi    temp, 3<<UCSZ0 ;Carico in temp=00000110 per poi metterlo 
   out      UCSRC, temp    ;in UCSRC per avere 8 bit
   clr      temp
   out      UBRRH, temp    ;setto la baud rate a 2,4kbps,con frequenza
   ldi      temp, 95       ;dell'oscillatore pari a 1,8432MHz (UBRR=95)
   out      UBRRL, temp

   ;###ADC setup###
   sbi    ADMUX, ADLAR;Setto l'ADC,Vrif=2,56,segnale analogico posto su ADC0
   ldi      temp, (1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2) ;Abilito l'ADC,
   out      ADCSRA, temp  ;prescaling=16,abilito l'interrupt,auto-triggering (free-running)
   sbi      ADCSRA, ADSC ;Start of conversion (first sample)

   sei  ;Abilito il Global interrupt
   
Loop:
    rjmp loop
TX_USART:
   in      temp, ADCH ;Prendo il risultato in ADCH e lo metto in temp
   out      PORTB, temp;Pongo il risultato di temp in out PORTB
   ;polling UDRE
   sbis   UCSRA, UDRE
   rjmp   TX_USART
   out      UDR, temp
   ;clear ADIF flag (with 1L)
   ;sbi      ADCSRA, ADIF
   reti
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore Atmega8535

Postby js-bascom » 16 May 2013, 21:39

Un paio di cosette:
Hai connettato(connesso) AVCC e GND?
E' di solito una buona idea conservare e restaurare SREG negl'Interrupts anche se in questo caso no doverebbe dare disturbi. Esempio
Code: Select all
ISR_ADC:
   in   save_sreg,sreg      ;Save Status register
;Do something here   
   out   sreg,save_sreg      ;Restore Status register
   reti
io uso R15 per save_sreg

Nel tempo che mandi un byte tramite l'USART l'ADC completera' diverse conversioni in modo free-running

Se visualizzi i risultati in un terminal solo i valori 0x20 a 0x7f faranno un po' di senzo, il resto sara' incomprensibile almeno che non usi un terminal che possa convertire i valori ricevuti in mode hex.
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: ADC e microcontrollore Atmega8535

Postby deluca » 16 May 2013, 21:42

@fram,
ma tu vuoi visualizzare il valore della temperatura in °C in un display LCD 16x2 o vuoi trasmetterlo con la UART?
se si, rimboccati le maniche poichè hai molto da scrivere in assembly.....

Il tuo codice è molto basilare ma funzionante però esegue la conversione solo una volta ...
poi si ferma e il dato viene posto in binario sulla portaB.

Per aiutarti di dò qualche dritta in merito al flow-chart che devi seguire.

-Vettori interrupts
-Inizia con il reset del micro
-Configura ADC
-Start ADC
-Inizializza LCD
-Cursore Off
-Leggi dall'ADC
-Moltiplica il valore letto x 5
-Ricava il modulo 10 dal valore appena calcolato
-Dividi / 10
-Converti da intero a stringa i due valori
-Posiziona il cursore a 1,1 del LCD
-Mostra il valore della divisione & , & valore modulo
-aspetta un pò prima della prossima conversione
-ricomincia.... da leggi ADC

Ecco il risultato
adc_atmega8535.jpg
adc_atmega8535.jpg (106.29 KiB) Viewed 9686 times
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore Atmega8535

Postby fram » 17 May 2013, 14:49

Salve, grazie per gli aiuti che mi state dando sono molto utili.
@deluca
per quanto riguarda il mio progetto io voglio visualizzare il valore della temperatura in °C in un display LCD 16x2, ho eliminato la parte della UART(ok?).
ora volevo un chiarimento:
la pare che riguarda,
-Moltiplica il valore letto x 5
-Ricava il modulo 10 dal valore appena calcolato
-Dividi / 10
-Converti da intero a stringa i due valori
se non ho capito male serve per ricavarmi dal valore che mi da l'adc il valore in decine e unità della temperatura per visualizzarla sul display.
quello che non capisco è come realizzare il MODULO 10 .
grazie
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore Atmega8535

Postby deluca » 17 May 2013, 21:32

@fram
Quelle operazioni che ti ho elencato servono per ricavare la parte decimale e la parte intera della temperatura e non unità e decine:

es: 35,6 °C

ecco come si fa il modulo 10:

volt è il valore di ingresso
volt_d è il modulo 10

Code: Select all
;----Volt_d = Volt mod 10                                   
      lds      zl,volt
      push     zl
      ldi      zl,Low(10)
      pop      r24
      call     Div8u
      mov      zl,r22
      sts      volt_d,zl


;----8/8 unsigned division
Div8u:  Sub     r22,r22
        ldi     r23,0x09
        rjmp    Div81
Div80:  rol     r22
        cp      r22,zl
        brcs    Div81
        Sub     r22,zl
Div81:  rol     r24
        dec     r23
        brne    Div80
        Com     r24
        mov     zl,r24
        ret


Ps. Ti posso chiedere x cosa ti serve il progetto, UNI, scuola o altro?
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore Atmega8535

Postby fram » 18 May 2013, 09:48

Salve, grazie ancora.
questo programma mi da errore all'istruzione "call Div8u" mi dice carattere non valido.

comunque il progetto è per l'universita',ho un po' di difficoltà perchè il corso è da auto didatta poichè il corso non sono riuscito a seguirlo, e ora non c'è più per cambio di riforma universitaria.
La ringrazio per l'aiuto.
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore Atmega8535

Postby js-bascom » 18 May 2013, 23:07

"call Div8u" mi dice carattere non valido.
Hai provato rcall Div8u? Non penso che call esiste nel 8535.
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: ADC e microcontrollore Atmega8535

Postby deluca » 20 May 2013, 11:48

Ciao,
Quella che ho postato è solamente una porzione del codice completo,
simulato come visibile dallo snap-shot.

Non so se è "educativo" postarlo tutto ;) vedremo i risvolti....
Cmq, il build del codice funziona perfettamente con le versioni di AVRstudio4.

Buon lavoro.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: ADC e microcontrollore Atmega8535

Postby fram » 20 May 2013, 16:14

Salve,
grazie per le risposte che mi sta dando mi sono utili.Del flow-chart che mi ha inviato ho svolto tutto:
-Vettori interrupts
-Inizia con il reset del micro
-Configura ADC
-Start ADC
-Inizializza LCD
-Cursore Off
-Leggi dall'ADC
-Moltiplica il valore letto x 5
-Ricava il modulo 10 dal valore appena calcolato
-Dividi / 10
-Converti da intero a stringa i due valori
-Posiziona il cursore a 1,1 del LCD
-Mostra il valore della divisione & , & valore modulo
-aspetta un pò prima della prossima conversione
-ricomincia.... da leggi ADC
quello che non riesco a capire e cosa fa il modulo10.Quello che mi ha postato se non ho capito male fa le seguenti funzioni
Modulo_10:

;----volt_d =volt mod 10

lds zl,volt ;carico in zl il valore di volt dallo spazio dati
push zl ;inserisco zl in cima allostack
ldi zl,Low(10) ;memorizzo in zl la posizione bassa(10)
pop r24 ;tolgo dallo stack il registro r24
call Div8u ;salta alla subrutine Div8u
mov zl,r22 ;muovi il contenuto di r22 in zl
sts volt_d,zl ;memorizzo direttamente dallo spazio dati


;----8/8 unsigned division

Div8u: Sub r22,r22
ldi r23,0x09
rjmp Div81
Div80: rol r22 ;shifta a sinistra di un bit mettendo in ultima posizione C(carry)
cp r22,zl ;compara r22 con zl
brcs Div81 ;salto a Div81 se il C=1
Sub r22,zl ;faccio la sottrazione
Div81: rol r24 ;shifta a sinistra di un bit mettendo in ultima posizione C(carry)
dec r23 ;decremento r23
brne Div80 ;salto a Div80 se r23=0
Com r24 ;fa il complemento a 1
mov zl,r24 ;metto in zl il contenuto di r24
ret ;ritorna al punto+1 da dove era prima di entrare nella rutine
quello che mi ritorna questo programma lo devo dividere x10
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Re: ADC e microcontrollore Atmega8535

Postby fram » 20 May 2013, 17:14

Quello che non capisco sono i contenuti dei registri che lei utilizza, r22,r23,r24.
La sub r22, r22 xkè viene fatta?
fram
 
Posts: 34
Joined: 09 May 2013, 14:29

Next

Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 3 guests

cron