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]







Zitieren

Lesezeichen