Hallo Florian,
ich habe das Programm gerade simuliert.
Es waren noch zwei Fehler drin.
Erstens kann man das Z Register wohl nicht rotieren (also hab ich es mit zwei einzelnen gemacht).
Zweitens hab ich vergessen mit 'sei' die Interrupts global anzuschalten.![]()
Hier noch mal der Code, der so jetzt auch funktionieren sollte ...
Sollte funktionieren. Du musst natürlich noch eine Ausgabe dazu programmieren. Im einfachsten Fall wären das 8 Leds an einen Port und an den Port dann das Ergebnis ausgeben ...Code:.include "4433def.inc" .def temp = r16 .def ad_value = r17 .org 0x000 rjmp init ; Initialisierung / RESET reti ; IRQ0 reti ; IRQ1 reti ; Timer1 Capture reti ; Timer1 Compare reti ; Timer1 Overflow reti ; Timer0 Overflow reti ; SPI Complete reti ; UART Rx reti ; UART Data empty reti ; UART Tx rjmp adc_int ; ADC Conversion Complete reti ; EEPROM ready reti ; Analog Comparator ; ################################ ; Initialisierung ; ################################ init: ; ################################ ; Ports initialisieren (alle PINS INPUT - interne Pullups aktiviert) ; ################################ ldi temp, 0x00 out DDRB, temp ldi temp, 0xFF out PORTB, temp ldi temp, 0x00 out DDRC, temp ldi temp, 0xFF out PORTC, temp ldi temp, 0x00 out DDRD, temp ldi temp, 0xFF out PORTD, temp ; ################################ ; Stack initialisieren ; ################################ ldi temp, RAMEND out SP, temp ; ################################ ; ADC initialisieren ; ################################ ; Multiplexer setzen - PC0 ist analoger Eingang cbi ADMUX, MUX0 cbi ADMUX, MUX1 cbi ADMUX, MUX2 ; ADC Interrupt anschalten sbi ADCSR, ADIE ; Prescaler auf 16 setzen cbi ADCSR, ADPS0 cbi ADCSR, ADPS1 sbi ADCSR, ADPS2 ; AD Converter anschalten sbi ADCSR, ADEN ; global Interrupts aktivieren sei ; Erste Wandlung auslösen sbi ADCSR, ADSC ; ################################ ; Hauptprogramm ; ################################ main: ; Hier könnte nun der ad_value umgerechnet werden und über ; UART oder LCD ausgegeben werden rjmp main ; ################################ ; ADC Interrupt ; ################################ adc_int: ; gewandelte Werte einlesen in ad_value, ADCL in temp, ADCH ; zweimal nach rechts rotieren (um die beiden LSB ; in das Low Register zu kriegen) -> 8 bit Wandlung ror temp ror ad_value ror temp ror ad_value ; neue Wandlung starten sbi ADCSR, ADSC reti
Grüße
Flite







Zitieren

Lesezeichen