- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 35 von 35

Thema: RN-Mega2560 Muß man Aref noch mit 100nF beschalten? [gelößt]

  1. #31
    Benutzer Stammmitglied Avatar von kaktus
    Registriert seit
    17.05.2004
    Beiträge
    34
    Anzeige

    LiFePo4 Akku selber bauen - Video
    So Leute, kämpfe mit dem gleiche Problem wie hier beschrieben, kann egal was ich mache nur adc 0-7 lesen.

    Gibt es dafür schon ne Lösung?



    Code:
    $prog , 255 , &B11011001 ,                                  'Quarz an / Teiler aus / Jtag aus
    
    $regfile = "m2560def.dat"
    $hwstack = 82                                               '80
    $framesize = 68                                             ' 64
    $swstack = 68                                               '44
    
    $crystal = 16000000                                         'Quarzfrequenz
    
    Config Pind.5 = Output
    Led Alias Portd.5
    
    
    $baud = 57600
    
    Dim Kanal As Byte
    Dim X As Word
    
    
    
    '*** RS232 Protokoll ***
    
    Const Tz = ","
    
    ' *** ADC ***
    Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
    Start Adc
    
    '*** Hauptschleife ***
    
    Do
    
    
     Kanal = 0
     Print "*" ; Tz;
     Led = 0
     Adcsrb.mux5 = 0
     Waitms 100
     For Kanal = 0 To 7
     X = Getadc(kanal)
     Print X ; Tz;
     Next Kanal
    
     Adcsrb.mux5 = 1
     Kanal = 0
     Waitms 100
     For Kanal = 0 To 7
     X = Getadc(kanal)
     Print X ; Tz;
     Next Kanal
     Led = 1
     Print "#" ; Tz
    
    
    
    Loop
    End

  2. #32
    Benutzer Stammmitglied Avatar von kaktus
    Registriert seit
    17.05.2004
    Beiträge
    34
    Gibt es für diesen Fehler noch keine Lösung?

  3. #33
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Solange es von MCS kein Update gibt, gibts nur ein Workaround, nämlich den GetAdc selber proggen.

    Hier nochmal warum es mit dem Workaround MUX5 setzen auch nicht mehr geht (in ASM):
    Code:
    'W = Getadc(10)
    +000000AA:   9100007C    LDS     R16,0x007C       ADMUX
    +000000AC:   7E00        ANDI    R16,0xE0         Bits 0-4 löschen
    +000000AD:   9110007B    LDS     R17,0x007B       ADCSRB
    +000000AF:   7F17        ANDI    R17,0xF7         MUX5 löschen
    +000000B0:   600A        ORI     R16,0x0A         Kanalnr. !!
    +000000B1:   9310007B    STS     0x007B,R17       ADCSRB
    +000000B3:   9300007C    STS     0x007C,R16       ADMUX
    +000000B5:   940E00C8    CALL    0x000000C8       GETADC aufrufen
    ....
    ' GetADC
    +000000C8:   9170007A    LDS     R23,0x007A       ADCSRA
    +000000CA:   6470        ORI     R23,0x40         ADSC setzen
    +000000CB:   9370007A    STS     0x007A,R23       ADCSRA
    +000000CD:   9000007A    LDS     R0,0x007A        ADCSRA
    +000000CF:   FC06        SBRC    R0,6             Skip if bit ADSC in register cleared
    +000000D0:   CFFC        RJMP    PC-0x0003        Relative jump
    
    +000000D1:   9170007A    LDS     R23,0x007A       ADCSRA
    +000000D3:   6470        ORI     R23,0x40         ADSC setzen
    +000000D4:   9370007A    STS     0x007A,R23       ADCSRA
    +000000D6:   9000007A    LDS     R0,0x007A        ADCSRA
    +000000D8:   FC06        SBRC    R0,6             Skip if bit ADSC in register cleared
    +000000D9:   CFFC        RJMP    PC-0x0003        Relative jump
    
    +000000DA:   91800078    LDS     R24,0x0078       ADCL
    +000000DC:   91900079    LDS     R25,0x0079       ADCH
    +000000DE:   9508        RET                      Subroutine return
    Bei jedem GetADC wird MUX5 gelöscht, und immer noch die falsche KanalNr bei > 7 mitgegeben !

  4. #34
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Das muss einen neuen Post Wert sein

    Hab einen neuen Workaround gefunden !

    Hier erstmal wieder der ASM Auszug:
    Code:
    W = Getadc(33)
    +000000AA:   9100007C    LDS     R16,0x007C       ADMUX
    +000000AC:   7E00        ANDI    R16,0xE0         Bits 0-4 löschen
    +000000AD:   9110007B    LDS     R17,0x007B       ADCSRB
    +000000AF:   6018        ORI     R17,0x08         MUX5 setzen, weil KanalNr >= 32
    +000000B0:   6001        ORI     R16,0x01         Kanalnr. 1 !! stimmt so !
    +000000B1:   9310007B    STS     0x007B,R17       ADCSRB
    +000000B3:   9300007C    STS     0x007C,R16       ADMUX
    +000000B5:   940E00C8    CALL    0x000000C8       GETADC aufrufen
    Erklärung:
    Hab in der History zu 1.11.9.1 gefunden, das es ab jetz funktionieren soll
    dabei ist mir der Fehler* aufgefallen, es wird nicht die KanalNr geprüft, sondern nur der Wert der übergeben wird, und beim M2560 wird für KanalNr > 7 ein ADMUX-Wert von 32+x gebraucht !!

    Und so gehts, wenn ein Kanal 8-15 gelesen werden soll, muss man das selber abfragen/ausrechnen, und dann mit GetADC(32+x) Aufrufen, dann wird das MUX5 richtig gesetzt !
    Also Wert 32 entpsricht ADC-Kanal 8.

    Edit:
    \/

    PS:
    * mit Fehler ist Anwenderfehler gemeint

  5. #35
    Benutzer Stammmitglied Avatar von kaktus
    Registriert seit
    17.05.2004
    Beiträge
    34
    Danke ! War ein heiser Tipp.

    Habe mir das Datenblatt nochmal angeschaut, erscheint mir jetzt auch als logisch was du da schreibst

    100000 ADC8 entspricht DEZ 32
    100001 ADC9
    100010 ADC10
    100011 ADC11
    100100 ADC12
    100101 ADC13
    100110 ADC14
    100111 ADC15 entspricht DEZ 39


    Mit folgendem Bascom 1.11.9.1Code funktioniert es jetzt bei mir
    Code:
    $regfile = "m2560def.dat"
    $hwstack = 82                                               '80
    $framesize = 68                                             ' 64
    $swstack = 68                                               '44
    
    $crystal = 16000000                                         'Quarzfrequenz
    
    Config Pind.5 = Output
    Led Alias Portd.5
    
    
    $baud = 57600
    'Config Com4 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    'Open "com4:" For Binary As #4                               'USB Buchse
    
    
    Dim Kanal As Byte
    
    Const Tz = ","                                              ' Trennzeichen ist ein Komma
    
    ' *** ADC ***
    Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
    Start Adc
    
    '*** Hauptschleife ***
    
    Do
     
     Print "*" ; Tz;
     Led = 0
    
         For Kanal = 0 To 15
         If Kanal > 7 Then Kanal = Kanal + 24                   ' Wegen Bascom 1.11.9.1 Bug notwendig
         Print Getadc(kanal) ; Tz;
         If Kanal > 7 Then Kanal = Kanal - 24                   ' Wegen Bascom 1.11.9.1 Bug notwendig
         Next Kanal
    
     Led = 1
     Print "#" ; Tz
    
    Loop
    End
    man kann natürlich auch zwei getrennte Schleifen programmieren
    For Kanal = 0 To 7
    und
    For Kanal = 32 To 39 ' = 8-15

    Nochmal Danke und viel Spaß weiterhin

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

12V Akku bauen