-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Tausch ATmega8 nach ATmega168

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    Tausch ATmega8 nach ATmega168

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Und was muss ich da anpassen damit es geht?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Besserwessi
    Das Problem dürften die Absoluten RAM Adressen sein.
    Ich wüsste beim besten Willen nicht, wo da "Absolute RAM Adressen" sein sollen.

    Zitat Zitat von martin66119
    ... 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?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von martin66119
    Ich habe nur den Atmega 8 durch den Atmega 168 ersetzt
    D.h. die gesamte äußere Beschaltung ist exakt die gleiche?

    Zitat Zitat von martin66119
    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.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    Keine Änderung an der Schaltung! Nichts!!!

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

    Martin

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •