-         

Ergebnis 1 bis 8 von 8

Thema: ADC + Atmega8 + Assembler

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.06.2005
    Ort
    nähe Bremen
    Beiträge
    21

    ADC + Atmega8 + Assembler

    Anzeige

    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

    Code:
    .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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464
    In Bascom reichen 5 Zeilen.
    In C bzw. Assembler kenn ich mich leider nicht aus.

    MFG

    Vader

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    29
    Beiträge
    2.624
    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)
    http://www.roboternetz.de/phpBB2/zei...&highlight=adc

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.06.2005
    Ort
    nähe Bremen
    Beiträge
    21
    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*

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    02.06.2005
    Ort
    nähe Bremen
    Beiträge
    21
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    09.08.2004
    Ort
    Quickborn
    Beiträge
    24
    @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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •