- 12V Akku mit 280 Ah bauen         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 40

Thema: Auswertung/Funktionsweise des A/D Wandlers

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    39
    Beiträge
    255
    Anzeige

    Praxistest und DIY Projekte
    Hallo Florian!

    Wie in der PM besprochen hab ich das ganze mal für den 4433 umgeschrieben.

    Auf Richtigkeit kann ich leider keine Garantie geben, da ich schon lang nix mehr in Assembler programmiert habe und ich es auch nicht getestet habe. Ich werd aber gleich mal das Programm im AVR Studio ausprobieren und schauen, ob es funktioniert oder nicht ...

    So, der Code:
    Code:
    .include "4433def.inc"
    .def temp = r16
    .def ad_value = r17
    
    .org 0x000
    rjmp init		; Initialisierung / RESET
    reti			; IRQ0
    reti			; IRQ1
    reti			; Timer1 Capture
    reti			; Timer1 Compare
    reti			; Timer1 Overflow
    reti			; Timer0 Overflow
    reti			; SPI Complete
    reti			; UART Rx
    reti			; UART Data empty
    reti			; UART Tx
    rjmp adc_int		; ADC Conversion Complete
    reti			; EEPROM ready
    reti			; Analog Comparator
    
    
    ; ################################
    ; Initialisierung
    ; ################################
    
    init:
    ; ################################
    ; Ports initialisieren (alle PINS INPUT - interne Pullups aktiviert)
    ; ################################
    
    ldi temp, 0x00
    out DDRB, temp
    
    ldi temp, 0xFF
    out PORTB, temp
    
    ldi temp, 0x00
    out DDRC, temp
    
    ldi temp, 0xFF
    out PORTC, temp
    
    ldi temp, 0x00
    out DDRD, temp
    
    ldi temp, 0xFF
    out PORTD, temp
    
    ; ################################
    ; Stack initialisieren
    ; ################################
    
    ldi temp, RAMEND
    out SP, temp
    
    ; ################################
    ; ADC initialisieren
    ; ################################
    
    ; Multiplexer setzen - PC0 ist analoger Eingang
    cbi ADMUX, MUX0
    cbi ADMUX, MUX1
    cbi ADMUX, MUX2
    
    ; ADC Interrupt anschalten
    sbi ADCSR, ADIE
    
    ; Prescaler auf 16 setzen
    cbi ADCSR, ADPS0
    cbi ADCSR, ADPS1
    sbi ADCSR, ADPS2
    
    ; AD Converter anschalten
    sbi ADCSR, ADEN
    
    ; Erste Wandlung auslösen
    sbi ADCSR, ADSC
    
    ; ################################
    ; Hauptprogramm
    ; ################################
    
    main:
    ; Hier könnte nun der ad_value umgerechnet werden und über
    ; UART oder LCD ausgegeben werden
    rjmp main
    
    
    ; ################################
    ; ADC Interrupt
    ; ################################
    
    adc_int:
    
    ; gewandelte Werte einlesen 
    in ZL, ADCL
    in ZH, ADCH
    
    ; zweimal nach rechts rotieren (um die beiden LSB 
    ; in das Low Register zu kriegen) -> 8 bit Wandlung
    ror Z
    ror Z
    
    ; 8 bit Wert in ad_value schreiben
    mov ad_value, ZL
    
    ; neue Wandlung starten
    sbi ADCSR, ADSC
    
    reti
    Viele Grüße
    Flite
    EDIT: Ach ja, wenn du irgendwleche Fragen hast: nur zu !!

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    35
    Beiträge
    2.624
    Hi Flite!
    Ich werde nachher noch das Programm ausprobieren, oder auch morgen oder so!
    Mal gucken obs funktioniert!
    Dann werd ich das progrmm mal durcharbeiten und dann fragen dazu stelklen!

    Danke nochmal!

  3. #23
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    39
    Beiträge
    255
    Hallo Florian,

    ich habe das Programm gerade simuliert.

    Es waren noch zwei Fehler drin.
    Erstens kann man das Z Register wohl nicht rotieren (also hab ich es mit zwei einzelnen gemacht).
    Zweitens hab ich vergessen mit 'sei' die Interrupts global anzuschalten.

    Hier noch mal der Code, der so jetzt auch funktionieren sollte ...

    Code:
    .include "4433def.inc"
    .def temp = r16
    .def ad_value = r17
    
    .org 0x000
    rjmp init		; Initialisierung / RESET
    reti			; IRQ0
    reti			; IRQ1
    reti			; Timer1 Capture
    reti			; Timer1 Compare
    reti			; Timer1 Overflow
    reti			; Timer0 Overflow
    reti			; SPI Complete
    reti			; UART Rx
    reti			; UART Data empty
    reti			; UART Tx
    rjmp adc_int	; ADC Conversion Complete
    reti			; EEPROM ready
    reti			; Analog Comparator
    
    
    ; ################################
    ; Initialisierung
    ; ################################
    
    init:
    ; ################################
    ; Ports initialisieren (alle PINS INPUT - interne Pullups aktiviert)
    ; ################################
    
    ldi temp, 0x00
    out DDRB, temp
    
    ldi temp, 0xFF
    out PORTB, temp
    
    ldi temp, 0x00
    out DDRC, temp
    
    ldi temp, 0xFF
    out PORTC, temp
    
    ldi temp, 0x00
    out DDRD, temp
    
    ldi temp, 0xFF
    out PORTD, temp
    
    ; ################################
    ; Stack initialisieren
    ; ################################
    
    ldi temp, RAMEND
    out SP, temp
    
    ; ################################
    ; ADC initialisieren
    ; ################################
    
    ; Multiplexer setzen - PC0 ist analoger Eingang
    cbi ADMUX, MUX0
    cbi ADMUX, MUX1
    cbi ADMUX, MUX2
    
    ; ADC Interrupt anschalten
    sbi ADCSR, ADIE
    
    ; Prescaler auf 16 setzen
    cbi ADCSR, ADPS0
    cbi ADCSR, ADPS1
    sbi ADCSR, ADPS2
    
    ; AD Converter anschalten
    sbi ADCSR, ADEN
    
    ; global Interrupts aktivieren
    sei
    
    ; Erste Wandlung auslösen
    sbi ADCSR, ADSC
    
    ; ################################
    ; Hauptprogramm
    ; ################################
    
    main:
    ; Hier könnte nun der ad_value umgerechnet werden und über
    ; UART oder LCD ausgegeben werden
    rjmp main
    
    
    ; ################################
    ; ADC Interrupt
    ; ################################
    
    adc_int:
    
    ; gewandelte Werte einlesen 
    in ad_value, ADCL
    in temp, ADCH
    
    ; zweimal nach rechts rotieren (um die beiden LSB 
    ; in das Low Register zu kriegen) -> 8 bit Wandlung
    ror temp
    ror ad_value
    ror temp
    ror ad_value
    
    ; neue Wandlung starten
    sbi ADCSR, ADSC
    
    reti
    Sollte funktionieren. Du musst natürlich noch eine Ausgabe dazu programmieren. Im einfachsten Fall wären das 8 Leds an einen Port und an den Port dann das Ergebnis ausgeben ...

    Grüße
    Flite

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    35
    Beiträge
    2.624
    Hi Flite!
    Danke, dass Du Dir so viel Mühe mit mir gibst! *merci beaucoup* *thanks* *Danke sehr*
    Ich werde erstaml irgendwann demnächst das Programm ausprobiern!
    Ich werde dazu dann die 8 LED's an den µC dranhängen!
    Ich habe mal was gehört, dass die erste Messung des ADC immer falsach ist, stimmt das?
    Wenn ich noch Fehler finde, oder Fragen habe, werde ich mich noch bei Dir melden!

  5. #25
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    35
    Beiträge
    2.624
    Hi Flite!
    Ich habe eine Frage!
    Irgendwie scheint mein AVR zu spinnen!
    Ich habe jetzt bei main: (Hauptprogramm) folgendes eingefügt:
    Code:
    out PORTD, ad_value
    Wenn ich nun das programm in den AVR lade, leuchtet keine der 8 LED's! Bis dahin erstmal alles super!
    Ich habe Stiftleisten als Ausgänge des AVR's auf meiner Platine.
    Wenn ich nun einen Finger an den PC0 halte, zeigt mir die LED-Anzeige 2-3 leuchtende LED's an! Also PD0-2!
    Kann das sein, oder ist mein AVR kaputt? Alles andere scheint aber noch zu funktionieren und es sind auch keine Lötbrücken auf der Platine!

    Danke für Deine (Eure) Hilfe!

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    39
    Beiträge
    255
    Hallo Florian,

    Also du musst natürlich zuerst in der Initialisierung den PORT B aus Ausgang stellen. Da jedoch ein paar LEDs leuchten geh ich mal davon aus, dass du das gemacht hast.

    Nun ja - mit einem Finger an den AVR langen ist eigentlich ja keine so tolle Lösung *g* Wenn du statisch ausgeladen bist kannst du dabei (zumindest theoretisch) den AVR zerschießen. Mir ist das allerding noch nie passiert.

    Aber das ein paar LEDs anfangen zu leuchten ist schon richtig ... Der AVR misst an deinem Finger eine Spannung und gibt diese aus ...

    Du musst den PC0 von ausßen beschalten. Zum test kannst du folgendes machen: du kann mit einem Kabel entweder GND auf den Pin halten (dann sollten alle LEDs aus sein) oder mal an VCC hängen. Dann sollten alle LEDs an sein.

    Wenns das nicht funktioniert müssen wir mal schauen ob wo anders noch ein Problem ist.

    Viele Grüße
    Flite

    PS: einmal hab ich doch einen AVR kaputt gekriegt - da ging auch der AD Wandler nicht mehr ...

  7. #27
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    35
    Beiträge
    2.624
    Hi Flite!
    Ich habe jetzt das gemacht, was Du gesagt hast!
    Irgendwie ist es bei mir genau andersrum!
    Wenn ich GND an den PC0 halte, dann leuchten alle LED's und wenn ich die VCC (5V) dranhänge, dann leuchtet gar keine!
    Wie kann das sein?

  8. #28
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    39
    Beiträge
    255
    Ach verzeihung!

    Is klar - du hast deine LEDs sicherlich gegen VCC geschaltet. Also wenn du GND (0V) anlegst wird der PORT auf 0b00000000 geschalten, was bei deiner Schaltung alle LED's leuchten lässt.

    Stimmt also alles! Funktioniert!

    Grüße
    Flite

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    35
    Beiträge
    2.624
    Hi Flite!
    Du bist ein Schatz!
    Danke! Vielen vielen Dank!
    Ich bin ja so ein dusseln!
    Das ich da nicht selbst drauf gekommen bin!
    Kennst Du einen Befehl, mit dem man das invertieren kann?
    Danke nochmal! =D>

    *!!! Juuuuuhhhhhhhhhhuuuuuuuuuuuuuuuu !!!*

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    39
    Beiträge
    255
    Hallo Florian,

    freut mich, dass alles klappt!

    Klar:

    einfach com ad_value
    unter den 4 rors einfügen ....

    Dann klappt das auch ...
    Darf man fragen, was du damit vor hast?

    Viele Grüße
    Flite

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen