PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tausch ATmega8 nach ATmega168



martin66119
04.10.2010, 16:58
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(8) 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(48) 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

Besserwessi
04.10.2010, 18:44
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.

martin66119
04.10.2010, 18:46
Und was muss ich da anpassen damit es geht?

for_ro
04.10.2010, 20:30
Das Problem dürften die Absoluten RAM Adressen sein.
Ich wüsste beim besten Willen nicht, wo da "Absolute RAM Adressen" sein sollen.


... nur das Programm lief nicht. Was ist da los
Hallo Martin, nach langer Zeit wieder zurück?
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?

martin66119
04.10.2010, 21:16
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

for_ro
04.10.2010, 22:11
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?

martin66119
04.10.2010, 22:17
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

for_ro
04.10.2010, 22:22
Ich habe nur den Atmega 8 durch den Atmega 168 ersetzt
D.h. die gesamte äußere Beschaltung ist exakt die gleiche?


Welches Return ist denn zu viel?
Ist egal, eins raus.

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.

martin66119
04.10.2010, 22:32
Keine Änderung an der Schaltung! Nichts!!!

Werde morgen die neuste Version runterladen und testen, dann sag ich dir Bescheid

Martin

martin66119
05.10.2010, 11:32
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

for_ro
05.10.2010, 12:36
Hallo Martin,
bist du eigentlich sicher, dass der M168 mit dem externen Quarz läuft und nicht intern auf 1MHz?
Falls du Zweifel hast, lass mal eine LED an einem Pin im Sekundentakt an- und ausgehen.
Die Bascom Optionen kannst du übrigens lassen, wie sie sind, solange du den Chip Tzp im Programm selber angibst. Die sind nur als Default für den Fall, dass im Programm nichts angegeben ist. Gilt auch für viele andere $-Konstanten.

martin66119
05.10.2010, 17:55
Guten Abend!

Leider muss ich wieder bis morgen warten um zu schauen ob der 168 geht.

Ich denke aber ja, da auf dem Display was angezeigt wird. Nur die Werte werden über 1wire werden nicht abgefragt.

Werde morgen mal schauen, ob ich am Displat einen Zähler zum laufen bekomme. Werde dich informieren.


Grüße
Martin

for_ro
05.10.2010, 18:09
Wenn du die Fuses noch nicht eingestellt hast, dann läuft der 168 auf 1MHz.
Das heisst, alles läuft langsamer. Für das LCD wahrscheinlich egal, aber 1-wire kommt damit nicht zurecht.
Du könntest auch einfach mal die Frequenz im Programm auf 1MHz stellen und schauen, was passiert.

martin66119
05.10.2010, 19:05
Wie und mit was kann ich das Fusebit einstellen und ggf wieder zurücksetzen.

Benutze Bascom und damit soll das ja nicht gehen.

Martin

martin66119
06.10.2010, 06:52
Guten Morgen!

Ich habe das Fusebit mit dem tool_myavr_quickprog (steht bei myavr unter den Downloads zur Verfügung) eingestellt und nun klappt es!

Vielen Dank für deine Mühe.

Martin