PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega 644 und 1-Wire geht nicht [GELÖST]



enterprise30
13.05.2008, 21:00
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 :-k

Wer weiss Rat?





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

wassermann
28.05.2008, 06:37
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

enterprise30
28.05.2008, 20:34
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).

...