- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 11 bis 17 von 17

Thema: Problem mit Mittelwertberechnung (Atmega8)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    25.06.2007
    Beiträge
    9
    Also bis auf die separate und sternförmige Masse kann ich eigentlich alles ausschließen. Ich benutze eine externe Referenzspannung 3,3V.
    Um weitere Layoutfehler auszuschließen hab ich alles nochmal auf dem myAVR experimentierboard gesteckt. Hab jetzt nochmal alles unnötige aus dem Code genommen und die Hysterese etwas vereinfacht. Ändert aber nix.

    Code:
    ;+----------------------------------------------------------------------
    ;| Title : myAVR Grundgerüst für ATmega8
    ;+----------------------------------------------------------------------
    ;| Funktion : ...
    ;| Schaltung:
    ;eingänge: gehäuse temp portC5
    ; verdampfer temp 1 portC1
    ; verdampfer temp 2 portC2
    ; verdampfer temp 3 portC3
    ; verdampfer temp 4 portC4
    ; pumpsignal portC0
    ; leistungswahl 1 portB4
    ; leistungswahl 2 portB5
    ; fluidmangel portB3
    ;Ausgänge: pumpen1-2 portB1
    ; pumpen3-4 portB2
    ; lüfter portB0
    ; pumpen bereit1-2 portD2
    ; pumpen bereit3-4 portD3
    ; heizung 1 portD4
    ; heizung 2 portD5
    ; heizung 3 portD6
    ; heizung 4 portD7
    ;
    ;blinkreg: bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
    ; "blinkbit" - - - - - - -
    ;
    ;heizreg: bit7 bit6 bit5 bit4 bit3 bit2
    ; - - - heizen m.4 heizen m.3 heizen m.2
    ;
    ;pumpreg: bit7 bit6 bit5 bit4 bit3
    ; pumpen möglich 4 1.pumpen möglich 4 p.m.3 1.p.m.3 p.m.2
    ;+----------------------------------------------------------------------
    ;| Prozessor : ATmega8
    ;| Takt : 3,6864 MHz
    ;| Sprache : Assembler
    ;| Datum : 30.06.2007
    ;| Version : 1.5
    ;| Autor : Ulrich Betz
    ;+----------------------------------------------------------------------
    .include "AVR.H"
    .equ blinkreg, 0x14 ;r20 als variable (register für blink
    .equ heizreg, 0x15 ;r21 als variable (register für heizf
    .equ pumpreg, 0x16 ;r22 als variable (register für pumpf
    .equ lotemp, 0x17 ;r23 als variable (untere temperatur)
    .equ midtemp, 0x18 ;r24 als variable (mitlere temperatur
    .equ hitemp, 0x19 ;r25 als variable (obere temperatur)
    ;------------------------------------------------------------------------
    ;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
    rjmp ontimer ;10 TC0 Overflow
    hystereseversuch.s, Seite 1 von 8
    reti ;11 SPI, STC Serial Transfer Complet
    reti ;12 UART Rx Complete
    reti ;13 UART Data Register Empty
    reti ;14 UART Tx Complete
    reti ;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: ;initialisiere stack
    ldi r16,lo8(RAMEND)
    out SPL,r16
    ldi r16,hi8(RAMEND)
    out SPH,r16
    ;initialsiere I/O Register
    ldi r16, 0b00000111 ;portB5,B4,B3 als eingang portB2,B1,
    out DDRB, r16
    ldi r16, 0b00111000 ;pull up für portB5,B4,B3, ausgänge
    out PORTB, r16
    ldi r16, 0b11111100 ;portD7,D6,D5,D4,D3,D2 als ausgang
    out DDRD, r16
    ;initialisierung timer0
    ldi r16, 0b00000101 ;maskiere timer0
    out TCCR0, r16
    ldi r16, 0b00000001 ;konfiguriere
    out TIMSK, r16 ;interrupt auslösen
    ;initialisierung ADC
    ldi r16, 0b00000001 ;ADC channel 1
    out ADMUX, r16 ;portC1 ADC channel 1
    ldi r16, 0b10000101 ;ADC ein und 115KHz taktrate
    out ADCSRA, r16 ;single step
    ;initialisierung UART
    sbi UCSRB, 3 ;TX aktivieren
    ldi r16, 23
    out UBRRL, r16 ;baudrate 9600 einstellen
    ;Temperatur Vergleichswerte (Schaltpunkte)
    ldi lotemp, 140 ;unterer schaltpunkt
    ldi midtemp, 180 ;mitlerer schaltpunkt
    ldi hitemp, 240 ;oberer schaltpunkt
    ldi pumpreg, 0
    ldi heizreg, 0
    ldi r18, 0
    ldi r19, 0
    sei
    ;------------------------------------------------------------------------
    mainloop:
    sbis PINB, 4 ;skip wenn LWahl-1 nicht gewählt B4=l
    rjmp tempabfr12
    cbi PORTD, 4 ;heizen 1 off
    cbi PORTD, 5 ;heizen 2 off
    cbi PORTB, 1 ;pumpen 1-2 off
    cbi PORTD, 2 ;pumpen 1-2 led off
    rjmp LWahl2
    tempabfr12: rcall tempabfrage12 ;unterprogrammaufruf
    sbis PINB, 3 ;skip wenn kein fluidmangel B3=logisc
    rjmp pump12off
    sbrs pumpreg, 0 ;skip wenn 1pumpen 1 möglich
    rjmp pump12off
    sbrs pumpreg, 1 ;skip wenn pumpen 1 möglich
    hystereseversuch.s, Seite 2 von 8
    rjmp pump12off
    sbrs pumpreg, 2 ;skip wenn 1pumpen 2 möglich
    rjmp pump12off
    sbrs pumpreg, 3 ;skip wenn pumpen 2 möglich
    rjmp pump12off
    ;rcall pump12
    rjmp LWahl2
    pump12off: cbi PORTD, 2 ;portD2 logisch 0 , "1-2 bereit led"
    cbi PORTB, 1 ;pumpen 1-2 off
    LWahl2: sbis PINB, 5 ;skip wenn LWahl-2 nicht gewählt B5=l
    rjmp tempabfr34
    cbi PORTD, 6 ;heizen 3 off
    cbi PORTD, 7 ;heizen 4 off
    cbi PORTB, 2 ;pumpen 3-4 off
    cbi PORTD, 3 ;pumpen 3-4 led off
    rjmp mainloop
    tempabfr34: rcall tempabfrage34 ;unterprogrammaufruf
    sbis PINB, 3 ;skip wenn kein fluidmangel B3=logisc
    rjmp pump34off
    sbrs pumpreg, 4 ;skip wenn 1pumpen 3 möglich
    rjmp pump34off
    sbrs pumpreg, 5 ;skip wenn pumpen 3 möglich
    rjmp pump34off
    sbrs pumpreg, 6 ;skip wenn 1pumpen 4 möglich
    rjmp pump34off
    sbrs pumpreg, 7 ;skip wenn pumpen 4 möglich
    rjmp pump34off
    ;rcall pump34
    rjmp mainloop
    pump34off: cbi PORTD, 3 ;portD3 logisch 0 , "3-4 lereit led"
    cbi PORTB, 2 ;pumpen 3-4 off
    rjmp mainloop
    ;------------------------------------------------------------------------
    tempabfrage12:
    push r16
    push r17
    lds r16, 0x61 ;Twert1 aus sram laden
    lds r17, 0x62 ;Twert2 aus sram laden
    cp r16, hitemp
    brlo heizenon
    cbi PORTD, 4
    rjmp ende1
    heizenon: cp r16, midtemp
    brsh ende1
    sbi PORTD, 4
    ende1: cp r17, hitemp
    brlo heizenon2
    cbi PORTD, 5
    rjmp ende2
    heizenon2: cp r17, midtemp
    brsh ende2
    sbi PORTD, 5
    ende2: pop r16
    pop r17
    ret
    ;-------------------------------------------------------------------------
    tempabfrage34:
    push r16
    push r17
    lds r16, 0x63 ;Twert3 aus sram laden
    lds r17, 0x64 ;Twert4 aus sram laden
    hystereseversuch.s, Seite 3 von 8
    cp r16, hitemp
    brlo heizenon3
    cbi PORTD, 6
    rjmp ende3
    heizenon3: cp r16, midtemp
    brsh ende3
    sbi PORTD, 6
    ende3: cp r16, hitemp
    brlo heizenon4
    cbi PORTD, 7
    rjmp ende4
    heizenon4: cp r16, midtemp
    brsh ende4
    sbi PORTD, 7
    ende4: pop r16
    pop r17
    ret
    ;----------------------------------------------------------------------------
    ;
    ;versuchstext
    ontimer:
    ;Twert1 einlesen
    wertelesen: push r16
    push r20
    ldi r20, 0
    loop0: inc r20 ;zähler +1
    ldi r16, 0b00000000 ;ADC channel 0
    out ADMUX, r16 ;portC1 ADC channel 0
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten0: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten0
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    add r18, r26
    adc r19, r27
    cpi r20, 16 ;zähler =16?
    brne loop0 ;wenn nicht dann geh zu loop0
    ;wert durch 16 teilen
    clc ;carry flag löschen
    ror r19 ;high byte durch zwei teilen, übertra
    ror r18 ;carry links einschieben und durch zw
    clc ;carry für nächste teilung löschen
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r19 ;schiebe bit 0 des high-teils ins C-F
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    hystereseversuch.s, Seite 4 von 8
    asr r19 ;schiebe nächstes bit des high teils
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    sts 0x60, r18 ;r18 in sram speichern
    ;werte senden
    putChar0: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar0 ;warten bis UDR bereit
    out UDR, r18 ;senden
    ;werte senden ende
    ldi r18, 0 ;werteregister lo-teil zurücksetzen
    ldi r19, 0 ;werteregister hi-teil zurücksetzen
    ldi r20, 0 ;zähler zurücksetzen
    loop1: inc r20 ;zähler +1
    ldi r16, 0b00000001 ;ADC channel 1
    out ADMUX, r16 ;portC1 ADC channel 1
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten1: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten1
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    add r18, r26
    adc r19, r27
    cpi r20, 16 ;zähler =16?
    brne loop1 ;wenn nicht dann geh zu loop0
    ;wert durch 16 teilen
    clc ;carry flag löschen
    ror r19 ;high byte durch zwei teilen, übertra
    ror r18 ;carry links einschieben und durch zw
    clc ;carry für nächste teilung löschen
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r19 ;schiebe bit 0 des high-teils ins C-F
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    asr r19 ;schiebe nächstes bit des high teils
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    sts 0x61, r18 ;r18 in sram speichern
    ;werte senden
    putChar1: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar1 ;warten bis UDR bereit
    out UDR, r18 ;senden
    ;werte senden ende
    ldi r18, 0 ;werteregister lo-teil zurücksetzen
    ldi r19, 0 ;werteregister hi-teil zurücksetzen
    ldi r20, 0 ;zähler zurücksetzen
    loop2: inc r20 ;zähler +1
    ldi r16, 0b00000010 ;ADC channel 2
    out ADMUX, r16 ;portC2 ADC channel 2
    hystereseversuch.s, Seite 5 von 8
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten2: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten2
    ;Twert2 einlesen
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    add r18, r26
    adc r19, r27
    cpi r20, 16 ;zähler =16?
    brne loop2 ;wenn nicht dann geh zu loop2
    ;wert durch 16 teilen
    clc ;carry flag löschen
    ror r19 ;high byte durch zwei teilen, übertra
    ror r18 ;carry links einschieben und durch zw
    clc ;carry für nächste teilung löschen
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r19 ;schiebe bit 0 des high-teils ins C-F
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    asr r19 ;schiebe nächstes bit des high teils
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    sts 0x62, r18 ;r26 in sram speichern
    ;werte senden
    putChar2: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar2 ;warten bis UDR bereit
    out UDR, r18 ;senden
    ;werte senden ende
    ldi r18, 0 ;werteregister lo-teil zurücksetzen
    ldi r19, 0 ;werteregister hi-teil zurücksetzen
    ldi r20, 0 ;zähler zurücksetzen
    loop3: inc r20 ;zähler +1
    ldi r16, 0b00000011 ;ADC channel 3
    out ADMUX, r16 ;portC3 ADC channel 3
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten3: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten3
    ;Twert3 einlesen
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    add r18, r26
    adc r19, r27
    cpi r20, 16 ;zähler =16?
    brne loop3 ;wenn nicht dann geh zu loop2
    ;wert durch 16 teilen
    clc ;carry flag löschen
    ror r19 ;high byte durch zwei teilen, übertra
    ror r18 ;carry links einschieben und durch zw
    clc ;carry für nächste teilung löschen
    ror r19
    ror r18
    hystereseversuch.s, Seite 6 von 8
    clc
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r19 ;schiebe bit 0 des high-teils ins C-F
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    asr r19 ;schiebe nächstes bit des high teils
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    sts 0x63, r18 ;r26 in sram speichern
    ;werte senden
    putChar3: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar3 ;warten bis UDR bereit
    out UDR, r18 ;senden
    ;werte senden ende
    ldi r18, 0 ;werteregister lo-teil zurücksetzen
    ldi r19, 0 ;werteregister hi-teil zurücksetzen
    ldi r20, 0 ;zähler zurücksetzen
    loop4: inc r20 ;zähler +1
    ldi r16, 0b00000100 ;ADC channel 4
    out ADMUX, r16 ;portC4 ADC channel 4
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten4: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten4
    ;Twert4 einlesen
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    add r18, r26
    adc r19, r27
    cpi r20, 16 ;zähler =16?
    brne loop4 ;wenn nicht dann geh zu loop2
    ;wert durch 16 teilen
    clc ;carry flag löschen
    ror r19 ;high byte durch zwei teilen, übertra
    ror r18 ;carry links einschieben und durch zw
    clc ;carry für nächste teilung löschen
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ror r19
    ror r18
    clc
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r19 ;schiebe bit 0 des high-teils ins C-F
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    asr r19 ;schiebe nächstes bit des high teils
    ror r18 ;schiebe alle bits nach rechts, C-Fla
    sts 0x64, r18 ;r26 in sram speichern
    ;werte senden
    putChar4: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar4 ;warten bis UDR bereit
    out UDR, r18 ;senden
    hystereseversuch.s, Seite 7 von 8
    ;werte senden ende
    ldi r18, 0 ;werteregister lo-teil zurücksetzen
    ldi r19, 0 ;werteregister hi-teil zurücksetzen
    ldi r20, 0 ;zähler zurücksetzen
    ldi r16, 0b00000101 ;ADC channel 5
    out ADMUX, r16 ;portC5 ADC channel 5
    sbi ADCSRA, 6 ;starte nächste konvertierung
    warten5: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
    rjmp warten5
    ;Twert5 einlesen
    in r26, ADCL ;low-teil auslesen
    in r27, ADCH ;high-teil auslesen
    ;.................... ;10 bit zu 8 bit auflösung, alle bits
    asr r27 ;schiebe bit 0 des high-teils ins C-F
    ror r26 ;schiebe alle bits nach rechts, C-Fla
    asr r27 ;schiebe nächstes bit des high teils
    ror r26 ;schiebe alle bits nach rechts, C-Fla
    sts 0x65, r26 ;r26 in sram speichern
    ;werte senden
    putChar5: sbis UCSRA, 5 ;bit 5 = UDR empty
    rjmp putChar5 ;warten bis UDR bereit
    out UDR, r26 ;senden
    ;werte senden ende
    pop r16
    pop r20
    reti
    hystereseversuch.s, Seite 8 von 8
    Angehängte Dateien Angehängte Dateien

Berechtigungen

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

Labornetzteil AliExpress