Bascom ATMEGA 128 OK - ATMEGA 128A Problem

dl3ad

Neues Mitglied
09. März 2013
14
0
1
Sprachen
Hallo,

ich habe da ein seltsames Problem.
In meinem Testaufbau verwende ich einen ATMEGA 128 - dort läuft mein Programm (BASCOM) auch ohne zu mucken.
Dann habe ich mein Steuergerät aufgebaut in dem ich den moderneren ATMEGA 128A-AU verwende.
Auf diesem µC läuft das Programm nicht mehr - es hängt - d.h. es kehrt nicht aus der Interruptroutine in die Mainloop zurück.

Benötige ich für den 128A-AU ein anderes Regfile als dieses hier => $regfile = "m128def.dat"
Wodurch wird dieser Effekt hervorgerufen ?
Gibt es Besonderheiten bei dem 128A_AU ?

Gruß Frank
 
Hallo Frank,

der ATmega128 ist mit dem ATmega128A funktionell identisch.

Der Fertigungsprozess wurde bei dem A-Typ geändert (-> weniger Stromverbrauch und höherer Systemtakt bezogen auf VCC).

Es ergeben sich einige Unterschiede bei "Electrical Characteristics", diese findest du in diesem PDF:
http://www.atmel.com/Images/doc8166.pdf

Das Bascom-Programm sollte normalerweise auch auf dem A-Typ laufen (mit dem selben m128def.dat), ich kenne mich aber mit Bascom nicht so gut aus, möglicherweise gibts hier doch irgendein Unterschied.

Ich vermute eher, dass es einen Unterschied zwischen deinem Testaufbau und deinem aufgebauten Steuergerät gibt, der diesen Effekt hervorruft.

Dirk :ciao:
 
... die Hardware ist identisch !

hier mal ein kleines Testprog

auf dem ATMEGA128 läuft es auf dem 128A-AU hängt es

Die Fusebits sind auch identisch gesetzt

Ich bin absolut Ratlos :vollkommenauf::vollkommenauf::vollkommenauf:

Die Einbindung vom Display auf PortB:

Ddrb = &B0001_0110 'DDR DataDirectionRegister 1= IN, 0= OUT
Portb = &B1110_1001

Display_cs Alias Portb.4 'CS_Pin
Display_busy Alias Pinb.5 'Busy_Pin
Display_tint Alias Pinb.6 'Touchpanel_Interrupt
Set Display_busy
Set Display_cs

Code:
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 500
$swstack = 500
$framesize = 250
$lib "XV-TFT.lib"
' SPI Definition für das Display
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 16 , Noss = 1
Spiinit
$include "init_xv_tft.bas"                                  'Die Routinen der Library einbinden


Config Pine.7 = Input                                       'Encoder
Config Pine.6 = Input                                       'Encoder

Porte.6 = 1                                                 'Pullup einschalten
Porte.7 = 1                                                 'Pullup einschalten
Enable Interrupts                                           'Interrups aktivieren
Enable Int7
Config Int7 = Change                                        'INT7 bei wechselnder Flanke
On Int7 Encodea                                             'bei Interrupt Springe in Encoderdecodierung

Dim A As Byte                                               'Encoder Zählvariable
A = 0
Config Portf = Output                                       'Port zur Signalisierung LEDs
Portf = A


Declare Sub Set_button
Declare Sub Read_button

' Variablen Definitionen
Dim I As Word
Dim X1(20) As Word
Dim Y1(20) As Word
Dim Button_text(20) As String * 10
Dim Button_nr As Word

'Programmbeginn
Wait 1
Bitwait Display_busy , Set                                  'Auf Initialisierung Display warten

Call Touchpanel_setconfig(&H0000001)
Call Setdisplaymode(displaymode_landscape)
Call Setbacklightintensity(255)                             'Max. Backlight Brightness
'Call Set_font(8)
Call Setuserflashmemoryfont(1 , 0)                          'User Font 0 = Ariel 1 = Calibri

Do

Call Setpencolor(0 , 0 , 0)
Call Setbrushcolor(255 , 255 , 255)
Call Fillscreen_brushcolor()                                'Clear Screen

Call Setbrushcolor(255 , 255 , 255)

X1(1) = 2 : Y1(1) = 2 : Button_text(1) = "ANT1"             'ANT1B
X1(2) = 55 : Y1(2) = 2 : Button_text(2) = "ANT2"            'ANT1B
X1(3) = 2 : Y1(3) = 187 : Button_text(3) = " 160"           '160B
X1(4) = 55 : Y1(4) = 187 : Button_text(4) = " 80"           '80B
X1(5) = 108 : Y1(5) = 187 : Button_text(5) = " 40"          '40B
X1(6) = 161 : Y1(6) = 187 : Button_text(6) = " 30"          '30B
X1(7) = 214 : Y1(7) = 187 : Button_text(7) = "Beam"         'BeamB
X1(8) = 267 : Y1(8) = 187 : Button_text(8) = " Man"         'ManB

For I = 1 To 8
  Call Set_button
Next I

Call Read_button
Call Displaydecimal16(10 , 80 , Button_nr )

Wait 1

Loop

'ende Hauptschleife

Sub Set_button
Local X2 As Word
Local Y2 As Word
Local Xt As Word
Local Yt As Word
  Call Setbrushcolor(51 , 180 , 255)                        'Hintergrund hellblau einstellen
  X2 = X1(i) + 50 : Y2 = Y1(i) + 50
  Xt = X1(i) + 5 : Yt = Y1(i) + 18
  Call Drawrect_brushcolorfill(x1(i) , Y1(i) , X2 , Y2)     'Butten setzen
  Call Drawrect_pencolor(x1(i) , Y1(i) , X2 , Y2)
  Call Displaytext(xt , Yt , Button_text(i) )
End Sub

Sub Read_button
Local I As Word
Local X2 As Word
Local Y2 As Word
  Do
  Loop Until Display_tint = 0                               'warten bis Touchmeldung am Pin B6 erfolgt
  Call Touchpanel_readevent()
  If T_event.0 = 1 Then Call Touchpanel_readdown()          'Koordinaten abfragen
  For I = 1 To 8                                            'betätigten Butten ermitteln
   X2 = X1(i) + 50 : Y2 = Y1(i) + 50
   If Xwert > X1(i) And Xwert < X2 And Ywert > Y1(i) And Ywert < Y2 Then Button_nr = I
  Next I
End Sub


End


'Interruptroutine Encoderdecodierung ==========================================================
Encodea:
 If Pine.6 = 0 And Pine.7 = 1 Then A = A + 1
 If Pine.6 = 1 And Pine.7 = 0 Then A = A + 1
 If Pine.6 = 1 And Pine.7 = 1 Then A = A - 1
 If Pine.6 = 0 And Pine.7 = 0 Then A = A - 1
 Portf = A
Return

Die Ausgabe auf Portf geht noch aber nicht die Mainloop
Gruß Frank
 
Hallo Frank,

hmmm, irgendeinen Unterschied muss es eigentlich geben, da der ATmega128A nach Atmel ein "drop-in-replacement" für den ATmega128 ist.

Hast du die Betriebsspannungsversorgung geändert (anderer Regler zB), hast du Pufferkondensatoren VCC/GND verwendet oder gibts hier Unterscheide zum Testaufbau? Der Mikrocontroller ist sicher verlötet, du kannst ihne also nicht gegen den alten wechseln? Prüfe einmal die Lötstellen (letzens hatten wir einen Fall, da ließ sich ein Xmega nicht zuverlässig programmieren, weil ein kleines C nicht richtig gelötet war).

Was macht Bascom eigentlich mit
Code:
Display_busy Alias Pinb.5                                   'Busy_Pin
[B]Set Display_busy[/B]
?

Gruß,
Dirk
 
Hast du die Betriebsspannungsversorgung geändert (anderer Regler zB), hast du Pufferkondensatoren VCC/GND verwendet

Genau, schau da mal nach. Ich hatte früher ein ähnliches Problem. Bei mir war es so dass mein Programm einwandfrei lief (allerdings mit Polling was blöd ist). Denn wollte ich das auf Interrupts umändern. Dann hat sich der Controller nach fast jedem Interrupt komplett resettet. Ich hab Ewigkeiten den Fehler gesucht und nicht gefunden. 2 simple Kondensatoren haben denn das Problem gelöst :)
Eine unsaubere Versorgungsspannung sorgt für die lustigsten Probleme.
 
... Danke für eure Antworten.

Ich verwende Steckmodule von ALVIDI - habe zwei Stück und bei beiden das selbe Problem.
Die HW habe ich gescheckt - ist alles IO - Spannungsregler ist ein 7805.
Da der Controller in HF Umgebung verwendet werden soll ist auch alles sicher mit 100nF Cs mehrfach abgeblockt.

Werde dann mal weitersuchen :hmpf:

Gruß Frank
 
Hallo,

zusätzliche Abblock Cs brachten auch keinen Erfolg.
Ich verwende nun ein anderes 128er Controllerboard - alles paletti :cool:
Das muss an diesen Steckboards liegen :confused:

Danke nochmal für eure Antworten

Gruß Frank
 
Hi Frank,

Ich verwende Steckmodule von ALVIDI - habe zwei Stück und bei beiden das selbe Problem.
Die HW habe ich gescheckt - ist alles IO - Spannungsregler ist ein 7805.
Da der Controller in HF Umgebung verwendet werden soll ist auch alles sicher mit 100nF Cs mehrfach abgeblockt.

sind das diese Dinger?

ALVIDI Shop - AVR Entwicklungsmodul mit ATMEGA128A

Ich hab mir mal den Schaltplan angesehen. Hast du die Jumper für die serielle Schnittstelle (MAX232) gesteckt? Der Teil ist nämlich ziemlich suboptimal gebaut. Vom MAX232 und vom ISP gehen 470 Ohm Widerstände auf die Atmel Pins. Du bekommst also bei gesteckten Jumpern nen schönen Spannungsteiler der dann den Pegel am Atmel-Pin zwischen 0V und 2,5V oder 2,5V und 5V wechseln läßt. Es gibt also keine sauberen Logikpegel an den Pins.
ALVIDI_m128_ISP-UART.png
Es handelt sich dabei um R9, R10, R12, R13.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)