PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Analogeingänge beim AT90S4433



Florian
16.02.2004, 13:06
Hi!
Ich habe da mal ne kleine Frage!
Ich möchte jetzt endlich mal lernen, wie man die Analogeingänge beim AT90S4433 benutzt!
Ich progge in Assembler.
Wenn man einfachheitshalber mal einen Poti als Spannungsteiler vor den Eingang ADC0 (PC0) setzt und an die Ausgänge z.B. PD0 und PD1 jeweils eine LED setzt.
Wie mache ich das dann, dass ich den Wert vom ADC in eine Variable packe und die dann mit einem Wert vergleiche, sodass sowas wie eine Schwelle entsteht.
Wenn der ADC z.B. über 4V misst, dann soll LED1 an und LED2 aus sein, während unter 4V die LED1 aus sein soll und die LED2 an sein soll!?
Kann mir jemand einen Code schreiben, oder auch eine Seite zeigen, wo das gezeigt wird?
Mir würde auch schon reichen, dass ich weiß, wie man den Wert vom ADC in eine Variable packt!?

Kann mir jemand helfen?
Ich prügel mich schon lange mit dem Probelm!
Ich habe schon viel gelesen, aber nichts verstanden!

Danke!

16.02.2004, 13:25
Mich würde das mal beim Mega16 in Basic mit BasCom interessieren.

hijacker
16.02.2004, 18:16
Hallo,

habe noch zufällig irgendwelchen ADC-Code für den 90S4433 gefunden, den ich mal zum Test geschrieben habe.

Es hat definitiv funktioniert, allerdings wurde der Code danach noch etwas modifiziert. Ich kann also keine Funktionsgarantie geben.
Allerdings ist das ganze nicht wirklich schwer. Das meiste findet in der ISR statt (Ergebnis in r18:r17), allerdings habe ich die Displayausgabe auskommentiert.

Das sollte Dir einen groben Überblick verschaffen. Das Lesen des Datenblattes ist natürlich immer Pflicht.




.include "4433def.inc"


.CSEG
.org 0x0000 ; code segment start

; Interrupt vectors
rjmp RESET ; 0x00 external reset
rjmp NO_INTERRUPT ; 0x01 external int0
rjmp NO_INTERRUPT ; 0x02 external int1
rjmp NO_INTERRUPT ; 0x03 timer1 capture event
rjmp NO_INTERRUPT ; 0x04 timer1 compare match
rjmp NO_INTERRUPT ; 0x05 timer1 overflow
rjmp NO_INTERRUPT ; 0x06 timer0 overflow
rjmp NO_INTERRUPT ; 0x07 SPI serial transfer complete
rjmp NO_INTERRUPT ; 0x08 UART, Rx complete
rjmp NO_INTERRUPT ; 0x09 UART data register empty
rjmp NO_INTERRUPT ; 0x0a UART, Tx complete
rjmp ADC_INTERRUPT ; 0x0b ADC conversion complete
rjmp NO_INTERRUPT ; 0x0c EEPROM ready
rjmp NO_INTERRUPT ; 0x0d Analog comparator


;--------------------------------------------------------------------
; ISRs
;--------------------------------------------------------------------

RESET:
rjmp main


ADC_INTERRUPT:
in r20, SREG
push r16
push r17
push r18

in r17, ADCL
in r18, ADCH

; skip 2 LSB
; asr r18
; ror r17
; asr r18
; ror r17

; display output
; mov r16, r18
; rcall lcd_printdec ; print high byte
; mov r16, r17
; rcall lcd_printdec ; print low byte
; ldi r16, ' '
; rcall lcd_data

; start next conversion
sbi ADCSR, 6

pop r18
pop r17
pop r16
out SREG, r20
reti


NO_INTERRUPT:
reti


;--------------------------------------------------------------------
; MAIN
;--------------------------------------------------------------------
main:

ldi r16, low(RAMEND) ; initialise stack pointer
out SPL, r16

sei ; global interrupt enable


; analog input 0
ldi r16, 0x00
out ADMUX, r16

; enable, start dummy conversion, no free run, interrupt, factor 128
ldi r16, 0b11011111
out ADCSR, r16

loop:
rjmp loop



Jens