Gerko
31.07.2006, 17:45
Hallo Leute!
In meinem neuen Projekt versuche ich nun den analogen Eingang eines ATmega16 zu verwenden. Die Aufgabe die ich mir gestellt habe ist eigentlich recht simpel, ich will mit Hilfe 2er LDRs 2 Spannungen auf den Analog Eingang legen, anschließend in einen Digitalen Wert umwandeln, vergleichen welche größer, kleiner, oder ob sie gleich sind, und anschließend mit Hilfe 3er LEDs anzuzeigen auf welchem die Größere Spannung anliegt.
Ich weiß nicht ob mein Fehler in der Hardware oder in der Software liegt. Angenommen die Hardware passt, wo liegt mein Fehler im Programm?
Ich bekomme immer heraus das beide Spannungen gleich sind...
.include "m16def.inc"
.def temp = r16
.def Ergebnis1 = r17
.def Ergebnis2 = r18
.CSEG
.org 0x000
jmp Initialisierung ; Reset Interupt Handler
jmp Kein_Interrupt ;EXT_INT0 ; INT 0 Interupt Handler
jmp Kein_Interrupt ;EXT_INT1 ; INT 1 Interupt Handler
jmp Kein_Interrupt ;TIM2_COMP ; Timer 2 Compare Interupt Handler
jmp Kein_Interrupt ;TIM2_OVF ; Timer 2 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM1_CAPT ; Timer 1 Capture Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPA ; Timer 1 Compare A Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPB ; Timer 1 Compare B Interupt Handler
jmp Kein_Interrupt ;TIM1_OVF ; Timer 1 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM0_OVF ; Timer 0 Overflow Interupt Handler
jmp Kein_Interrupt ;SPI_STC ; SPI Transfer Complete Interupt Handler
jmp Kein_Interrupt ;USART_RXC ; USART RX Complete Interupt Handler
jmp Kein_Interrupt ;USART_DRE ; USART UDR empty Interupt Handler
jmp Kein_Interrupt ;USART_TXC ; USART TX Complete Interupt Handler
jmp ADCfertig ; ADC Conversion Complete Interupt Handler
jmp Kein_Interrupt ;EE_RDY ; EEPROM Ready Interupt Handler
jmp Kein_Interrupt ;ANA_COMP ; Analog Comperator Interupt Handler
jmp Kein_Interrupt ;TWSI ; TWI Interupt Handler
jmp Kein_Interrupt ;EXT_INT2 ; INT 2 Interupt Handler
jmp Kein_Interrupt ;TIM0_COMP ; Timer 0 Compare Interupt Handler
jmp Kein_Interrupt ;SPM_RDY ; Store Program Memory Ready Interupt Handler
Kein_Interrupt:
reti
Initialisierung:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
clr temp
out DDRA, temp ; Eingang
ser temp
out DDRD, temp ; Ausgang
;Interrupts aktivieren
sei ; Generelle Interruptfreigabe
Main:
ldi temp, (3<<REFS0) | (1<<ADLAR) ; Interne 2,56V Quelle ; Linksbündig in Register geschrieben (ADLAR=1) ; ADC Eingang = ADC0 (MUX4-0...00000)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (5<<ADPS0)
out ADCSRA, temp
call Warten
mov Ergebnis1, temp
ldi temp, (3<<REFS0) | (1<<ADLAR) | (1<<MUX0) ; Interne 2,56V Quelle ; Linksbündig in Register geschrieben (ADLAR=1) ; ADC Eingang = ADC1 (MUX4-0...00001)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (5<<ADPS0)
out ADCSRA, temp
call warten
mov Ergebnis2, temp
cbi PortD, 6
cbi PortD, 1
cbi PortD, 0
cp Ergebnis1, Ergebnis2
brlo PC+6
breq PC+3
sbi PortD, 6
jmp Main
sbi PortD, 1
jmp Main
sbi PortD, 0
jmp Main
Warten:
brie PC+2
reti
jmp Warten
ADCfertig:
ldi temp, ADCH
ret
Die Beschaltung sieht folgendermaßen aus:
LEDs auf PortD, 6, 1, 0
5V auf AVCC, VCC, AREF
Kann mir dabei irgend jemand weiterhelfen?
mfg Gerko
In meinem neuen Projekt versuche ich nun den analogen Eingang eines ATmega16 zu verwenden. Die Aufgabe die ich mir gestellt habe ist eigentlich recht simpel, ich will mit Hilfe 2er LDRs 2 Spannungen auf den Analog Eingang legen, anschließend in einen Digitalen Wert umwandeln, vergleichen welche größer, kleiner, oder ob sie gleich sind, und anschließend mit Hilfe 3er LEDs anzuzeigen auf welchem die Größere Spannung anliegt.
Ich weiß nicht ob mein Fehler in der Hardware oder in der Software liegt. Angenommen die Hardware passt, wo liegt mein Fehler im Programm?
Ich bekomme immer heraus das beide Spannungen gleich sind...
.include "m16def.inc"
.def temp = r16
.def Ergebnis1 = r17
.def Ergebnis2 = r18
.CSEG
.org 0x000
jmp Initialisierung ; Reset Interupt Handler
jmp Kein_Interrupt ;EXT_INT0 ; INT 0 Interupt Handler
jmp Kein_Interrupt ;EXT_INT1 ; INT 1 Interupt Handler
jmp Kein_Interrupt ;TIM2_COMP ; Timer 2 Compare Interupt Handler
jmp Kein_Interrupt ;TIM2_OVF ; Timer 2 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM1_CAPT ; Timer 1 Capture Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPA ; Timer 1 Compare A Interupt Handler
jmp Kein_Interrupt ;TIM1_COMPB ; Timer 1 Compare B Interupt Handler
jmp Kein_Interrupt ;TIM1_OVF ; Timer 1 Overflow Interupt Handler
jmp Kein_Interrupt ;TIM0_OVF ; Timer 0 Overflow Interupt Handler
jmp Kein_Interrupt ;SPI_STC ; SPI Transfer Complete Interupt Handler
jmp Kein_Interrupt ;USART_RXC ; USART RX Complete Interupt Handler
jmp Kein_Interrupt ;USART_DRE ; USART UDR empty Interupt Handler
jmp Kein_Interrupt ;USART_TXC ; USART TX Complete Interupt Handler
jmp ADCfertig ; ADC Conversion Complete Interupt Handler
jmp Kein_Interrupt ;EE_RDY ; EEPROM Ready Interupt Handler
jmp Kein_Interrupt ;ANA_COMP ; Analog Comperator Interupt Handler
jmp Kein_Interrupt ;TWSI ; TWI Interupt Handler
jmp Kein_Interrupt ;EXT_INT2 ; INT 2 Interupt Handler
jmp Kein_Interrupt ;TIM0_COMP ; Timer 0 Compare Interupt Handler
jmp Kein_Interrupt ;SPM_RDY ; Store Program Memory Ready Interupt Handler
Kein_Interrupt:
reti
Initialisierung:
;Stackpointer
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;Aus/Eingänge
clr temp
out DDRA, temp ; Eingang
ser temp
out DDRD, temp ; Ausgang
;Interrupts aktivieren
sei ; Generelle Interruptfreigabe
Main:
ldi temp, (3<<REFS0) | (1<<ADLAR) ; Interne 2,56V Quelle ; Linksbündig in Register geschrieben (ADLAR=1) ; ADC Eingang = ADC0 (MUX4-0...00000)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (5<<ADPS0)
out ADCSRA, temp
call Warten
mov Ergebnis1, temp
ldi temp, (3<<REFS0) | (1<<ADLAR) | (1<<MUX0) ; Interne 2,56V Quelle ; Linksbündig in Register geschrieben (ADLAR=1) ; ADC Eingang = ADC1 (MUX4-0...00001)
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (5<<ADPS0)
out ADCSRA, temp
call warten
mov Ergebnis2, temp
cbi PortD, 6
cbi PortD, 1
cbi PortD, 0
cp Ergebnis1, Ergebnis2
brlo PC+6
breq PC+3
sbi PortD, 6
jmp Main
sbi PortD, 1
jmp Main
sbi PortD, 0
jmp Main
Warten:
brie PC+2
reti
jmp Warten
ADCfertig:
ldi temp, ADCH
ret
Die Beschaltung sieht folgendermaßen aus:
LEDs auf PortD, 6, 1, 0
5V auf AVCC, VCC, AREF
Kann mir dabei irgend jemand weiterhelfen?
mfg Gerko