Ich will mit nem Mega32 ne Spannung zwischen 0V und 2,5V messen, dafür hab ich am ADC-Referenzpin (AREF) 2,5V angelegt und zum testen an Port C Pin 7 eine Spannung von 1,2V.
(hab auch alles nochmal nachgemessen)
Allerdings spuckt der ADC immer nur den gleichen Wert aus: 1284
Und der ist sogar ausserhalb des eigentlich möglichen bereichs (0 - 1023).
durch senden eines beliebigen zeichens per RS232 spuckt der AVR die werte über die selbige schnittstelle aus, das hab ich mit dummy-werten ausprobiert, daran kann es also nicht hängen.
Ich lass den ADC im Free Running Modus mit Interrupt laufen, der Interrupt wird ordnungsgemäß aufgerufen.
Das komische ist allerdings, egal ob ich den ADC überhaupt einschalte oder nicht, in ADCH/ADCL steht immer 1284.
Hier ist der Code:
ich kann mir da keinen reim mehr drauf machen, hab auch schon mehrere Mega32 durchprobiert, alle liefern 1284.[/code]Code:.include "m32def.inc" ; Defines .def temp = r16 .def adc_low = r17 .def adc_high = r18 .def adc_buffer = r19 ;ZL = r30 ;ZH = r31 ; Interrupt Vektor Tabelle .org 0x000 rjmp reset nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop reti nop rjmp USART_rx nop reti nop rjmp USART_tx nop rjmp ADC_ready nop reti nop reti nop reti nop reti nop reset: ; Stack initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ; USART initialisieren ; 9600 Baud ldi temp, 0 out UBRRH, temp ldi temp, 71 out UBRRL, temp ; 8 bit ldi temp, (1<<URSEL)|(3<<UCSZ0) out UCSRC, temp ; TX und RX Interrupts sbi UCSRB, TXCIE sbi UCSRB, RXCIE ; TX und RX sbi UCSRB, TXEN sbi UCSRB, RXEN ; I/O-Ports konfigurieren ldi temp, 0b11111111 out DDRC, temp ldi temp, 0b00000000 out PORTC, temp ; ADC initialisieren ldi temp, (1<<MUX2) | (1<<MUX1) | (1<<MUX0) out ADMUX, temp ldi temp, (1<<ADEN) | (1<<ADATE) | (1<<ADIE)| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) out ADCSRA, temp ; Interrupts aktivieren sei sbi ADCSRA, ADSC ; Endlosschleife schleife: rjmp schleife ; ADC Messung fertig ADC_ready: push temp in temp, SREG push temp ldi adc_low, ADCL ldi adc_high, ADCH pop temp out SREG, temp pop temp reti ; Byte empfangen USART_rx: push temp in temp, SREG push temp ldi ZL, LOW(_goon1) ldi ZH, HIGH(_goon1) in temp, UDR mov temp, adc_low mov adc_buffer, adc_high out UDR, temp pop temp out SREG, temp pop temp reti _goon1: push temp in temp, SREG push temp ldi ZL, LOW(_goon2) ldi ZH, HIGH(_goon2) out UDR, adc_buffer pop temp out SREG, temp pop temp reti _goon2: reti ; Byte gesendet USART_tx: ijmp







Zitieren

Lesezeichen