Forum: Mikrocontroller und Digitale Elektronik ATMega Testcode


von Re T. (toobatch)


Lesenswert?

1
#define __AVR_ATmega2561__
2
3
#include <avr/io.h>
4
#include <avr/wdt.h>
5
#include <avr/interrupt.h>
6
7
int i,f,k;
8
9
int main()
10
11
{
12
cli();      // IRQs verbieten
13
wdt_disable(); // WD abschalten
14
DDRA = 0xFF;
15
DDRB = 0xFF;
16
DDRC = 0xFF;
17
DDRD = 0xFF;
18
DDRE = 0xFF;
19
DDRF = 0xFF;
20
DDRG = 0xFF;
21
for (i = 0;; i++)
22
{  
23
  PORTA^=0xFF;
24
  PORTB^=0xFF;
25
  PORTC^=0xFF;
26
  PORTD^=0xFF;
27
  PORTE^=0xFF;
28
  PORTF^=0xFF;
29
  PORTG^=0xFF;
30
31
        f=i*3;
32
        k=i+f-k; 
33
}
34
35
  return(0);
36
37
}

also es geht darum grundsätzlich zu testen ob ein ATMega, im jetztigen 
Falle ein ATMEGA 2561, code abarbeitet. wär das ein annehmbarer code 
oben ?
oder gibt es bessere  ideen?  der Code läuft nämlich nicht, flashen geht 
erfolgreich, Tackt ist da, Fuses stimmen .

von Peter (Gast)


Lesenswert?

Was läuft nicht? Bist Du sicher, dass Diu in der "for" Schlaufe keine 
Abbruchbedingung brauchst?

von Re T. (toobatch)


Lesenswert?

na warum ..  der soll einfach nur laufen in der schleife.  will dann an 
den pins mit oszi messen.

wo soll er denn hinlaufen wenn ich ne abbruchbedingung reinbaue?

von Patrick (Gast)


Lesenswert?

Wozu brauchst Du denn k und f?
Schreib doch anstatt
1
for (i = 0;; i++)
2
{
einfach mal
1
 while (1)
2
{

von Re T. (toobatch)


Lesenswert?

ja ok ,  schon klar ... aber die For -schleife geht doch auch so.

f,k hab ich nur so das es noch was rechnet ... könnte ich auch 
auskommentieren .

der code läuft auf atmega128  , hab ich gerade herausgefunden.
im simulator mit Atmega2561 läuft er auch , aber nicht auf dem realen uC 
ATmegaa2561.

von Patrick (Gast)


Lesenswert?

Sind die Fuses richtig gesetzt?

von Re T. (toobatch)


Lesenswert?

sollten sie:
programmiert (0) sind:
BrownOuDetection @1.8V
JTAG ENable
Preverse EEPROM from chipErase
Bootflash section size =4096 words/ start @$1F000
Ext. Crystal Osc.  f>8Mhz / startuptime 16k ck + 65ms

programmierung via JTAG, Quarz beschaltet  (läuft auch)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Re To wrote:

> #define __AVR_ATmega2561__

Bereits in der ersten Zeile falsch.  Das Setzen dieses Symbols ist
nicht dein Geschäft, das macht der Compiler.  Da du es dennoch
setzt, vermute ich, dass du einfach mal die -mmcu-Option beim
Compilieren und/oder beim Linken vergessen hast zu setzen.

von Re T. (toobatch)


Lesenswert?

äh .. ja ist doch eig. egal wie ich es mache, ich kanns auch 
auskommentieren und dann -mmcu..  schreiben.

es ändert sich nix

von Re T. (toobatch)


Lesenswert?

ok. kann mir mal jmd sagen wie ich manuell von. der *.c   zum *.hex 
komme ?

hatte das mit sonem makefile gemacht...

avr-gcc -o <name> <name>.c -mmcu=atmega2561

oder so ...  und dann weiter ??

hab da keine ahnung richtig, auch mit diesem makefile editieren nicht

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Re To wrote:
> äh .. ja ist doch eig. egal wie ich es mache, ...

Nein, ist es nicht.  Wenn du keine Ahnung hast, dann lass dir
wenigstens raten.

von Re T. (toobatch)


Lesenswert?

ja nun wie ??

wie komm ich von dem *.c ins *.hex ...  manuell ohne scheiß-make

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mit dem Ton kannste selbst sehen, wie du deinen Krams gebacken bekommst.

von Re T. (toobatch)


Lesenswert?

oh sorry,  hab nur ein bissl Wut ... komm nicht vorwärts :(

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dann fang doch nicht an, an Stellen rumzubohren, von denen bekannt
ist, dass sie gut funktionieren.  Bau dir ein Makefile mit mfile
oder mit AVR Studio, von dem klar ist, dass erst einmal die
äußeren Bedingungen stimmen, wie der Compiler und Linker gerufen
werden.

Nichts dagegen, dass du die Interna von make & Co. verstehen lernen
willst, aber du kannst dich jetzt zwischen dieser Aufgabe entscheiden
oder der, erst einmal relativ schnell zu funktionierendem Code zu
gelangen.

von Re T. (toobatch)


Lesenswert?

hmm ...

ja der code müsste richtig sein, im simulator läuft er.
und wie gesagt auf dem 128er läuft er  in real auf dem uC im gleichen 
board/umgebung.

hatte ein makefile  eines projekts benutzt und im c-code alles erstmal 
unwichtige auskommentiert und in die main() das obige reinkopiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Das wdt_disable() ist übrigens nutzlos.  Entweder befindest du dich
nach einem power-on reset, dann ist der Wachhund sowieso abgeschaltet.
Oder aber, eine frühere Firmware hat dir den Wachhund noch vererbt,
dann wirst du ihn auf diese einfache Weise nicht los.  Du musst zu
allererst das WDRF-Bit löschen.  Sowohl das Datenblatt als auch die
Doku zu <avr/wdt.h> gehen ausführlich darauf ein.

Das cli() ist genauso überflüssig, nach einem Reset sind die
Interrupts immer gesperrt.

Die Variablen i, j, k und f kann der Compiler wegoptimieren, da sie
offensichtlich nicht genutzt werden.

von Re T. (toobatch)


Lesenswert?

ja OK ,  danke für die infos.

bin jetzt erstmal froh das was geht. mal mit assembler was geschrieben 
und das funktioniert :)

aber wieso geht der c-code nicht?
du meinst mfile benutzen, na dann werd ichs mal probieren.


beim simulieren ist mir auch aufgefallen das der code ab adresse 0x1F000 
losgeht. weiß nicht wie das mit dem bootloader ist, wenn ich diesen Boot 
Vektor reset nicht programmiert hab (fusebit=1) dann startet der uC  an 
der adresse wo das bootFlash section eingestellt ist , oder ? also der 
bootloader wird dann komplett ignoriert oder nicht?

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Mit diesen Skript kompiliere ich seit lange meinen Code
#!/bin/sh
avr-gcc -mmcu=atmega8 -Os -o /tmp/avrgccout $1
avr-objcopy -j .data -j .text -O ihex /tmp/avrgccout $2
rm /tmp/avrgccout

Und es funktioniert :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Häng mal für alle Fälle noch ein »-lm« an die AVR-GCC-Kommandozeile
mit dran.

von Re T. (toobatch)


Lesenswert?

aha, ok , danke .

das irgendwie zu verstehen is schon nicht leicht
die hilfeprints  mit --help bzw. -v --help   mit  allen möglichen 
schalteroptionen  sprengen ja jeden bildschirm.

von Re T. (toobatch)


Lesenswert?

So. hab was entdeckt:
1
-Ttext=0x1F000

das stand im makefile und verschiebt den code an diese Adresse nach 
hinten im hexFile also auch im Flash.

komisch ist nur das das ganze auf dem ATMega128 mit dem Wert 0xF000 
ging, der compiler merkerte da der 128er ja nicht soviel Flash hat, da 
hab ich das geändert und er  erzeugte alles für den 128er und der code 
lief darauf.

Jemand ne Antwort darauf ?

was macht der uC denn wenn er auf die Anweisung FFFF stößt ?

schönen Tag ...

von egberto (Gast)


Lesenswert?

mal eine ganz blöde Frage - hast du für deine Makefiles einen 
Ghostwriter oder so was, das du nicht weist was drin steht??

Wenn du keinen Bock hast, dich mit makefiles rumzuärgern (so wie ich 
meistens), trag doch die Optionen im Projekt beim AVR-Studio ein, dann 
wird das im Makefile richtig gesetzt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Re To wrote:

> Jemand ne Antwort darauf ?

Jemand deutsch hier?

Die Atmel-Tools wissen nicht, ob sie den Flash nun in 16-bit-
Adressierung (für Codezugriffe) oder in 8-bit-Adressierung (für
Datenzugriffe => LPM) anzeigen wollen.  Daher tun sie meist
ersteres.

Die GNU-Tools haben einen größeren Horizont und laufen auf
Maschinen mit 8, 16, 32 oder 64 bit Wortbreite.  Da die Anpassung
der Adressierung für jede Maschine zu ziemlicher Verwirrung führen
würde, benutzen sie immer Byteadressen.

0x1F000 (Byteadressierung) = 0xF800 (16-bit-Adressierung)

Warum das aber bei 0xF000 rauskommen soll, bleibt mir rätselhaft.

von Re T. (toobatch)


Lesenswert?

Jörg Wunsch wrote:

> Warum das aber bei 0xF000 rauskommen soll, bleibt mir rätselhaft.

wahrscheinlich hast du mich falsch verstanden: in dem MAkefile stand die 
0x1F000 (-tText0x1F000), und ich hatte Sie manuell in eine 0xF000 
geändert. Da der Compiler error sagte und ich mir dachte, klar - für was 
auch immer die angabe steht: der Atmega128 hat nicht solch einen großen 
Flashspeicher.
dann lief der Code auf dem ATMEGA128 aber auf dem 2561 immer noch nicht 
!!

erst nachdem ich die Option  -tText<> gelöscht hatte ging es dann auch 
auf dem 2561er.

mir stellte sich dann nur die frage warum das mit dem nach hinten 
verschoben code auf dem einen ging und auf dem anderen nicht.

hatte ja auch im simulator (avrStudio) diese FFFF- "Anweisungen" gesehen 
vor und hinter dem richtigen Code gesehen, der simulator ist mit 
"ungülter code" einfach weitergelaufen bis er zum eig. Code kam.

von Guile Lampert (Gast)


Lesenswert?

Du hast das Makefile für einen Bootloader erwischt.
Deshalb wird der Code auch nach hinten ins Flash geschrieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.