Das Problem dürften die Absoluten RAM Adressen sein. Beim Mega168 beginnt das RAM an einer etwas höheren Adresse. Davor sind noch ein paar SFRs angesiedelt.
Hallo an alle!
Im Moment bin ich wieder dabei meinen "myavr" der mit einem ATmega8 ausgestattet ist wieder in Betrieb zu nehmen. Zur Programmierung nehme ich Bascom. Das hat auch soweit funktioniert. Da ich noch einen ATmega168 zu Hause habe, wollte ich diesen verwenden. Den alten raus den neuen ATmega168 rein. Compilieren und übertragenh ans Board hat auch geklappt nur das Programm lief nicht. Was ist da los. Kann mir jemand helfen:
In Bascom hatte ich unter Options/Compiler/Chip den m168def.dat ausgewählt.
Hier der Code der mit dem ATmega8 lief:
$regfile = "m8def.dat" 'für den ATMega168 hier m168def.dat eingesetzt
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
'**************************Funktionen LCD-Display*******************************
Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port
Config Portb = Output
Pumpe Alias Portb.3
Dim ___lcdno As Byte
___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'**************************Def. allgemeiner Variabeln***************************
Dim Tempmessstelle( As Single
'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 1024 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 34286 'Timer1 soll schon von 34285 wegzählen 4 sekunden
'***************************Config 1Wire****************************************
Config 1wire = Portc.1 'DS1820
Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44
Fg Alias 0
Hg Alias 1
Rl Alias 2
Vl Alias 3
Dim Read_temp As Integer
Dim Sensor_ids(4 As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer
'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 '40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'***********************************Hauptprogramm* ******************************
Do
Loop
End
'**********************************1Wire********** ******************************
1wire:
For Id = Fg To Vl
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Tempmessstelle(id + 1) = Temperatur
If Temperatur <> 85.0 Then ' < 80.0 And Temperatur > -20.0 Then
Tempmessstelle(id + 1) = Temperatur
End If
'FG Alias 0
'HG Alias 1
'RL Alias 2
'VL Alias 3
___lcdno = 0
Select Case Id
Case Fg:
Locate 1 , 1 : Lcd "FG: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Hg:
Locate 1 , 11 : Lcd "HG: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
Case Rl: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" )
Case Vl:
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Cursor Off
Next Id
Return
Return
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 34286
Gosub 1wire
Return
$eeprom
Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 '
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 '
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F '
Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Grüße
Martin
Das Problem dürften die Absoluten RAM Adressen sein. Beim Mega168 beginnt das RAM an einer etwas höheren Adresse. Davor sind noch ein paar SFRs angesiedelt.
Und was muss ich da anpassen damit es geht?
Ich wüsste beim besten Willen nicht, wo da "Absolute RAM Adressen" sein sollen.Zitat von Besserwessi
Hallo Martin, nach langer Zeit wieder zurück?Zitat von martin66119
Was geht denn nicht? Wird das LCD noch Initialisiert, oder geht das auch nicht mehr?
Unten ist ein Return zu viel, wird aber nicht an dem Fehler Schuld sein.
Außerdem würde ich das Gosub 1wire nicht innerhalb der Timer_Isr machen. Du hast zwar etwa 10 Sekunden (wie kommst du auf 4?) Zeit, bis der nächste Aufruf kommt, aber wenn du dein Programm erweiterst gibt es bestimmt irgendwann einmal Probleme.
Welche Bascom Version benutzt du denn jetzt?
Hallo for_ro!
Ja, habe bestimmt 3 nichts gemacht und möchte ich mit dem Controller ein paar Temperaturen messen.
Mit dem ATmega8 läuft das Programm. Auf dem Display wird die Temperatur angezeigt.
Dann habe ich den ATmega8 durch einen ATMega128 ersetzt und und unter Bascom/Option/Chip m168def.da ausgewählt.
Im Programmcode habe ich ich $regfile = "m8def.dat" durch
$regfile = "m168def.dat" ersetzt.
Dann Compiliert und vom PC auf den Controller übertragen. Es kam keine Fehlermeldung.
Auf dem Display wurde aber nichts angezeigt. Anschließend habe ich alles wieder auf den ATMega8 zurückgesetzt und nochmal getestet. Alles klappte. Die Temperatur wurde auf dem Display angezeigt und änderte sich auh bei Erwärmung.
Im Moment benutze ich Bascom 11.8.3. Ich weiß, dass es eine neuere gibt, aber die habe ich noch nicht installiert.
Welches Return ist zuviel? Das letzte oder vorletzte Return.
Und wo soll das Gosub 1wire denn besser hin?
Vielen Dank für deine Hilfe.
Grüße
Martin
Lösche mal diese beiden Zeilen:
Config Lcdbus = 4
Config Lcdmode = Port
Du bist ja im Pinmode, also jeder Pin separat angegeben.
Das Programm könnte ja laufen, nur du merkst es nicht, weil das LCD nicht geht. Ich nehme mal an, dass die RW Leitung des LCDs auf GND liegt, weil es mit dem Mega8 ja funzt.
Steckst du nur den µC um oder was machst du?
Ich habe nur den Atmega 8 durch den Atmega 168 ersetzt und bei den optionen sowie Im Programmcode $regfile = "m8def.dat" durch
$regfile = "m168def.dat" ersetzt.
Sonst nichts!
Welches Return ist denn zu viel?
Leider kann ich erst morgen schauen ob es klappt, da ich den kontroller im Moment nicht zur Hand habe.
Grüße
Martin
D.h. die gesamte äußere Beschaltung ist exakt die gleiche?Zitat von martin66119
Ist egal, eins raus.Zitat von martin66119
Den Mega168 gibt es sicherlich noch nicht so lange. Evtl. ist der Dat-file nicht ganz ok gewesen.
Für dieses MiniProgramm kannst du dir doch den Demo-Code der neuesten Version bei MCS herunterladen. Dann ist ein Fehler dort jedenfalls ausgeschlossen.
Keine Änderung an der Schaltung! Nichts!!!
Werde morgen die neuste Version runterladen und testen, dann sag ich dir Bescheid
Martin
Guten Morgen!
Nun habe ich getestet:
Bascom 1.12.0 ist nun installiert (Vollversion).
A) ATMega168
Im Programmcode sowie in Bascom habe ich m168def.dat eingestellt
An $crystal = 3686400 habe ich nichts geändert
Test 1:
Die beiden Zeilen habe ich gelöscht:
Config Lcdbus = 4
Config Lcdmode = Port
Compiliert und übertragen: kein Fehler
Im Display steht nur -16,2 bei allen Ausgabewerten
Test 2:
Die beiden Zeilen habe ich wieder hinzugefügt:
Config Lcdbus = 4
Config Lcdmode = Port
Compiliert und übertragen: kein Fehler
Im Display steht nur -16,2 bei allen Ausgabewerten
A) ATMega8
Im Programmcode sowie in Bascom habe ich m8def.dat eingestellt
An $crystal = 3686400 habe ich nichts geändert
Test 1:
Die beiden Zeilen habe ich gelöscht:
Config Lcdbus = 4
Config Lcdmode = Port
Compiliert und übertragen: kein Fehler
Im Display stehen die gemmessenen Werte zwischwen 23,5 und 23,7 Grad.
Test 2:
Die beiden zeilen habe ich wieder hinzugefügt:
Config Lcdbus = 4
Config Lcdmode = Port
Compiliert und übertragen: kein Fehler
Im Display stehen die gemessenen Temperaturen 23, 5 Grad bis 23,7 Grad
Und Nun? Was ist nun los? Warum klappt der ATmMega168 nicht? Hat der andere Ports?
Grüße
Martin
Lesezeichen