- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 26 von 26

Thema: Assembler ADC Mega32

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2005
    Beiträge
    26
    Anzeige

    Powerstation Test
    Ich habe nun ein Programm erstellt, welches den Wert des ADCs in den EEPROM abspeichert. Jedoch erhalte ich die ganze Zeit ungefähr die gleichen Werte, ohne dass ich irgend eine Taste drücke. Diese Werte sind im Bereich 0x0150 bis 0x0180. Wenn ich eine Taste drücke kriege ich auch nur einen Wert dazwischen geliefert. Wo ist der Fehler im Programm?
    Wollte eigentlich nur den jeweiligen Wert in den EEPROM speichern, wenn eine Taste gedrückt wird.

    Code:
    .Include "m32def.inc"
    .DEF tmp = R16
    .DEF lowad = R17
    .DEF highad = R18
    .EQU wertadlow = 0x60
    .EQU wertadhigh = 0x61
    
    ldi tmp,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2)
    out ADCSRA, tmp
    ldi tmp,(0<<REFS0)|(0<<REFS1)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)
    out ADMUX, tmp
    sbi ADCSRA, ADSC	;Das Bit ADSC wird gesetzt und der ADC startet.
    
    wait:
    sbis ADCSRA,ADIF	;Das ADIF wird abgefragt, ob eine Spannung anliegt.
    rjmp wait	;Warteschleife bis Spannung anliegt.
    
    in lowad, ADCL	;Das Low-Byte des ADCs wird ausgelesen.
    in highad, ADCH	;Das High-Byte wird ausgelesen.
    
    ;Überprüfung ob Werte im sinnvollen Bereich sind.
    ldi R21,0x32	;Es wird erst ab Wert 50 in EEPROM geschrieben.
    sub R21,lowad
    brpl wait
    
    ldi R21,0x02	;Es wird erst ab Wert 768 nicht mehr in EEPROM geschrieben.
    sub R21,highad
    brmi wait
    
    write1:
    sbic EECR,EEWE	;Ist der Schreibzyklus beendet, PC = PC +2
    rjmp write1
    
    ldi R19, 0xF0	;Festlegen der Zieladresse.
    ldi R20, 0x00	
    
    out EEARH, R20	;Die Zieladresse des EEPROM wird übertragen.
    out EEARL, R19
    
    ;Als Nächstes wird das Low-Byte des ADCs abgespeichert.
    
    out EEDR, highad	;Byte in Zwischenspeicher laden.
    
    ;Folgende 2 Befehle sorgen dafür, dass der Wert im Zwischenspeicher nun endgültig in der Zieladresse des EEPROMs abgespeichert wird.
    
    sbi EECR,EEMWE
    sbi EECR,EEWE
    
    write2:
    sbic EECR,EEWE	;Ist der Schreibzyklus beendet, PC = PC +2
    rjmp write2
    
    ;Nun wird die nächste Zieladresse festgelegt und das High-Byte des ADCs abgespeichert.
    
    inc R19
    
    out EEARL, R19	;Es muss nur das Low-Byte geändert werden.
    out EEDR, lowad
    
    sbi EECR,EEMWE
    sbi EECR,EEWE
    ;Ende
    Als Referenzspannung habe ich AREF mit Jumper angegeben. (Also 2,56 V.)
    Wäre auch gut, wenn jemand das Programm mal in seinem RN-Control testen könnte und mir sagen kann, ob dort die gleichen Werte gespeichert werden.

    Danke!

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,
    wenn du die RN-Control hast, solltes Du auch die CD dazu bekommen haben, da ist auch ein C-Beispiel dabei, Dateiname (tastenled.bas ja, stimt schon so !) das lässt sich leicht auf ASM anwenden.

    Der Jumper URef sollte gesteckt sein, und als Referenz nur so:
    ADMUX = (1<<REFS0)|...


    Der Sprung bei den Abfragen zu wait: haut irgendwie nicht hin, denn da wird nix mehr neu gemessen, nur überprüft ob gemessen wurde, also bleibt der Wert immer dergleiche.

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2005
    Beiträge
    26
    So, habe die Bedingungen verbessert. Nun sollte so zwischen AD-Wert 0x6E und 0x82 die LED1 leuchten. Jedoch leuchtet diese, manchmal ohne Taste 5 gedrückt zu haben, oder sogar wenn ich Taste 4 oder Taste 3 drücke.
    Die Werte des ADCs sind ohne irgendeine Taste gedrückt zu haben, so um 0x0140 bis 0x0180. Das sind umgerechnet so 0,9V. Jedoch sollte doch 0V anliegen, wenn keine Taste gedrückt ist?

    Code:
    .Include "m32def.inc"
    .DEF tmp = R16
    .DEF lowad = R17
    .DEF highad = R18
    .EQU wertadlow = 0x60
    .EQU wertadhigh = 0x61
    
    ldi tmp,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2)
    out ADCSRA, tmp
    ldi tmp,(1<<REFS0)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)
    out ADMUX, tmp
    sbi ADCSRA, ADSC	;Das Bit ADSC wird gesetzt und der ADC startet.
    
    wait:
    sbis ADCSRA,ADIF	;Das ADIF wird abgefragt, ob eine Spannung anliegt.
    rjmp wait	;Warteschleife bis Spannung anliegt.
    
    in lowad, ADCL	;Das Low-Byte des ADCs wird ausgelesen.
    in highad, ADCH	;Das High-Byte wird ausgelesen.
    
    ;Überprüfung ob Werte im sinnvollen Bereich sind.
    u1:
    ldi R21,0x00
    sub R21,highad
    brmi u2
    ldi R21,0x14	;Es wird 20 vom gesamten ADC-Wert abgezogen.
    sub R21,lowad
    brmi write1
    
    u2:
    ldi R21,0x02	;Es wird erst ab Wert 768 nicht mehr in EEPROM geschrieben.
    sub R21,highad
    brpl write1
    rjmp wait		;Falls Werte nicht zwischen 20 und 768 -->wait
    
    write1:
    sbic EECR,EEWE	;Ist der Schreibzyklus beendet, PC = PC +2
    rjmp write1
    
    ldi R19, 0xF0	;Festlegen der Zieladresse.
    ldi R20, 0x00	
    
    out EEARH, R20	;Die Zieladresse des EEPROM wird übertragen.
    out EEARL, R19
    
    ;Als Nächstes wird das Low-Byte des ADCs abgespeichert.
    
    out EEDR, highad	;Byte in Zwischenspeicher laden.
    
    ;Folgende 2 Befehle sorgen dafür, dass der Wert im Zwischenspeicher nun endgültig in der Zieladresse des EEPROMs abgespeichert wird.
    
    sbi EECR,EEMWE
    sbi EECR,EEWE
    
    write2:
    sbic EECR,EEWE	;Ist der Schreibzyklus beendet, PC = PC +2
    rjmp write2
    
    ;Nun wird die nächste Zieladresse festgelegt und das High-Byte des ADCs abgespeichert.
    
    inc R19
    
    out EEARL, R19	;Es muss nur das Low-Byte geändert werden.
    out EEDR, lowad
    
    sbi EECR,EEMWE
    sbi EECR,EEWE
    
    ;Abfrage Bereich 110 bis 130
    ldi R21,0x00
    sub R21,highad
    brmi ende
    ldi R21,0x5A
    sub R21,lowad
    brpl ende
    ldi R21,0x7D
    sub R21,lowad
    brmi ende
    ;LED1 leuchtet bei Taste 5
    led1:
    ldi R22,0x01
    out DDRC,R22
    ldi R22,0b11111110
    out PORTC,R22
    ende:
    ;Ende
    Ich verstehe nicht, wo mein Fehler liegt und wo ich ihn suchen soll.

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    In dem Programm wird aber nur einmal am Anfag der AD-Wandler angeworfen, also nur einmal überhaupt gemessen, danach wird immer mit dem selben Wert gearbeitet (oder irgedwas zufälliges), weil das Label wait: nach dem Start des AD-Wandlers steht !

  5. #25
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2005
    Beiträge
    26
    Habe das nun geändert und (wait übder das (ADCSRA,ADSC) geschrieben. Jedoch macht das Programm noch immer die gleichen Probleme.

    Das mit dem (wait erklärt jedoch nicht wieso ich immer irgendeine Spannung am ADC liegen habe, wenn keine Taste gedrückt wurde.

    Edit: Habe das Problem gefunden.

    Es lag nicht direkt am Programm. Habe die ganze Zeit beim Versuchen den ISP-Dongle vom Computer dran gehabt. D.h. es ist irgendwie eine Spannungsschwankung entstanden. Diesen gleichen Effekt, habe ich auch wenn ich mit dem Multimeter am PA7 messe und beim Abnehmen des Messfühlers geht die LED auch an.

    Hätte nicht gedacht, dass der ADC so empfindlich auf Spannungsschwankungen und Kriechströme reagiert.

    Das einzige was mich noch stört, ist dass es ab und zu vorkommt, dass die LED angeht ohne irgendwas zu machen. Aber das liegt vielleicht daran, dass die Grenze zu nahe bei 0 liegt.

    Edit1: Die LED geht auch manchmal an, wenn ich das Board in der Hand halte.

  6. #26
    Neuer Benutzer Öfters hier
    Registriert seit
    13.06.2005
    Beiträge
    26
    Das Problem ist auch mit der Stromversorgung über Netzteil noch immer da. Scheint doch nicht die Lösung zu sein.

    Weiß denn keiner irgendwie weiter. Komm einfach nicht dahinter.

    Wenn ich ein Programm in C schreibe, dann geht das Schalten der LEDs über die Auswertung der Tasten mit dem ADC ohne Problem. Das gleiche mit Bascom.

    Dann kann es doch wohl nur am Programm selbst liegen.

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

LiFePO4 Speicher Test