- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: ATMega 644 und 1-Wire geht nicht [GELÖST]

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    10.10.2005
    Ort
    Nähe Biberach a.d. Riss
    Alter
    54
    Beiträge
    44

    ATMega 644 und 1-Wire geht nicht [GELÖST]

    Anzeige

    E-Bike
    Hallo zusammen!

    ich hoffe einer von euch kann mir weiterhelfen!
    Ich habe einen Mega32 durch einen Mega644 ersetzt und jetzt geht die 1-Wire Temperaturabfrage nicht oder nur zeitweise und sie zeigen falsche Werte an.
    Mit dem Mega32 funzt alles prächtig, nur mit dem 644er nicht!
    Was ich bisher probiert habe:
    - Chip getauscht
    - mit dem Oszi den Prozessortakt und den 1-Wire Ausgang kontolliert
    (Gleichmäßige Zeiten der Abfragezyklen und/oder sonstige ausserplanmäßige Aktivitäten am 1-Wire Pin
    - Betriebspannung überprüft
    - Fusebits nochmal überprüft (Einstellung: siehe Code im Anhang)
    - Programm nur auf die Temperaturmessung reduziert um Programmierfehlerquellen zu minimieren
    Da das Programm mit dem M32 läuft ist, die Hardware somit i.o.

    Auffällig war auch daß der INT2 von Bascom nicht richtig eingestellt wurde.
    Bascom wollte einfach nicht ein gewisses Bit im EICRA-Register setzen.
    Ich hab es dann per ASM erledigt.
    (im Anhang ist nur ein Ausschnitt aus meinen Programm; der Ausschnitt zeigt aber beim testen die selben Symtome).
    Ausserdem ist mir noch folgendes aufgefallen:
    Bei Temperaturen über 20°C setzt die Messung ganz aus (Anzeige 0,0°C)
    Bei Temperaturen unter 20°C setzt die Messung allmählich wieder ein

    Wer weiss Rat?



    Code:
    ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ' Liest 1-Wire Temperatursensoren aus und zeigt die Werte auf dem Display an
    '
    '-----------------------------------------------------------------------
    
    'Prozessor: ATmega644
    
    '###Lockbits [FF]:###
    'Lockbit 65: 11; No restriction fpr SPM u. LPM
    'Lockbit 43: 11; No restriction fpr SPM u. LPM
    'Lockbit 21: 00; Further programming and verification of the Flash and EEprom is disabled in serial and parallel programming Mode.
    
    '###Fusebits [7F]:###
    'Fusebit C: 0 Divison by 8 disabled
    'Fusebit B: 1 Clock output disabled
    'Kla987: 110111:Full Swing Oscillator; Start-up time: 16K CK + 65 ms; Crystal Osc.; slowly rising power
    
    '###Fusebit High [C1]:###
    'I: 1 OCDEN Fuse unprogrammed
    'H: 1 JTAG disabled
    'Q: 0 Serial programming enabled
    'P: 0 Wachtdog Timer always enabled
    'G: 0 Preserve EEprom when Chip erase
    'FE: 00 4096 Word Boot Size
    'D: 1 Reset Vector is $0000
    
    '###Fusebit extended [FC]:###
    'Fusebit extendet TSR: 100:Brown-out detection level at VCC=4.3 V
    
    
    $regfile = "m644def.dat"
    $framesize = 54
    $swstack = 32                                               'Stackanweisungen
    $hwstack = 64
    $crystal = 14745600                                         'Quarzfrequenz einstellen
    $lib "lcd4busy_v3_1.lib"
    $baud = 19200
    
    Config Portc = Output                                       'portc für Die "Lcd4busy_v3_1.lib vorbereiten"
    Portc = 255
    Config Lcd = 20 * 4
    
    Const _lcdport = Portc                                      ' Konstanten für Lcd-Lib
    Const _lcdddr = Ddrc
    Const _lcdin = Pinc
    Const _lcd_e = 1
    Const _lcd_rw = 2
    Const _lcd_rs = 3
    
    Config 1wire = Portb.4
    
    Initlcd
    
    Cursor Off                                                  'Cursor ausschalten
    
    
    '*******************************************************************************
    '#### Temperaturvariablen einstellen ###
    
    Const Ds1822 = &H22
    Const Skiprom = &HCC                                        ' überspringe ROM Kommandos
    Const Read_rom = &H33                                       ' Lese ROM
    Const Convertt = &H44                                       ' Start Temperaturmessung
    Const Match_rom = &H55                                      'Suche einzelnen Sensor
    Const Read_ram = &HBE                                       ' Lese Scratchpad RAM
    Const Write_ram = &H4E                                      ' Schreibe Scratchpad RAM
    Const Copy_ram = &H48                                       ' Kopiere Scratchpad RAM
    Const Aufloesung = &H5F                                     ' Auflösung 11 Bit
    Const Th = 00                                               ' Alarmschwelle High
    Const Tl = 00                                               ' Alarmschwelle Low
    
    
    Dim Lsb As Byte
    Dim Msb As Byte
    
    Dim Temp As Word                                            ' Temperaturwert 1. Sensor
    Dim Temp1 As Integer
    Dim Mot_temp As Single
    Dim Cur_temp As Single
    Dim Batt_a_temp As Single
    Dim Batt_b_temp As Single
    Dim Auss_temp As Single
    Dim Inn_temp As Single
    Dim Temp_diff_s As Single
    
    '### Alle 1-Wire Devices initialisieren ###
    
    1wreset
    1wwrite Skiprom                                             'überspringe Adressierung
    1wwrite Write_ram                                           'Scratchpad zum schreiben vorbereiten
    1wwrite Th                                                  'Alarmschwelle Max.Temp
    1wwrite Tl                                                  'Alarmschwelle Min.Temp
    1wwrite Aufloesung                                          'Konfigurationsbyte ins Scratchpad schreiben...
    1wwrite Copy_ram                                            '...und im EEProm sichern
    
    '*******************************************************************************
    
    
    '#### H A U P T S C H L E I F E ####
    
    Do                                                          
       Gosub Lcd_ausgabe                                        
       Gosub Temperaturmessung_start                            
       Gosub Temperaturmessung
    Loop
    
    
    
    '*******************************************************************************
    Temperaturmessung_start:
    'dbg
    Waitms 1000                                                 'Wartezeit zum verfolgen auf dem Oszi
    1wreset                                                     '1-Wire Bus reseten
       1wwrite Skiprom                                          'Adressierung überspringen
       1wwrite Convertt                                         'Temperaturmessung bei allen Sensoren einleiten
    
    
    Return
    
    '*******************************************************************************
    Temperaturmessung:
    Waitms 2000                                                 'Wartezeit zum verfolgen auf dem Oszi
    
       1wreset
       1wwrite Match_rom                                        'Gezielten Sensor anwählen....
       1wwrite &H22                                             'Werte stammen aus Sensor,Dezimal
       1wwrite &HFD
       1wwrite &HBA
       1wwrite &H17
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &HE1
    
       1wwrite Read_ram                                         '....und auslesen (Scratch Pad)
    
       Lsb = 1wread()
       Msb = 1wread()
    
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Mot_temp = Temp1 / 16
    
       Return
    
    '###############################################################################
    'Beginn 2.Sensor DS1822
    
       1wreset                                                  'Reset i-Button
       1wwrite Match_rom
       1wwrite &H22
       1wwrite &H00
       1wwrite &HC3
       1wwrite &H17
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &H47
       1wwrite Read_ram                                         'lese Scratch Pad
    
    
       Lsb = 1wread()
       Msb = 1wread()
    
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Cur_temp = Temp1 / 16
    
    '###############################################################################
    'Beginn 3.Sensor DS1822
    
       1wreset                                                  'Reset i-Button
       1wwrite Match_rom
       1wwrite &H22
       1wwrite &H45
       1wwrite &HB4
       1wwrite &H17
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &HE5
       1wwrite Read_ram                                         'lese Scratch Pad
    
    
       Lsb = 1wread()
       Msb = 1wread()
    
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Batt_a_temp = Temp1 / 16
    
    
    '###############################################################################
    'Beginn 4.Sensor DS1822
    
       1wreset                                                  'Reset i-Button
       1wwrite Match_rom
       1wwrite &H22
       1wwrite &H61
       1wwrite &HAD
       1wwrite &H1B
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &H12
       1wwrite Read_ram                                         'lese Scratch Pad
    
    
       Lsb = 1wread()
       Msb = 1wread()
    
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Batt_b_temp = Temp1 / 16
    
    
    '###############################################################################
    'Beginn 5.Sensor DS1822
    
       1wreset                                                  'Reset i-Button
       1wwrite Match_rom
       1wwrite &H22
       1wwrite &H09
       1wwrite &HD8
       1wwrite &H1B
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &HCF
       1wwrite Read_ram                                         'lese Scratch Pad
    
    
       Lsb = 1wread()
       Msb = 1wread()
    
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Auss_temp = Temp1 / 16
    
    
       '###############################################################################
    'Beginn 6.Sensor DS1822
    
       1wreset                                                  'Reset i-Button
       1wwrite Match_rom
       1wwrite &H22
       1wwrite &H98
       1wwrite &HCD
       1wwrite &H1B
       1wwrite &H00
       1wwrite &H00
       1wwrite &H00
       1wwrite &HE7
       1wwrite Read_ram                                         'lese Scratch Pad
    
       Lsb = 1wread()
       Msb = 1wread()
    
       Temp = Msb                                               'MSB holen
       Shift Temp , Left , 8                                    'Platz für LSB machen
       Temp = Temp + Lsb                                        'zu Word Format zusammenfügen
       Temp1 = Temp                                             'Integer Format
       Inn_temp = Temp1 / 16
    
    Return
    
    '*******************************************************************************
    Lcd_ausgabe:
    Waitms 1000
          Cls
          Lcd "Motortemp."
          Lowerline
          Lcd "Curtistemp."
          Thirdline
          Lcd "Batterie 1"
          Fourthline
          Lcd "Batterie 2"
    
    
    Locate 1 , 13
       Lcd Fusing(mot_temp , "##.#") ; Chr(32) ; Chr(223) ; Chr(67)
    
    Locate 2 , 13
       Lcd Fusing(cur_temp , "##.#") ; Chr(32) ; Chr(223) ; Chr(67)
    
    
    Locate 3 , 13
       Lcd Fusing(batt_a_temp , "##.#") ; Chr(32) ; Chr(223) ; Chr(67)
    
    
    Locate 4 , 13
       Lcd Fusing(batt_b_temp , "##.#") ; Chr(32) ; Chr(223) ; Chr(67)
    
    Return
    
    [/b]

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    53
    Beiträge
    81
    Hi,

    ich hab seit gestern das gleiche Problem.
    Am 32 laufen 11 DS1820 ohne Problem und beim Tausch auf einen 644 nicht einmal einer.
    Ich benutze auch den Timer0 als Interrupt. Irgenwas stimmt da auch noch nicht mit dem Quarz. 18.432MHz und die berechneten Werte von Prescaler/Reload stimmen keineswegs mit meinem Oszi überein.
    Ein einfaches Toggle im Interrupt für einen Rechteckimpuls zum Testen ... und Oskar zeigt was anderes .... hhmmmhh.
    Welche Bascom-Version hast du?

    gruss,
    wassermann

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.10.2005
    Ort
    Nähe Biberach a.d. Riss
    Alter
    54
    Beiträge
    44

    --- Problem gelöst ---

    Ich hab nun die Ursache gefunden:
    Ursache war ein etwas zu hochohmiger Pull-up Widerstand.
    Laut Datenblatt ist er mit 4,7kOhm angegeben.
    Nach verkleinerung auf 3,3K funzte wieder alles wie es soll.
    Scheinbar ist beim M32 die Hardware ein wenig anders, sodaß der schwache 4k7 geradenoch ausreicht um den Sägezahn (wenn der Pull-Up die Spannung hochzieht) für den M32 verständlich zu machen.
    Mit dem 3k3 ist die Anstiegszeit ein paar µs besser.
    Ausserdem stellte ich noch fest daß die Spannung direkt am DS18xx steile Flanken nach Masse aufweist (Die 6 DS18xx hängen bei mir an einer 3m langen Leitung). Ein Tantal Kondensator mit so 4,7µF parallel zur Spannungsversorgung des DS18xx schaffte auch hier Abhilfe sodaß die Messung auch mit einem 4k7er wieder lief.
    Wer also Probleme mit den DS18xx hat: Kondensator dran machen und den Pull-UP verkleinern. Wie klein - das steht im Datenblatt (max. Strom vom Atmel und DS18xx).

    ...

Berechtigungen

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

12V Akku bauen