PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC + Atmega8 + Assembler



higret
08.06.2005, 21:23
Hi

ich versuch grad den ADC vom Atmega8 zu aktivieren, aber anscheinend funktioniert es nicht.

AVcc und ARef hab ich mit Vcc verbunden und AGnd mit GND

Ich häng mal das Programm an, vielleicht findet ihr den Fehler ja



.include "m8def.inc"

.equ cputakt = 1000000 ;arbeitet im Bereich von (1 - 20 MHz)
.set count_ms = cputakt / (4000 + 1) ;ergibt in wait_ms ca.1ms vom Aufruf aus

.MACRO wait_ms
ldi temp, @0 ;Lade temp mit Zähler (in ms)
rcall delay_ms ;Aufruf Verzögerungschleife
.ENDMACRO

.equ LED_PORT = PORTD
.equ LED_DIR = DDRD
.def LED_REG = r16

.def temp = r20
.def temp2 = r21
.def temp3 = r22


.cseg
.org 0x0000

rjmp reset ; Interruptvektoren überspringen
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti
reti
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
rjmp adc ; ADC Conversion Complete Interrupt Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler

reset:
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp

ldi temp, 0xFF ; 0xFF in Reg. temp laden
out LED_DIR, temp ; alle ports als ausgänge

ldi LED_REG, 0b00000000 ; alle Pins ein
out LED_PORT, LED_REG

wait_ms(255)

ldi LED_REG, 0b11111111 ; alle Pins aus
out LED_PORT, LED_REG

wait_ms(255)

rjmp initadc

mainloop:
rjmp mainloop

initadc:
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2

cbi ADMUX, REFS0
cbi ADMUX, REFS1

;sbi ADMUX, ADLAR

sbi ADCSR, ADPS0
sbi ADCSR, ADPS1
cbi ADCSR, ADPS2

sbi ADCSR, ADEN
sbi ADCSR, ADFR
sbi ADCSR, ADIE
cbi ADCSR, ADIF

sei

sbi ADCSR, ADSC ; start conversion

rjmp mainloop

adc:
in temp, ADCL ; ADC-Wert einlesen
in temp2, ADCH ; 10 Bit

ror temp2 ; xxxxxxxN c=N
ror temp ; Nnnnnnnn c=n
ror temp2 ; xxxxxxxx c=N
ror temp ; NNnnnnnn c=n

out LED_PORT, temp

reti

; ************************************************** ******************
; delay_ms verzögert um x ms
; Parameter : Zeit in ms (1-255) in temp, in Z-Register keine Änderung
; Rückgabe : keine
; ************************************************** ******************

delay_ms:
push ZL ;Z auf den Stack retten
push ZH
delay_ms_1:
ldi ZH, HIGH(count_ms) ;Lade höherwertiges Byte nach Z
ldi ZL, LOW(count_ms) ;Lade niederwertiges Byte nach Z
delay_ms_2:
sbiw ZL, 1 ;subtrahiere 1 von Z
brne delay_ms_2 ;solange bis Z = 0
dec temp ;temp um 1 herunterzählen
brne delay_ms_1 ;solange bis temp = 0
pop ZH ;Z vom Stack zurückholen
pop ZL
ret



Vielen Dank schonmal

bertl100
08.06.2005, 22:18
In Bascom reichen 5 Zeilen.
In C bzw. Assembler kenn ich mich leider nicht aus.

MFG

Vader

Florian
08.06.2005, 22:33
Hallo bertl100!
Deine Antwort war ja jetzt nicht unbedingt die Aussagekräftigste, oder!? ;o)
Wir wollten hier nicht wissen, wie man es auch machen kann, sondern wie man es in ASM macht!

Hallo higret!
Schau am Besten mal hier, das stammt noch aus Zeiten, wo ich mit dem ADC gekämpft habe! ;o)
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=2179&highlight=adc

izaseba
08.06.2005, 23:51
Hallo Higret,
Ich weiß zwar nicht welchen assembler Du verwendest,
avra schmeißt mir aber errors bei Deinem Macro mit dem delay...
nachdem ich den Macro und seine Aufrufe auskommentiert habe, und den REFS0 bit
gesetzt habe (ich habe leider nur ein Kondensator an AREF gegen masse)
Funktioniert Dein Program prima.
Also Fehler mit dem Macro?
Schreib mal welchen Assembler Du verwendest, dann kann ich das auch eventuell testen

Gruß Sebastian

higret
09.06.2005, 06:19
Hi

ich benutze gavrasm, bei dem funktioniert das makro

EDIT: halb noch mal nen bisschen rumprobiert
und es sieht so aus als wenn der wert in ADCH (les nur ein byte aus ADLAR ist gesetzt)
von 0x00 bis 0xFF steigt

EDIT2: man sollte auch die richtigen Pins anlöten, hab von der falschen seite angefangen dachte PC5 ist PC0, das passiert wenn man lötet wenn man müde ist *g*

izaseba
12.06.2005, 02:51
Hallo higret,
Soll ich jetzt verstehen, daß es doch klappt?
Übrigens wenn Du auf einmal ADLAR benutzt, gehe ich auch davon aus, daß Du das rechtsrotieren weggelassen hast, oder?
Sonst bekommst Du wirklich nur Salat raus.

Gruß Sebastian

higret
12.06.2005, 11:35
Hi

ja es funktioniert jetzt alles. man sollte auch ne spannung an PC0 anstatt an PC5 anlegen, wenn man von PC0 lesen will *g*

und ja ich rotiere jetzt nicht mehr

mfg higret

skyrider
12.06.2005, 13:17
@izaseba

Hi,
versuch mal den Aufruf des Macros mit deinen Compiler ohne die Klammern, also :

delay_ms 255

statt

delay_ms (255)

sollte dies klappen, werde ich das Posting anpassen.

Man kann aber auch die Routine mit folgenden Zeilen

ldi temp, 255
rcall delay_ms

aus dem Hauptprogramm direkt aufrufen.

Viele Grüße
Skyrider