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]
Lesezeichen