Gast
#141733
Hallo, ich benutze der Atmel 90S8535 bzw. ATMega8535 und moechte einen Wert mit Hilfe des internen ADC (Pin A0) einen analog Wert einlesen und das Ergebnis auf die Ports B und D ausgeben. Hierzu habe ich folgende Programm verfasst: .INCLUDE "8535def.inc" .CSEG .ORG 0x000 rjmp RESET ; Reset Handler .ORG 0x050 RESET: ; ========================== INIT STACK POINTER ldi r16, high(RAMEND) out SPH,r16 ldi r16, low(RAMEND) out SPL,r16 ; ========================== SETUP PORTS ldi r16,0x00 out DDRA,r16 ; Port A Tri-State Input ldi r16,0xFF out DDRB,r16 ; Port B Output out DDRD,r16 ; Port D Output out DDRC,r16 ; Port C Output ldi r16,0x00 out PORTA, r16 ldi r16,0xff out PORTB, r16 out PORTC, r16 out PORTD, r16 ; ========================== SETUP ADC ldi r16,0 out ADMUX,r16 out adcsr,r16 nop READ_ADC1: sbi adcsr,adif ldi r16, 0b11000111 ; ADC enabled, Start Single conversion out ADCSR, r16 ; Prescaler 1/128 READ_ADC2: IN r16,PORTC ; Prozessor-Takt auf PORTC ausgeben COM r16 ; (als Debug Signal) out PORTC,r16 sbic ADCSR,ADSC ; wait until conversion finished rjmp READ_ADC2 clr r17 ; Warteschleife um Prozessor-Takt read_adc3: ; auf Port C zu unterbrechen nop ; (Debug info) nop inc r17 tst r17 brne read_adc3 IN r17,ADCH ; read data to r17:r18 IN r18,ADCL out PORTD,r17 ; Binärdaten auf Port D/B ausgeben out PORTB,r18 rjmp READ_ADC1 Meiner Meinung nach sollte durchgängig der ADC0-Eingang gesampelt und auf die Port B/D ausgegeben werden. Defakto wird das Signal auf ADC0 nur einmalig nach einem RESET gesampelt. Spätere Veränderungen werden ignoriert!! Das Programm läuft anscheinend korrekt durch alle Schleifen (Takt an Port C zeigt die Unterbrechung durch die NOP-Schleife) Ich hoffe Ihr könnt mir helfen, Marcus