- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: ADC und USART über Register?!

  1. #1
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228

    ADC und USART über Register?!

    Anzeige

    Powerstation Test
    Hallole!
    Ich hab mir vor kurzem nen MPX4115 (Drucksensor) geleistet, hab ihn auch zum laufen gebracht und hab den Luftdruck berechnen können.
    Nun bin ich aber dabei den Code etwas platzsparender zu schreiben (und lass nachher die berechnungen vom PC machen).
    Dabei will ich die USART und ADC Register von Hand konfigurieren (sprich UCSRx und UBRR bzw. ADMUX, ADCSRA). Allerdings will mir jetzt mein Mega8 keine Daten mehr schicken (kommt nix im Terminal-Programm an).

    Im Anhang hab ich die komplette .bas Datei, hier noch ein paar ausschnitte vom Code:

    Register setzen, Variablen deklarieren

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    
    Dim Adhi As Byte                                                                'Temp für ADCH
    Dim Adlow As Byte                                                               'Temp für ADCL
    Dim Adcergebins As Word                                                         'Endergebnis der AD-Wandlung (ADCH+ADCL)
    Dim B As Byte                                                                   '"Merkbit" wenn Adlow und Adhi gelesen sind
    
    Ucsra = &B00000000                                                              'U2X und MPCM aus
    Ucsrb = &B00011000                                                              'UART Interrupts aus, TxD/RxD an, Char. Size=8Bit
    Ucsrc = &B10000110                                                              'Register UCSRC wählen, Asynchron, Parity aus, 1 Stop Bit, Clock Polarity=0
    Ubrr = 23                                                                       'Baudrate=9600, Double Speed aus
    
    Ddrc = &B00000000                                                               'Ports PC0...5 auf Eingang
    Admux = &B1100000                                                               'Referenz: Intern 2,56V, LeftAdjust aus, ADC-Kanal 0 (Pin C.0)
    Adcsra = &B10001101                                                             'ADC an, Free Running aus, ADC-Interrupt an, Prescaler=32
    
    On Adc Onadc                                                                    'Interrupt Routine wenn AD-Wandlung komplett
    
    Sreg.7 = 1
    -> Der Rest des Programms (ADCL/H lesen und an UDR geben)

    Code:
    Do
    
    Adcsra.adsc = 1                                                                 'ADC Wandlung einschalten
    
       If B = 1 Then                                                                'Wenn Adlow und Adhi gelesen wurden...
          Udr = Adlow                                                               '...erst Adlow schicken...
             Do : Loop Until Ucsra.udre = 1                                         '...auf leeres USART-Datenregister warten...                                      '
          Udr = Adhi                                                                '...und dann Adhi schicken
    
          B = 0                                                                     'Als letztes "Merkbit" B auf 0 setzen
       End If
    
    Wait 2                                                                          '2 Sekunden bis zur nächsten Wandlung warten
    
    Loop
    
    Onadc:                                                                          'Wenn ADC einen neuen Wert hat...
    
       Adlow = Adcl                                                                 '...erst Adcl lesen...
       Adhi = Adch                                                                  '...dann Adch...
    
       B = 1                                                                        '"Merkbit" B auf 1 setzen
    
    Return                                                                          'Zur Hauptschleife zurückkehren
    
    
    End
    Das ist mein aktueller Code!
    Ich weiß echt nicht ob ich da was vergessen oder falsch gemacht hab...für mich sieht's eigentlich Richtig aus

    Ich hoffe ihr könnt mir etwas weiterhelfen!

    P.S.: Die Do:Loop Schleife beim übertragen der Daten an UDR ist ein wenig schlecht...wie könnte man die am besten umgehen? Mit dem TX-Interrupt vielleicht?

  2. #2
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Nu, schade das mir keiner helfen kann...aber mein Problem hat sich zwischenzeitlich etwas verändert!
    Ich bekomme seid gestern Werte an der UART...allerdings sind die alles andere als konstant und etwas seltsam!
    An der UART kommen verschiedenste Byte's an...z.B. H=092 L=000 oder H=093 L=192
    Hauptsächlich kommt als Hibyte des ADC 093 und als Lowbyte 000 an. Die übertragung ist wie oben (udr=HiByte Waitms 500 udr=Lowbyte) die ADC auslesung auch (erst LowByte = Adcl Waitms 5 HiByte=Adch)

    Wenn ich nun aus beiden mittels "Ergebnis=Makeint(LowByte, HighByte)" ein Word mache kommt nurnoch 000 und ab und zu 092 an. Wenn ich das ganze rumdrehe kommt 093 an (ohne dieses komische 192).

    Der Wert müsste ~710 sein (ungefähr 1,78V, 10Bit Auflösung und interne 2,56V Referenz).
    Wenn ich das ganze etwas anders rechne (AVcc als Referenz und 8Bit) kommt ungefähr 1,77V raus...was eigentlich stimmt!

    Hab ich irgendwas bei den Registern übersehen? Zahlendreher? Falsch konfiguriert?
    Ich hab keine Ahnung warum das so ist...!

    Ich bin echt für jede Hilfe dankbar!

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad