Forum: Mikrocontroller und Digitale Elektronik ATmega128 Problem


von Daniel (Gast)


Lesenswert?

Habe folgende Probleme:

1.
Ist warte(); eingebaut, scheint er dort zu hängen.
Nehme ich die Funktion warte() aus dem Programm heraus, läuft er.
2.
Habe ich putchar('x'); eingebaut, gibt er endlos das Zeichen x aus,
schaltet aber nicht mehr die Ports.
Woran kann das liegen?

von Daniel (Gast)


Lesenswert?

Hier mein Code: (habe einige for-Schleifen der Übersicht wegen
herausgenommen)
#include<mega128.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


void warte(void)
{
unsigned char a;
for (a=0;a<80;a++)
{
}
}

// *** START des C-Programms ***
void main(void){
unsigned int x;

  UCSR0B=  0b00011000;
  UCSR0C=  0b00000110;

  UBRR0L=87;

  // Initialsierung
  // Interupt



  DDRC.4 = 1;
  DDRC.5 = 1;
 warte();
  while(1)
 {
PORTC.4=1;
PORTC.5=0;
 //putchar('2');


  for (x=0;x<25000;x++)
{

}

}
PORTC.5=1;
PORTC.4=0;
for (x=0;x<25000;x++)
{
}

 }

}

von Daniel (Gast)


Lesenswert?

Zeichen x ist eine 2. 1 Klammer ist zuviel, liegt aber daran, daß ich
dort eine for_schleife entfernt hatte.

von Rufus T. Firefly (Gast)


Lesenswert?

Wenn Du Deinen Quelltext auch noch formatieren würdest, müsste man keine
geschweiften Klammern zählen ...

von Stefan May (Gast)


Lesenswert?

for (a=0;a<80;a++)
{
}

Sowas optimiert der Compiler raus, sobald optimieren eingeschaltet ist!
Etwas besser:

for(a=0;a<80;a++)  asm volatile ("nop");

noch etwas besser:

volatile unsigned char a;
for(a=0;a<80;a++);

Oder noch viel besser:

Die delay-Routinen der AVR-Libc 1.2.x in avr/delay.h benutzen.

Außerdem gebe ich Rufus recht, Dein Quelltext ist wirklich
grottenschlecht zu lesen.
ciao, Stefan.

von Daniel (Gast)


Lesenswert?

void warte(void)
{
delay_ms(10);

}
Sorry wegen dem schlechten Code.
Der ATmega128 hängt trotzdem in der Funktion. Kein Signal an den Ports.
Sobald warte(); raus ist geht es(ohne putchar). Hab auch die nop's
probiert.

Habe auch mal die putchar-Anweisung vor die while-Schleife gesetzt. Er
wiederholt ständig die 2, obwohl doch nur eine erscheinen dürfte. An
den Ports spielt sich gar nichts ab.

von Hans (Gast)


Lesenswert?

ich hatte des öfteren solche "lustigen" effekte... jetzt sind die
stütz-Cs richtiger verbaut und jetzt haut alles hin.. irgendwie ist der
mega128 da kritischer wie die im dil gehäuse... also ich würd mal (wenn
vorhanden) mit einem oszi die versorgungs-pins abklappern und schaun
was sich da so tut...

73

von Daniel (Gast)


Lesenswert?

Der Prozessor, der vorher auf der Platine war, lief einwandfrei. Habe
ihn gegen einen neuen gleichen Typs ausgetauscht, da der alte sich
nicht programmieren ließ. An der äußeren Beschaltung wurde nichts
verändert. Also solten die Stützkindensatoren doch in Ordnung sein.
Die Verbindungen scheinen ok zu sein.
Kann es etwas mit den Fusebits zu tu haben?

von Daniel (Gast)


Lesenswert?

Erst einmal danke an alle.
Meine Vermutung war richtig. Die Fusebit für den
103-Kompatibilitätsmodus war programmiert. Wirklich dumm, daß diese im
Auslieferungszustand programmiert ist. Dachte ich mache nichts falsch,
wenn ich die programmiert lasse.
Dies führt wohl bei 128-Programmen zu oben beschriebenen Problemen.

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.