logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][ASM]ADC nie działa poprawnie

tmkd 06 Gru 2009 01:08 2094 11
REKLAMA
  • #1 7350676
    tmkd
    Poziom 11  
    Witam, mam problem z ADC. Moja aplikacja ma uruchomiony timer który co jakiś czas wywołuje powoduje uruchomienie ADC, oraz po skonczeniu konwersji(przerwanie). ADCL jest wysyłany przez UART do PC. AVCC jest podpięte do VCC, zaś AREF nie jest podpięte bo używam wewn AREF. Problem jest taki że dostaje ciągle ta sama liczbe 4 jako wynik konwersji.
    Proszę was o pomoc. W czym może być problem.
  • REKLAMA
  • #2 7350688
    riddyk
    Poziom 20  
    Czy na pewno korzystasz z wewnętrznego AREF?, może spróbuj podłączyć pod napięcie referencyjne napięcie zasilania.
  • #4 7351102
    tmkd
    Poziom 11  
    Przepraszam,już wklejam
    
    .nolist
    .include "m8def.inc"
    .list
    .def tmp=R16
    
    ;rejestry gdzie laduje argumenty funkcji
    .def arg1=R17
    .def arg2=R18
    ;do tch dwoch laduje dwa bajty ktora zciagam ze stosu gdy jestem
    ;w funkcji
    .def highStack = R1
    .def lowStack  = R2
    			ldi tmp,HIGH(RAMEND)
    			out SPH,tmp
    			ldi tmp,LOW(RAMEND)
    			out SPL,tmp
    			ldi tmp,1<<IVCE
    			out GICR,tmp
    			ldi tmp,1<<IVSEL
    			out GICR,tmp
    
    			ldi arg1,0x0   ;high UBRR
    			ldi arg2,0x33  ;low  UBRR
    			;usart
    			rcall UART_init
    
    			;timer
    			rcall TIMER0_init
    
    			;adc
    			;ADCSRA
    				ldi tmp,0
    						;ENABLE    FREE STOP  INT ENABLE
    				ldi tmp,(1<<ADEN)|(0<<ADFR)|(1<<ADIE)|(7)
    				push tmp
    			;ADMUX
    			;		 VREF		ADJUST       PINY
    			    ldi tmp,0
    				ldi tmp,(1<<REFS0)|(0<<ADLAR)|(0x3)
    				push tmp    
    				
    			rcall ADC_init
    main:
    			nop
    			nop
    rjmp main
    configure:
    
    RET
    
    ADC_start:
    			sbi ADCSRA,ADSC
    			RET
    ;zmienna na stosie maja tak lezec
    ;ADMUX
    ;ADCSRA
    
    ADC_init:
    			cli
    			pop highStack
    			pop lowStack
    			;zciagam bajt adcsra ze stosu i wrzucam do rejestru
    		    pop tmp
    			out ADMUX,tmp
    			;zciagam bajt admux ze storu i wrzucam do rejestru
    			pop tmp
    			out ADCSRA,tmp
    
    			push lowStack
    			push highStack
    			sei
    			RET
    
    TIMER0_init:
    			cli
    				;maska przerwan
    				ldi tmp,(1<<TOIE0)
    				out TIMSK,tmp
    				;prescaler
    				ldi tmp,5;tutaj ustawiam szybkosc
    				out TCCR0,tmp
    			sei
    			RET
    
    UART_init:
    			;UMSEL w  UCSRC synchr(1)/asynchr
    			;U2X   w  UCSRC double speed asynchr
    			;DDR_XCK(rejestr) w kontroluje czy zegar 
    					  ;jest wewn czy z zewnatrz doprowadzany
    			;UBRR     ma byc 51 , do UBRRL wpisuje 0x33
    			;UCSZ2:0 ilosc bitow danych
    			;UPM1:0  ustawienia bitu parzystosci
    			;USBS    wyborm miedzy jednym a dwoma bitami stopu
    			cli
    				;ustawiam UBRR(prescaler)
    				out UBRRH,arg1
    				out UBRRL,arg2
    				;wlaczam transmiter i receiver
    				ldi tmp,(1<<TXEN)|(1<<TXCIE)
    				out UCSRB,tmp;
    				;ustawiam format ramki 2 bity stopu i 8 bitow danych
    				ldi tmp,(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
    				out UCSRC,tmp	
    				sei
    		    RET
    
    
    UART_send:
    			    pooling:
    				sbis UCSRA,UDRE
    				rjmp pooling
    			    out UDR,arg1
    
    			RET
    
    USART_TXC:
    				sbi DDRB,PB1
    				sbi PORTB,PB1
    
    			RETI
    
    TIMER0_OVF:
    				nop
    				nop			
    				rcall ADC_start
    			RETI
    ADC_COMPLETE: 
    				nop 
    				nop
    				nop
    				ldi arg1,ADCL
    				ldi tmp,ADCH
    			 	rcall UART_send
    		    RETI
    
    ;Skoki do procedur obslugujacych przerwania
    .org 0xc09
    rjmp TIMER0_OVF
    
    .org 0xc0d
    rjmp USART_TXC
    
    .org 0xc0e
    rjmp ADC_COMPLETE
    
  • REKLAMA
  • #5 7351156
    Weis
    Poziom 12  
    Tak to była bzdura. Jednak nie zdążyłem jej usunąć.
    0x04 to adres ADCL.
  • #6 7351190
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 7351445
    Konto nie istnieje
    Poziom 1  
  • #9 7351760
    tmkd
    Poziom 11  
    Aha, ladowalem adres ADCL:). Apropo odczytywania ADCL i ADCH,czyzby kolejnosc odczytywania zależała od tego czy jest wyrównane do prawej czy do lewej?

    If the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
    ADCH. Otherwise, ADCL must be read first, then ADCH, to ensure that the content of the Data
    Registers belongs to the same conversion. Once ADCL is read, ADC access to Data Registers
    is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is
    read, neither register is updated and the result from the conversion is lost. When ADCH is read,
    ADC access to the ADCH and ADCL Registers is re-enabled.
  • #10 7351850
    Weis
    Poziom 12  
    ADLAR= 1
    Odczyt ADCH to rozdzielczość 8 bitów
    Zobacz opis ADCSRA – ADC Control and Status Register A-ADLAR
  • REKLAMA
  • #11 7352007
    Konto nie istnieje
    Poziom 1  
  • #12 7360082
    tmkd
    Poziom 11  
    To było nic. Teraz najciekawsze. Jeżeli mam ADLAR na 0, to moge odczytac tylko ADCL, ADCH nie, tzn PC nie odbiera nic z RS-a. Jeżeli mam ADLAR 1 to moge odczytać oba z tym że w ADCH jest wartość ktora się nie zmienia zaś w ADCL zmienia się z 64 na 128 i na odwrót. Jako REFS piny mam tak (01), zaś ADMUX na (1110)(tzn na napiecie 1,3v). Proszę was powiedzcie co jest nie tak. Kod taki jak wyżej. Na arefs nie ma kondensatora. Ale watpie żeby jego brak był powodem aż takich dziwactw

    Dodano po 23 [minuty]:

    Program do odczytu, rs232Tester, nie wyswietla zer:) dlatego wydawalo mi się ze nie odczytuje nic:)
REKLAMA