moonwalker99
09.02.2006, 23:20
Hallo allerseits,
habe gerade ein einfaches Programm entworfen, das das Analogsignal (wird über poti auf Pin C 0 [Atmega8 ADC0] 0-5V) eingelesen. Es soll nach beendigung der ADC-Conversion also nach auslösen des Interrupts, über die Serielle Schnittstelle ausgegeben werden. Leider kommt nur Gullasch am Hyperterminal an. Denke ich habe irgendeinen Denkfehler drin, da das Gullasch sich beim Drehen des Potis verändert.
Achtung: Das ich ADLAR gesetzt habe war nur ein Versuch, dachte mal schauen was passiert wenn er die bits auf die andere seite schiebt, das resultat war: Andere ASCII Zeichen am Hyperterminal die sich beim Drehen des Potis verändern.
Hier der Code meines Programms:
.include "m8def.inc"
// aus dem UARTprogramm
.def temp = r16
.equ CLOCK = 3686400
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
// aus dem ADC-prog
.def ad_value = r17
.org 0x000
rjmp init ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
rjmp ad_vector;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
init:
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ;TX aktivieren
;ADC initailisieren
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
cbi ADMUX, MUX3
sbi ADMUX, ADLAR
cbi ADMUX, REFS0
cbi ADMUX, REFS1
;ADC interrupt anschalten
sbi ADCSR, ADIE
;Prescaler auf 16 setzen
cbi ADCSR,ADPS0
cbi ADCSR,ADPS1
cbi ADCSR,ADPS2
;AD Converter anschalten
sbi ADCSR,ADEN
;global interrupts aktivieren
sei
;erste Wandlung auslösen
sbi ADCSR, ADSC
;Hauptprogramm
main:
nop
nop
nop
rjmp main
ad_vector:
in temp,adch
sbi adcsr,adsc
sei
rjmp serout
ret
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
habe gerade ein einfaches Programm entworfen, das das Analogsignal (wird über poti auf Pin C 0 [Atmega8 ADC0] 0-5V) eingelesen. Es soll nach beendigung der ADC-Conversion also nach auslösen des Interrupts, über die Serielle Schnittstelle ausgegeben werden. Leider kommt nur Gullasch am Hyperterminal an. Denke ich habe irgendeinen Denkfehler drin, da das Gullasch sich beim Drehen des Potis verändert.
Achtung: Das ich ADLAR gesetzt habe war nur ein Versuch, dachte mal schauen was passiert wenn er die bits auf die andere seite schiebt, das resultat war: Andere ASCII Zeichen am Hyperterminal die sich beim Drehen des Potis verändern.
Hier der Code meines Programms:
.include "m8def.inc"
// aus dem UARTprogramm
.def temp = r16
.equ CLOCK = 3686400
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
// aus dem ADC-prog
.def ad_value = r17
.org 0x000
rjmp init ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
rjmp ad_vector;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
init:
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ;TX aktivieren
;ADC initailisieren
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
cbi ADMUX, MUX3
sbi ADMUX, ADLAR
cbi ADMUX, REFS0
cbi ADMUX, REFS1
;ADC interrupt anschalten
sbi ADCSR, ADIE
;Prescaler auf 16 setzen
cbi ADCSR,ADPS0
cbi ADCSR,ADPS1
cbi ADCSR,ADPS2
;AD Converter anschalten
sbi ADCSR,ADEN
;global interrupts aktivieren
sei
;erste Wandlung auslösen
sbi ADCSR, ADSC
;Hauptprogramm
main:
nop
nop
nop
rjmp main
ad_vector:
in temp,adch
sbi adcsr,adsc
sei
rjmp serout
ret
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm