-         

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

Thema: Probleme mit ADC , kann mir da jemand helfen ?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94

    Probleme mit ADC , kann mir da jemand helfen ?

    Anzeige

    Hi, ich hab mal was am ATmega8 ausprobiert und komm da im mom. nicht so richtig weiter. Den Code hab ich mit gepostet. Zur Funktion soviel: nachdem ein Wert überschritten worden ist, soll ein Portbit gesetzt werden. Es tut sich aber überhaupt nichts. Danke für alle tips und anregungen.

    Hier der code:


    .include "AVR.H"
    ;----------------------------------------------------------------------
    ; Reset and Interrupt vector ; VNr. Beschreibung
    rjmp main ; 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 onADC ; 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
    ;----------------------------------------------------------------------
    ; Start, Power ON, Reset
    main: ldi r16,lo8(RAMEND)
    out SPL,r16
    ldi r16,hi8(RAMEND)
    out SPH,r16
    ; Hier Init-Code eintragen.
    ;--------ADC Init-------------------------------
    ldi r16,0
    out ADMUX,r16 ; ADC kanal 0 = PortC.0
    ldi r16,0b11011101
    out ADCSRA,r16 ; ADC enable, Interrupt enable, run-mode
    ;--------PORT Init-------------------------------
    ldi r16,0b00000010
    out DDRC,r16 ; PORTC.1 als ausgang

    ;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
    mainloop: wdr
    rcall wait
    rcall wait
    mov r20,r25 ; ADC Wert holen


    cpi r20,0b00000010 ; falls ADC Wert höher als 2
    brge mainloop ; die led an

    sbi PORTC,1

    rjmp mainloop
    ;+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++

    onADC: cli ; Interrupts sperren
    in r25,ADCH ; ADC 8 Bit Daten holen
    sbi ADCSRA,6 ; nächste Wandlung starten
    sei ; Interrupts wieder zulassen
    reti


    wait: push r24
    ldi r24,0x13 ;hier delay einstellen
    w1: subi r24,0x01
    rcall wait20ms
    brcc w1
    pop r24
    ret


    wait20ms: ldi r16,255
    ldi r17,104
    w20ms: dec r16
    brne w20ms
    dec r17
    brne w20ms
    ret

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Muss man in Assembler nicht auch angeben um was für einen AVR es sich handelt?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94
    eigentlich schon, aber ich benutz das myAVR sisy studio. da ist die Anweisung für den mega8 bereits integriert.

  4. #4
    also soweit wie ich das sehe fehlt das <<< sei >>> vor der mainloop... dein interrupt wird einfach nicht ausgelöst

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wenn ich mich nicht irre, ist der "RETI" als Interrupt-Vector zu kurz, es sind immer 4 Byte vorgesehen. Da gehört immer noch ein "NOP" dazwischen.
    Das kannst du aber im Listing leicht kontrollieren.
    Wenn ich mich aber schon irre, dann bitte ich im Strafe
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    beim Mega8 reicht ein RETI, erst meim m168 der x8 Serie müssen es zwei Befehlsworte sein (NOP, RETI oder JMP Marke)

    Gruß

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.05.2004
    Ort
    Wilhelmshaven
    Alter
    38
    Beiträge
    324
    hast du das von Peter mal kontrolliert? bin auch der Meinung, dass da noch ein sei fehlt. Setz mal ein sei direkt hinter die Interrupttabelle in der Power On Instruktion.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94
    Hi, und erst mal danke für die antworten. Das sei hab ich jetzt gesetzt. Obwohl ich dachte, dass es in meiner onADC - Funktion ausreicht paasiert nun folgendes: Board einschalten, 1 - 2 sek. warten und dann vemerken, dass die LED angeht. Natürlich unabhängig von der Stellung des potentiometers. Allerdings bleibt die LED aus, wenn statt BRGE, BRLO an der verzweigung steht. kann mir da jetzt aber garnichts darunter vorstellen !

  9. #9
    und noch was ist mir aufgefallen... du musst unbedingt immer beide ADC-Werte (Low dann High) unmittelbar nacheinander auslesen sonst nimmt der ADC die Werte nicht als ausgelesen an... du hast doch SiSy... da ist Beispielcode für den ADC drin... und dann denke ich mal solltest du die LED auch ausschalten wenn der ADC-Wert wieder kleiner ist...

    also ich habe dein onADC mal mit der onADC-Vorlage aus SiSy ersetzt und da gehts.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94
    Alles, klar, klappt einwandfrei. Tausend Dank ! Im Atmel Handbuch steht jedoch, dass es ausreichend ist, ADCH auszulesen , falls eine 8-Bit Auflösung genau genug ist.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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