PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega128 Progarmmierung, merkwürdiges Verhalten



atlantex
12.12.2005, 13:19
Hi,

hab heute das Basekit inkl. Programmer von Ulrich Radig fertig gestellt. Der Zugriff klappt soweit, ich nutze Bascom.

Ich habe ein simples Testproggi rübergeschoben:




$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600

Config Porta.0 = Output

Do
Porta.0 = 1
Wait 2
Porta.0 = 0
Wait 2
Loop


leider will die LED nicht blinken, sie ist entweder an oder aus, abhängig von der ersten Porta.0 Anweisung.


Habt Ihr einen Tip für mich ?


Grüsse

atlantex

x-ryder
12.12.2005, 13:55
mach mal nen "end" dahinter, und nach dem config des porta.0 nen porta = 0 und mach am besten auch mal aus dem config porta.0 nen porta

atlantex
12.12.2005, 14:17
Hallo,

hab nochmal einiges probiert, leider will es einfach nicht funktionieren, hier nochmal ein Codefetzen:



$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600


Config Porta = Output

Do
Porta.0 = 1
Printbin &B00000001
Waitms 20
Porta.0 = 0
Printbin &B00000011
Loop
End


Komisch auch dass die Ausgabe mit Print im Terminal auch nur teilweise kommt, nur die erste Zahlenkette wird ausgegeben, bis zur 2. scheint er erst garnicht zu kommen, das gleichen wenn ich das "Waitms" ganz rausnehme :-k



atlantex

x-ryder
12.12.2005, 14:21
was ist das denn fürne platine die du da hast?

atlantex
12.12.2005, 15:55
die hier:

http://www.ulrichradig.de/site/atmel/avr_basekit/pdf/MegaBoardV1.4.pdf





atlantex

bertl100
12.12.2005, 16:47
ddr-Register auf Ausgang gesetzt

ddrx=&b11111111

Mfg

Bertl

atlantex
12.12.2005, 16:53
Hallo bertl100,

danke für den Tip, kann ich aber erst morgen probieren.

Hast Du vielleicht irgendwo einen Link wo ich mich in dieser Richtung etwas belesen kann ?


atlantex

bertl100
12.12.2005, 18:38
Standardmäßig sind alle Ports und pins als eingänge konfiguriert-----> ddrx=&b00000000

"ddr" bedeutet "data direction register" also das Datenrichtungsregister.
Wenn du z.b. ---nur--- den Pin 1 an Port a für eine LED verwenden willst, dann ist die Konfiguration folgendermaßen:

ddra=&b00000010 "von hinten Zählend" Bit0, Bit1...bis Bit7
porta=&b00000010 "von hinten Zählend"

geht auch einfacher:

ddra.1=1
porta.1=1

MFG

Bertl

atlantex
13.12.2005, 06:48
Guten Morgen,

leider hilft das "Ddrx = &B11111111" auch nicht, die Schleife wird nicht abgearbeitet, kann es irgendwo an der Hardware liegen ?




$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600

Config Porta = Output
Ddrx = &B11111111
Porta = &B00000000

Do
Porta.0 = 1
Waitms 30
Porta.0 = 0
Loop
End



thx

atlantex

PicNick
13.12.2005, 08:17
Das nimmt mein BasCom nicht, weil er das Port X nicht kennt, ich kenn's aber auch nicht.
Schreib doch mal
Ddra = &B11111111

atlantex
13.12.2005, 08:35
Hi,

"Ddra = &B11111111" hilft leider auch nicht, die LED leutet immer oder garnicht. Ich bin auch mal auf Port B gegangen, genau das selbe.


MfG

atlantex

PicNick
13.12.2005, 08:46
Mal sehen. Auf jeden Fall mach den Waitms länger, 30 millisekunden kannst du mit dem Auge ja nicht mehr sehen.
BTW: wenn du "config porta = output " schreibst, ist der "ddra = " überflüssig.
Nochwas: da gehört ein zweiter Wait rein
Do
Porta.0 = 1
Wait 1
Porta.0 = 0
Wait 1
Loop
End

atlantex
13.12.2005, 09:07
Hallo,

will einfach nicht klappen,



$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600

Config Porta = Output
Ddra = &B11111111
Porta = &B00000000

Do
Porta.0 = 1
Wait 1
Porta.0 = 0
Wait 1
Loop
End



das einzigste was ausgeführt wird ist das erste Kommando, Porta.0 = x, je nachdem ob 1 oder 0 wird die LED eingeschaltet oder bleibt aus, auf einem Steckboard mit einem Atmega8-16 läuft es tadellos.


thx

atlantex

PicNick
13.12.2005, 09:13
Da das Programm so definitiv stimmt,
mach vor do..loop
einen "enable interrupts", nutzt's nix, schad's nix.
Offenbar bleibt er bei jedem Wait hängen.

PicNick
13.12.2005, 09:19
Hab mir das assembler listing angeschaut, das enable wird nix nutzen.

Fehler liegt ausserhalb des Programms.
Probier es mit PORTB

atlantex
13.12.2005, 09:25
hab ich auch schon probiert, Port B und es passiert genau das selbe ?

kann es an der Hardware liegen ?



atlantex

PicNick
13.12.2005, 09:28
Ideal wär's, du könntest print einfügen.

Hast du schon "Hello, world" probiert ?
https://www.roboternetz.de/wissen/index.php/Sourcevergleich

PicNick
13.12.2005, 09:31
Noch was: Schau, ob der Watchdog abgedreht ist (fuses), der kann auch sowas machen

atlantex
13.12.2005, 09:33
hab ich auch schon probiert,

Printbin &B00000001 geht, aber ein Print "Hello World" bringt mir keine Ausgabe, ich muss nun auch sagen dass ich einen USB->Serial Adapter dran habe.

Ich löt mir mal schnell ein Kabel und häng es an COM 1 dran um erstmal von diesem doofen Adapter wegzukommen (COM21, Hyperterminal kommt mit dem Port garnicht klar, hterm dagegen schon)


bis gleich

atlantex

atlantex
13.12.2005, 09:35
sorry aber bis zu den Fuses bin ich noch nicht vorgedrungen (Newbie), ich nutze Bascom in Verbindung mit einem STK200/300 kompatiblen Programmer.


atlantex

atlantex
13.12.2005, 09:37
FUSEBIT Q 1:Watchdog timer not programmed


was kann ich tun ?


atlantex

PicNick
13.12.2005, 09:47
Mit den Fuses bin ich auch immer vorsichtig.
Schreib in das Programm "STOP WATCHDOG" rein (vorn) .

schad' nix

atlantex
13.12.2005, 09:59
Hi,




$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600
Stop Watchdog

Config Porta = Output
Ddra = &B11111111
Porta = &B00000000

Printbin &B00000001

Do
Porta.0 = 1
Wait 1
Porta.0 = 0
Wait 1
Loop
End


Printbin wird ausgeführt, die LED bleibt dann aber aus, wenn ich das Printbin auskommentiere geht die LED an, scheint so als wenn nur das erste verfügbare Kommando ausgeführt wird.


atlantex

PicNick
13.12.2005, 10:22
Nun, das sieht so aus, in Wirklichkeit hat er da aber schon einiges getan und den kompletten SRAM auf Null gelöscht.
Was er aber bei printbin u. Wait das erstemal macht, ist ein call. und aus dem kommt er offenbar nicht zurück.
probieren wir mal was:


$regfile = "m128def.dat"
$crystal = 16000000
$baud = 9600

dim a as byte
dim b as byte


Config Porta = Output
Porta = &B00000000

Do
Porta.0 = 1
for a = 1 to 255
for b = 1 to 255
next
next

Porta.0 = 0

for a = 1 to 255
for b = 1 to 255
next
next

Loop
End


is nur ein Versuch, er sollt da keine calls machen

atlantex
13.12.2005, 10:27
Hi,

der Code funktioniert, die LED an A:0 blinkt nun.

läst sich das Prob beheben ?


atlantex

PicNick
13.12.2005, 10:36
Tätarätääää !
uiuiuiui. Eigentlich heisst das, daß entweder
der SRAM im oberen Bereich einen Schaden hat (dort do der Stack liegt)
Oder der Stackpointer selber (very strange)
Oder daß in der m128def.dat was falsches drinsteht (very strange)
Kannst du mal die .RPT file posten ? (die is im selben directory wie .BAS)
und eventuell die .HEX Datei ?

Und, die ganz blöde Frage: Is wirklich ein 128-er eingebaut ?

atlantex
13.12.2005, 10:56
Hier die Files:

http://www.cb-host.de/files/MAIN_TEST.HEX

http://www.cb-host.de/files/MAIN_TEST.RPT

und ja es ist wirklich ein Atmega128



atlantex

PicNick
13.12.2005, 11:38
*murmel* Alles ok.

Mögliche Erklärung (weil ich nicht glaub, daß was hin ist)

Für den Mega128 gibt es zwei modes:"normal" und "103 compatible"

Bascom codiert für normal (logo)
dieser comptible mode is auch bei den Fuses dabei.
Kannst du mal schauen, ob da irgendwas bei den Fuses zu sehen ist ?

atlantex
13.12.2005, 11:46
unter "Fusebits Extended" habe ich folgendes eingestellt:

FUSEBIT P 0:ATMEGA103 compatibility mode set
FUSEBIT Q 1:Watchdog timer not programmed


atlantex

PicNick
13.12.2005, 11:51
Irgendwie ist das mit den Fuses immer ungekehrt (oder nich ?)

Dreh mal den Mode um, passieren kann nix. (zum probieren dann aber wieder mit printbin, damit auch ein call da ist)

atlantex
13.12.2005, 11:59
Juhuuuu, es geht !!!!

Danke für die Hilfe


atlantex

PicNick
13.12.2005, 12:02
Jo mei, da le. mi am A...

Super ! Sowas kann einem den Nerv ziehen, weil es ja saumäßig mysteriös ist.

also, dann !

atlantex
13.12.2005, 12:11
noch was anderes, was muss ich jetzt zwecks UART bzw. teminal ändern damit wieder was kommt ?

Wenn er auf Atmega128 steht kommt nix mehr im Terminal :-k


atlantex

PicNick
13.12.2005, 12:30
Du meinst bei "Hello, world" ?
Weil "printbin &B00000001" is ja eigentlich nix sichtbares auf einen terminal.

atlantex
13.12.2005, 12:34
naja, das Printbin &B00000001 bringt mir eben diese ausgabe im Terminal (hterm), somit konnte ich feststellen dass er nicht weiter kam als zum ersten Befehl, das klappt nach der Umschaltung nicht mehr, hab nochmal zurückgestellt und dann geht es wieder. Baudrate habe ich auf 9600 eingestellt.

Ein Print "Hallo" bringt mir auch nix im Terminal


atlantex

atlantex
13.12.2005, 12:43
jetzt bin ich mal mit der Baudrate etwas runter gegangen, nun kommen schonmal irgendwelche wilden Zeichen im Terminal.


atlantex

PicNick
13.12.2005, 12:46
Jetzt is wieder die Geschichte mit dem Quartz / Oszillator--> Fuses
(Extern / intern etc) das sollte schon stimmen. sonst is nix mit der Baudrate.
Mach einen LED blink Schleife mit "Wait 1 ". Ob die LED in einem Sekundentakt blinkt, kann man ganz gut abschätzen.

atlantex
13.12.2005, 12:52
hmmm, der steht hier im mom auf "0001:CKSEL=0001 Internal RC Oscillator 1 MHz"

na ich werd ma bissel weiter lesen.



thx

atlantex

PicNick
13.12.2005, 12:56
Schau da auch mal.

https://www.roboternetz.de/wissen/index.php/Bascom_-_Erstes_Programm_in_den_AVR_Controller_%C3%BCbertr agen

atlantex
13.12.2005, 13:16
hab jetzt mal die Fuses vom Oszillator/Quarz auf extern gestellt, nun geht garnix mehr, er kann den chip nicht mehr identivizieren #-o

kann man den atmega128 irgendwie komplett resetten


atlantex

PicNick
13.12.2005, 13:38
Na, is denn ein Quartz da ?

atlantex
13.12.2005, 13:41
jo, ein 16 Mhz Quarz aber trotzdem sagt er beim refresh immer "READLB entry not found"

gibts noch Hoffnung ?


atlantex

PicNick
13.12.2005, 13:54
Die Hoffnung stirbt zuletzt.
Im anderen Mode geht das ?

atlantex
13.12.2005, 13:58
kann man den Quarz beim Einbau verdrehen, Beschriftungen finde ich jedenfalls keine.



atlantex

atlantex
13.12.2005, 14:00
ich komme an die Fuse Bits nicht mehr ran, sie werden nicht mehr ausgelesen, die Fehlermeldung erscheint sobald ich die Fuseliste refreshen will.


atlantex

PicNick
13.12.2005, 14:00
Nein, das ist egal. Das ist doch schon gegangen ?

atlantex
13.12.2005, 14:01
ja ging schon, aber da stand der Oszillator Fuse noch aus "intern"...


atlantex

PicNick
13.12.2005, 14:04
Aja, ich verganz gaß. Schau dir mal die fraglichen Leiterbahnen etc. genau an. Weder der Quarz noch die zwei Kondesatoren dabei haben irgendeine Polarisierung.
die üblichen Verdächtigen halt checken.

atlantex
13.12.2005, 16:07
uffff, kannst Du bitte "die üblichen Verdächtigen" noch etwas eingrenzen ? ;-)


danke

atlantex

PicNick
13.12.2005, 18:01
Lötbrücken, kalte Löstellen, Leiterbahn unterbrechung, daß die Beinchen Atmega128 irgendwie keine kontakt haben. Quartz wechseln (wenn das geht).
WIe gesagt, wundert mich, daß ausgerechnet eines dieser Verbindungen was haben sollte. ich glaub, vorn im Thread hast du ja die Schaltung beschrieben ? ich schau mal.

atlantex
13.12.2005, 20:00
ok, danke erstmal, ich kann es erst Donnerstag prüfen da ich morgen nicht da bin, ich berichte was dabei rauskommt.


thx

atlantex

x-ryder
13.12.2005, 20:24
wird wohl nichts bringen denke ich, das hat nur in ca. 5% aller fälle bei mir was damit zu tun, wo wohnst du, kannst du das teil mal schicken?´

Martin

atlantex
14.12.2005, 05:41
Morgen,


ich schau mir das am Donnerstag nochmal an, Ulrich Radig (Entwickler der Platine) meinte dass ein externer Quarz wie auf der Schaltung geht.

Soweit ich mich entsinnen kann habe ich aus "~12 MHz extern" gestellt da das meinem 16 MHz Quarz am nächsten kam. Ich weder diesen Quarz auch mal tauschen...

Sollte ich nix hinbekommen, melde ich mich wegen dem Versand, ich komme übrigens aus Cottbus.


atlantex

atlantex
15.12.2005, 08:14
Guten Morgen,

ich hab mal die lötpunkte geprüft, alles sauberer Durchgang, ich habe auch mal den Quarz getauscht (6 MHz), ebenso kein Erfolg.

Ich hab nun den Chip entfernt und durch einen neuen ersetzt, nun geht wieder alles O:)

Die Ungewissheit bleibt allerdings weiterhin, warum hat es nicht funktioniert ????

Wenn ich ein Osziloskop an Pin XTAL1 und XTAL2 ranhalte, kann ich dann sehen ob da eine Frequenz anliegt ?



thx

atlantex

atlantex
16.12.2005, 18:46
Hallo,


ich denke ich habe den Fehler gefunden. Standardmässig steht das Fuse Bit für den Oszillator auf intern 1 MHz, ich hatte es auf extern 12 MHz gestellt.

Nun sitzt ja auf meinem Board ein "normaler" Quarz und kein Quarz Oszillator und das scheint ja ein Unterschied zu sein... (wenn ich es dem Datenblatt richtig entnommen habe), welche Einstellungen müssen denn für diesen einfachen Quarz an dem Fusebit vorgenommen werden damit der Mikrocontroller Ihn nutzt ?

Sind die Fuse Bit Einstellungen in Bascom und Ponyprog gleich ?


thx


atlantex

x-ryder
17.12.2005, 10:40
bascom wäre das A987 auf 1111:1111 und ponyprog wäre das cksel0-3 nicht anklicken

darwin.nuernberg
17.12.2005, 12:00
Die Sache mit dem Quartz und dem Oszillator:

Wenn gar nichts mehr geht, dann hilft meist, für die Dauer des Programmierens,
bis alles richtig funktioniert, die Einspeisung eines externen Taktes (z.B. von einem Oszillator).

Wenn man sich diesen in eine Art Stift einbaut mit Spitze / Steckanschluss,
hat man einen Sog. Taktinjector, welcher auch bei eingebautem Quarz funktioniert und auf XTAL1 einspeist.

Ein sehr nützliches und sinnvolles Werkzeug (wenn man öfters bastelt)




Ich hatte auch schon einen Versuch mit 'nem 128, welcher kläglich scheiterte und vermutete dass es am PEN Eingang liegt (Program ENable).

Wie verhält es sich bei Deinem Board mit dem PEN,
Liegt der auf Lo oder HI oder abhängig von Zustand (Programmierung / Operation).

Dann könnte ich schon wieder eine Fehlerquelle ausschließen.
Momentan geht garnix (Eigentlich ging nie was damit). :-(

atlantex
17.12.2005, 15:12
Hi,

>>Momentan geht garnix (Eigentlich ging nie was damit).

doch, nachdem der Kompatibilitätsmodus angepasst wurde war er, wenn auch nur kurzzeitig, voll funktionsfähig. Ich konnte ihn programmieren und er hat das kleine Proggi sauber abgearbeitet. Zu dem Zeitpunkt war aber eben nur der interne Quarz in Funktion... Nach dem umstellen war der Chip erst tot, mittlerweile weis ich dass es einen Unterschied zw. Quarz und Quarzoszi gibt, das auslöten wäre also garnicht nötig gewesen...

nun bin ich aber etwas schlauer ;-)



Den PEN Engang/Pin hatte ich Anfangs garnicht angeschlossen, da ich garnet wuste wozu der ist, mein Testboard hat aber einen Jumper dafür vorgesehen...

Mittlerweile ist er aber auf LO (laut Board Datenblatt), ich muss allerdings sagen dass er sich als er garkeine Verbindung hatte problemlos programmieren und nutzen liess.

Ich möchte kommende Woche ein Termometer aufbauen:

- innen und aussen Temperatur anzeigen
- LCDisplay 2x16 Zeichen
- 2 x LM75 via I2C
- einen Timerbaustein (I2C ?) um zeitabhängig das Display leuchten zu lassen (z.B. wenn ich aufstehe für ne Stunde)
- eine rote LED die ab 0 Grad leuchtet
- einen Taster um das LCD "manuell" leuchten zu lassen

Das ding will ich dann im Flour anner Wand haben :-)

Das ganze soll in Bascom programmiert werden.



thx

atlantex