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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.