Hallo,
Ich versuche seit längerem den AD- Wandler des atmega 8 zum laufen zu
kriegen. ... leider bis heute ohne Erfolg. :(
Mein Wunsch ist in Assembler eine Spannung auszulesen und entsprechend
(Schwellwert) zwei LEDs anschalten/ausschalten.
Da es immer nicht klappt habe ich versucht den Wert einfach an einen
Port ausgeben zu lassen. So wollte ich sehen ob der AD- Wandler was
macht. Dazu habe ich einfach 8 LEDs angeschlossen.... naja sie leuchten
alle und das dauerhaft. Egal welche spannung ich einstelle. Daraus
folgere ich, dass ich etwas am AD-Wandler falsch gemacht habe.
Hier mein Code:
.include "avr.h"
begin: rjmp main
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
rjmp onADC
reti
reti
reti
reti
main: ldi r16, lo8 (RAMEND)
out SPL, r16
ldi r16, hi8 (RAMEND)
out SPH, r16
sei
sbi DDRD,0
sbi DDRD,1
sbi DDRD,2
sbi DDRD,3
sbi DDRD,4
sbi DDRD,5
sbi DDRD,6
sbi DDRD,7
ldi r20,0b00000000
out PORTD,r20
ldi r16,0
out ADMUX,r16
ldi r25,0b11011101
out ADCSRA,r25
loop:
rjmp loop
onADC: in r26,ADCL
in r27,ADCH
asr r27
ror r26
asr r27
ror r26
mov r25,r26
out PORTD,r25
sbi ADCSRA,6
reti
............................................
Ich hoffe ihr könnt meinen Fehler finden oder mir eine vielleicht
einfachere Möglichkeit zeigen.
Vielen lieben Dank
und liebe Grüße
BenBu
Ich hab jetz nicht nachgeschaut ob diese Befehlssequenz
BenBu schrieb:> ldi r25,0b11011101> out ADCSRA,r25
den ADC Interrupt enabled, und ob der Interrupt Vektor
stimmt, aber den Globalen Interrupt Enable (sei())
müsstest du sicherlich setzen um jemals in die ISR
zu kommen.
BenBu schrieb:> ldi r25,0b11011101> out ADCSRA,r25
Warum nicht lieber so? Dann weißt du (und die Leute, die dir helfen
sollen) auch am nächsten Tag noch, was die einzelnen Bits bedeuten:
Erst mal danke für eure Hilfe.
Leider funktioniert das alles noch nicht.
Ich habe jetzt mit einigem Probieren rausbekommen dass der Low Teil des
AD- Signals immer 11111111 ist .... warum auch immer. ... ich denke da
ist irgendwo das Problem. ich kann es nur nicht finden. Vielleicht kennt
ja jemand von euch so einen Fall.
.include "avr.h"
begin: rjmp main
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
main: ldi r16, lo8 (RAMEND)
out SPL, r16
ldi r16, hi8 (RAMEND)
out SPH, r16
sbi DDRD,0
sbi DDRD,1
sbi DDRD,2
sbi DDRD,3
sbi DDRD,4
sbi DDRD,5
sbi DDRD,6
sbi DDRD,7
ldi r26,0b00000000
ldi r27,0b00000000
ldi r20,0b00000000
out PORTD,r20
ldi r16,0
out ADMUX,r16
ldi r25,0b11011101
out ADCSRA,r25
loop: sbi ADCSRA,ADSC
ldi r25,0b00000000
out PORTD,r25
warte: sbic ADCSRA,ADSC
rjmp warte
in r26,ADCL
in r27,ADCH
mov r25,r26
out PORTD,r25
ldi r19,200
warteloop1: ldi r18,200
warteloop: dec r18
brne warteloop
dec r19
brne warteloop1
rjmp loop
> also an AREF sind jetzt 5 Volt und PIN C 0 ist durch> ein Poti einstellbar
Sind Sie da sicher? Also bei mir läuft Ihr Programm.
(Ich hoffe mal, dass das Ganze auch wirklich für einen ATmega8
assembliert wird)
ja also die 5 Volt sind drann (bestellte experimentier und programmier-
Platine) und auf dem Schaltplan sind da 5 V eingezeichnet. ...
Vielleicht tausche ich mal den atmega 8 durch einen neuen.
Also ich habe jetzt den Atmega getauscht. Leider ohne Erfolg.
Ich habe ja die LEDs als ausgang geschaltet. Egal wie ich das Poti
verstelle, sie bleiben immer alle an.
... Aber wenn das Programm funktionsfähig ist frage ich mich was ich
falsch mache...
BenBu schrieb:> begin: rjmp main> reti> reti> reti> reti> reti> reti> reti> reti> reti
Gewöhn dir das am besten gleich wieder ab, denn das haut so nicht hin.
Lies die Vektortabelle im Datenblatt, Seite 47:
The most typical and general program setup for the Reset and Interrupt
Vector Addresses in
ATmega8 is:
1
addressLabelsCode Comments
2
$000 rjmp RESET ; Reset Handler
3
$001 rjmp EXT_INT0 ; IRQ0 Handler
4
$002 rjmp EXT_INT1 ; IRQ1 Handler
5
$003 rjmp TIM2_COMP ; Timer2 Compare Handler
6
$004 rjmp TIM2_OVF ; Timer2 Overflow Handler
7
$005 rjmp TIM1_CAPT ; Timer1 Capture Handler
8
$006 rjmp TIM1_COMPA ; Timer1 CompareA Handler
9
$007 rjmp TIM1_COMPB ; Timer1 CompareB Handler
10
$008 rjmp TIM1_OVF ; Timer1 Overflow Handler
11
$009 rjmp TIM0_OVF ; Timer0 Overflow Handler
12
$00a rjmp SPI_STC ; SPI Transfer Complete Handler
13
$00b rjmp USART_RXC ; USART RX Complete Handler
14
$00c rjmp USART_UDRE ; UDR Empty Handler
15
$00d rjmp USART_TXC ; USART TX Complete Handler
16
$00e rjmp ADC ; ADC Conversion Complete Handler
17
$00f rjmp EE_RDY ; EEPROM Ready Handler
18
$010 rjmp ANA_COMP ; Analog Comparator Handler
19
$011 rjmp TWSI ; Two-wire Serial Interface Handler
20
$012 rjmp SPM_RDY ; Store Program Memory Ready Handler
21
;
22
$013 RESET: ldi r16,high(RAMEND); Main program start
ein rjmp <Label> hat nun mal eine andere Länge als ein 'reti' und
deswegen zeigen deine Vektoren, wenn du sie benutzt, einfach nur in die
Botanik.
Matthias S. schrieb:> ein rjmp <Label> hat nun mal eine andere Länge als ein 'reti'
Nööö, sind beide gleich lang. Ein JMP ist aber länger.
Trotzdem ist eine unkommentierte Sprungtabelle großer Mist und eine gute
Fehlerquelle.
MfG
Matthias S. schrieb:> ein rjmp <Label> hat nun mal eine andere Länge als ein 'reti' und> deswegen zeigen deine Vektoren, wenn du sie benutzt, einfach nur in die> Botanik.
Oh, ich sehe gerade, das es beim Mega 8 zufällig doch passt, weil er nur
rjmps nimmt. Bei anderen klappt das aber nicht so.
DANKE... AREF war nicht 5 Volt sondern 0... Dann ist auvch der Fehler
klar. Ich danke euch allen und werde all eure Ratschläge jetzt noch mal
in ruhe durchsehen und verinnerlichen
DNAKE noch mal.