mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Programm (ADWandler Ergebnisumwandlung)


Autor: Der Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich bin dabei gerade ein Programm für ein Volt Amperemeter mit nen
ATMega8 inklusive Display ausgabe zu schreiben.
Und da ich Absoluter µC Einsteiger bin bräuchte ich
eine stützende Hilfe.

Mit den Totourials bin ich schon so weit gekommen das
mir wenn keine Fehler vorhanden sind
- Die Mittelwertbildung für 64 Messwerte fehlt
- Die Umwandlung der Messwerte in ACSII
- Ausgabe am Display
nur noch fehlen.

Könntet Ihr mir damit auf die Sprünge helfen?


Ist es möglich/sinnvoll ein Display 4 mal
in der Sekunde anzusteuern?

Ich hätte gedacht das ich bei einen Output CompareMatch
einmal das gesamte Messprogramm alle 0.25s ausführe.

Meine Referenz ist am ATMega ein TL431 für 2.5V
Eine Spannung von 0 V - 20 V wird von 0 - 2 V
runtergeteilt zusätzlich hab ich einen Impendanzwandler
zwischen Spannungsteiler und ADCPin

Der Strom von Maximal 2 Ampere wird über einen
Shunt und OpAmp *10 Verstärkt und liefert ein
0 - 2 V Signal.

Die Platine und alles ist schon auf den Rechner ich warte
nur noch bis das Programm auch noch Fertig ist.

Alle Display Ansteuerungs Kommandos die ich hinzugefügt habe
funktionieren einwandfrei und brauchen nicht kontrolliert werden.

Danke =)
.include "m8def.inc"
 
.def temp1 = r21
.def temp2 = r22
.def temp3 = r23

; Bildet das 16 Bit Register für die Ergebnisse
.def messwerteH  = r16
.def messwerteL  = r17
; Ist für den Messungs Zähler zuständig
.def zaehler  = r18 


; Interruptvectortabelle
.org 0x0000
           rjmp    main               ;Adresse für das Hauptprogramm
.org OC1Aaddr
           rjmp    Messung        ;Startet mit einer Messung und Anzeige


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

; Display initialisieren
           rcall lcd_init
; Display löschen                      
           rcall lcd_clear               


; Compare Match Register für 4 Anzeigewiderholungen in der Sekunde

       ldi    temp1,high(46875)                            
       out    OCR1AH, temp1
       ldi    temp1,low (46875)
          out    OCR1AL, temp1


; Timer Initialisieren; Prescaler=256; O

       ldi       temp1, ( 1 <<WGM12 ) | ( 1 <<CS12 )
         out    TCCR1B, temp1

       ldi    temp1, 1 << OCIE1A
       out    TIMSK, temp1         
      
; ADWandler Initialisieren ;Prescaler=32 ,Single Run ,Externe Referenz
    
       clr    temp1
       out    ADMUX,temp1

       ldi    temp1, (1 <<ADEN ) | ( 1 << ADPS2 ) | ( 1 << ADPS0 ) 
       out    ADCSRA,temp1
      
; Aktiviere Interrupts
           sei




loop:
  
    rjmp loop





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Das gesamte Programm für eine Spannungs und Strom Messung und der 
; Anzeigen Ansteuerung
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




;Interruptvectoradresse -> Startet mit diesen Program bei jedem Compare Match
Messung:


; Löscht das gesamte Display
       rcall lcd_clear
;Springt mit den Cursor zur ersten Stelle
       rcall lcd_home
; Adresse des Strings in den Z-Pointer laden
       ldi ZL, LOW (Erste_Zeile*2)         
           ldi ZH, HIGH(Erste_Zeile*2)        
; Gebe 'Erste Zeile' aus
           rcall lcd_flash_string
; Springt mit den LCD Cursor in der Zweiten Zeile

; Leert die Register mit den Messwerten
        clr MesswerteL        
        clr MesswerteH

; Läd den SChleifenzähler
        ldi zaehler,64       
    

; Wählt den ADC Kanal=PC1 für die Spannungsmessung aus
      sbi  ADMUX,1 << MUX0  

; Ruft das Unterprogramm für den ADC auf
      rcall starte_adc
      
          
; Liest die ADC Werte in den X-Pointer
      in   XL,ADCL
      in   XH,ADCH

; Addiert die ADC Werte in die Messwerte Register 
      add  MesswerteL,XL
      adc  MesswerteH,XH
      
; Zieht vom Zaehler 1 ab
      dec  zaehler

; Wenn noch keine 64 Messungen durchgeführt wurden -> Springe zu starte_adc
      brne starte_adc  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Hier fehlt die :
; - Mittelwertbildung
; - Binär zu ASCII umwandlung
; - Ausgabe am Display
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hier folgt die Strommessung
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Springt mit den Cursor zur der Stelle wo die Strommesswerte 
; angezeigt werden soll
       rcall lcd_cursor_ampere_line

; Leert die Register mit den Messwerten
        clr MesswerteL
        clr MesswerteH

; Wählt den ADC Kanal=PC0 für die Spannungsmessung 
      cbi  ADMUX,1 << MUX0

; Ruft das Unterprogramm für den ADC auf
      rcall starte_adc
            

        
; Läd den Zählerschleifer
        ldi zaehler,64
       
; Liest die ADC Werte in den SRAM
      in   XL,ADCL
      in   XH,ADCH

; Addiert die ADC Werte in die Messwerte Register aus den SRAM
      add  MesswerteL,XL
      adc  MesswerteH,XH
      

; Zieht vom Zaehler 1 ab
      dec  zaehler

; Wenn noch keine 64 Messungen durchgeführt wurden -> Springe zu starte_adc
      brne starte_adc  

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Hier fehlt die :
; - Mittelwertbildung
; - Binär zu ASCII umwandlung
; - Ausgabe am Display
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                
;Verlässt den Timerinterrupt wieder
      reti






;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hier folgen diverse Unterprogramme
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Startet den ADC
starte_adc:

        sbi     ADCSRA, ADSC
      rcall   warte_adc

; Wartet bis die Messung abgeschlossen ist
warte_adc:
        sbic    ADCSRA, ADSC        
         rjmp    warte_adc
      ret  

Erste_Zeile:
           .db "Spannung   Strom ",0   ; Stringkonstante, durch eine 0
                                       ; abgeschlossen  


.include "lcd-routines.asm"

    

           .DSEG                   ; Datensegment SRAM

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.