-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: ADC Umwandlung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2006
    Beiträge
    6

    ADC Umwandlung

    Anzeige

    hallo,

    ich will mit dem atmega8 2 analoge signale kontinuierlich umwandeln und
    das ergebnis im sram für weitere verarbeitung zur verfügung stellen.
    mache sowas zum ersten mal und scheitere schon an der initialisierung.
    mit einem eingang ist es klar.

    mit ADPS vorteiler einstellen
    mit ADEN generell einschalten
    in ADMUX kanal wählen
    mit ADFR free run wählen
    mit ADSC umwandlung starten

    aber wie soll ich das machen wenn ich zwei eingänge kontinuierlich
    abfragen will?

    gruß jens

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Beide Eingänge gleichzeitig abfragen ist nicht möglich.
    Du musst den ersten Eingang einlesen, den Multiplexer umschalten und dann den zweiten Wert einlesen.

    Die Initialisierung ist ja schon so weit ok.
    In Deiner ADC-Einlese-Funktion musst Du dann
    - Auf ADIF warten
    - Ergebnis aus ADCL/ADCH in eine Variable schreiben
    - Im ADMUX-Register den Kanal wechseln
    - Wieder auf ADIF warten
    - Ergebnis in eine zweite Variable schreiben
    - Wieder auf den Ursprungs-Kanal schalten.

    Gruß,
    askazo

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    nimm den interrupt und schalte da immer um.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.07.2005
    Ort
    Neubeckum
    Alter
    37
    Beiträge
    110
    Benötigst Du wirklich sehr kontinuierliche Signale? Sonst mach die einen Interrupt der jede 1 Sekunde aufgerufen wird und lese in der einen Sekunden den ersten Kanal und in der zweiten Sekunde den 2 . Kanal und so weiter... Dann benutzt Du in diesen Interrupt jeweils eine Single Conversion...
    - Phantasie ist wichtiger als Wissen - - www.uni-soest.de -

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2006
    Beiträge
    6
    letzteres hört sich auch interessant an. ein abfrage jede sekunde sollte eigentlich reichen. ich hatte allerdings gehofft ohne interrupt auszukommen. kann mir da jemand mal ein beispiel tippen, wie so ein interrupt aussehen könnte, der jede sekunde aufgerufen wird? hab das noch nicht so geschnallt mit den interrupts.

    danke
    gruß jens

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.07.2005
    Ort
    Neubeckum
    Alter
    37
    Beiträge
    110
    Du stellst den Prescaler auf einen bestimmten Wert. Beispiel: 8MHz/256 = 31,25kHz --> Periodendauer= 32 mikrosec.

    1Sekunde / 32 Mikrosec = 31250

    Also musst Du ins Compareregister 31250 einstellen und den Prescaler auf 256.

    Weiß jetzt leider vom MEGA8 nicht die Register auswendig. Aber ich schau mal nach...
    - Phantasie ist wichtiger als Wissen - - www.uni-soest.de -

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2006
    Beiträge
    6
    habe es jetzt einfach mit einer schleife versucht zu lösen.
    kann man das so machen? geht das so einfach die werte danach ins sram zu speichern?

    Code:
    ; Start, Power ON, Reset
    main:    ldi     r16, lo8(RAMEND)
             out     SPL, r16
             ldi     r16, hi8(RAMEND)
             out     SPH, r16
             
    ;Initialisierung ADC 					
    		ldi		r17, 0b10000...				;ADC enable, vorteiler
    		out		ADCSRA, r17
    			
    		        
    ;---------------------------------------------------------------------------
    mainloop: wdr
              rjmp loop
            
              rjmp mainloop
    ;---------------------------------------------------------------------------
    ;.equ		wert1L, 0x0060
    ;.equ		wert1H, 0x0061
    ;.equ		wert2L, 0x0063
    ;.equ		wert2H, 0x0064
    
    ;ersten eingang umwandeln und sichern
    loop: 		ldi		r16, 0 					;auswahl chanel 0
    			out		ADMUX, r16
    			sbi		ADCSRA, ADSC 			;wandlung starten
    warte1:		sbis 	ADCSRA, ADIF			;abfrage ob umwandlung schon beendet ist ADIF=1 
    			rjmp 	warte1
    			in		r18, ADCL				;die unteren 8bits in r18 speichern
    			in		r19, ADCH 				;die oberen 2bits in r19 speichern
    			sts		wert1L, r18				;wert in sram schreiben
    			sts		wert1H, r19
    			
    ;zweiten eingang umwandeln und sichern			
    			ldi		r16, 1					;auswahl chanel 1
    			out		ADMUX, r16
    			sbi		ADCSRA, ADSC 			;wandlung starten
    warte2:		sbis	ADCSRA, ADIF			;abfrage ob umwandlung schon beendet ist ADIF=1	
    			in		r20, ADCL				;die unteren 8bits in r20 speichern
    			in		r21, ADCH				;die oberen 2bits in r21 speichern
    			sts		wert2L, r20				;wert in sram schreiben
    			sts		wert2H, r21
    			ret

    gruß jens

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    16.07.2005
    Ort
    Neubeckum
    Alter
    37
    Beiträge
    110
    Sorry, ich programmiere nur in C, deshalb kann ich Dir jetzt so auf Anhieb nicht sagen ob das korrekt ist... Vielleicht hilft ja noch ein anderer...
    - Phantasie ist wichtiger als Wissen - - www.uni-soest.de -

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    simuliers mal in avr-studio. dann schaust ob die bits richtig gesetzt werden usw und dann rauf auf den uC damit und weiter gehts. ich kann ja auch nur c.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2006
    Beiträge
    6
    habe leider kein AVR studio zum simulieren, wo bekomme ich denn sowas her, dass ich simulieren kann?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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