Forum: Compiler & IDEs µC hängt sich auf


von Dira (Gast)


Lesenswert?

Hallo,
Ich habe das Problem das einige meiner Controller nicht laufen.
Es geht hier um AT90CAN128 als Modul. Drei Controllern funktioniert der 
Code auf anderen nicht.
Nun habe ich mir ein miniTest geschrieben und selbst das funktioniert 
nicht.
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
#define F_CPU 16000000UL
7
8
int main (void)
9
{
10
uint16_t iiCount = 0;
11
uint8_t iiTemp16 = 0;
12
DDRC = 0xff; 
13
14
while ( 1 )
15
{
16
    PORTC = iiTemp16;   
17
18
  iiTemp16++;
19
  for (iiCount=0; iiCount < 501 ; iiCount++)
20
  {
21
    //loop();  
22
    _delay_ms(1);
23
    
24
  }
25
  if ( iiTemp16 >=255 )
26
  {
27
    iiTemp16 = 0;
28
  }
29
}
30
}

Ich konnte schon herraus finden das an dieser Stelle die Delay-Funktion 
das Problem ist. nur ist die Frage warum ist doch eine offizielle, 
getestete Funktion.
Nun habe ich diese durch einen Funktion mit einem Timer ersetzt ( in 
meinem eigentlichen Programm ), aber auch dann geht es schief.
Ich vermute das es was mit dem Stack zu tun hat, aber warum geht es dann 
auf einigen ?
Würde mich freuen, wenn jemand Tipps oder Hinweise für mich hat.

MFG Dira

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Weiss der Controller, dass er mit #define F_CPU 16000000UL laufen soll? 
Sprich, ist die Hardware passend eingestellt (Clockfuses)?

von Dira (Gast)


Angehängte Dateien:

Lesenswert?

Ja weis er.
Im Anhang mal die Fuses und wie gesagt ich habe es mit mehreren 
gestestet, bei einigen geht es und Fuese sowie beschaltung sind bei 
allen gleich.
Gruß

von Oliver (Gast)


Lesenswert?

>Ich konnte schon herraus finden das an dieser Stelle die Delay-Funktion
>das Problem ist.

a) Wie genau äussert sich das "Problem"?
b) Wie hast du herausgefunden, das es durch die _delay()-Funktion 
verursacht wird?

Ich tippe eher auf Hardwareprobleme, z.B. Takterzeugung, u.ä.

Oliver

von Dira (Gast)


Lesenswert?

Wie im Code zu sehen habe ich dort einen Binären Zähler und dort sehe 
ich das er an "zufälligen" Punkten neu beginnt (restart, reset),
ich habe auch schon per Ozzi geschaut ob an Reset pin oder VCC Peaks zu 
sehen sind, aber nichts.

Und das Delay schuld ist, vermute ich weil wenn ich diese Funk nicht 
aufrufe läuft der Code durch, zwar schneller aber es geht.
Dann habe ich statt delay eine Timer genutzt ( ohne Funktionsaufruf ) 
und auch das Funktionierte
1
//Timer config 
2
TCCR1A=0x00;
3
TCCR1B=0x00;
4
TCNT1H=0x00;
5
TCNT1L=0x00;
6
ICR1H=0x00;
7
ICR1L=0x00;
8
OCR1AH=0x00;
9
OCR1AL=0x00;
10
OCR1BH=0x00;
11
OCR1BL=0x00;
12
OCR1CH=0x00;
13
OCR1CL=0x00;
14
// Timer/Counter 3 Interrupt(s) initialization
15
TIMSK3=0x00;
16
17
..main..
18
{ ..
19
u16 TimeMerker=TCNT3;
20
//_delay_ms()
21
  while( (TCNT3-TimeMerker) < 15625) {};
22
  TimeMerker=TCNT3;
23
// geht nach 1 sek weiter
24
}

in etwas so

und sobald das ganz komplexer wird ( funktionen aufrufen ... )
tut er nichts oder restartet dauernd.
Ich benutze wie geagt ein Modul die ganzen kleinen SMD-Bauteile kann ich 
schlecht analysieren... wenn ich aber direkt am Quarz messe ist der Takt 
ok

von Benedikt K. (benedikt)


Lesenswert?

Dira schrieb:

> Ich konnte schon herraus finden das an dieser Stelle die Delay-Funktion
> das Problem ist. nur ist die Frage warum ist doch eine offizielle,
> getestete Funktion.

Meckert der Compiler nicht darüber, dass der delay Funktion F_CPU nicht 
bekannt ist?
Bei mir macht er das, wenn F_CPU nicht vor #include <util/delay.h> 
definiert ist.

von Dira (Gast)


Lesenswert?

Nein, aber ich habe die Frequenz auch in den Projektdaten des AVR Studio 
eingeben, daher sind sie ja schon definiert....

von Dira (Gast)


Lesenswert?

Ich denke auch nicht unbedingt das es delay ist (wie gesagt durch timer 
ersetzt...)
wie könnte man den fest stellen ob der µC Fehlerhaft ist ?? (also Stack 
usw.)
beim Flash verifi stimmt alles

von Oliver (Gast)


Lesenswert?

_delay() enthält nichts anderes als etwas "ausgefuchstere" Schleifen. 
Das kann keine Einfluß auf die Funktion des Programms haben.

Wenn der Peozessor resetted, sezt der ein Flag im Statusregister. Was 
steht denn da drin?

Wenn es kein Reset ist, kann es auch eine Interrupt ohne ISR sein.

Oliver

von kurz (Gast)


Lesenswert?

Gibts einen Schaltplan dazu ?

von Dira (Gast)


Lesenswert?

http://alvidi.de/data_sheets/schaltplan.pdf
und die Herrstellerseite zum Modul
http://alvidi.de/avr_modul.html

Ich habe des Modul von aussen mit vcc 5+ und gnd beschlaten, sowie led 
mit vorwiederstand an port C

von Michael U. (amiga)


Lesenswert?

Hallo,

ich sehe da einen Mega128A, oben schreibst Du:
>Es geht hier um AT90CAN128 als Modul.

Ja, wie nun?

Gruß aus Berlin
Michael

von Dira (Gast)


Lesenswert?

Danke Michael du hast recht.
Die ist der Link:
http://alvidi.de/avr_modul_can.html
und dort findet man auch den Schaltplan.

von Dira (Gast)


Lesenswert?

So habe ein neues Modul und dieses funktionniert ...
ich Tippe also einfach mal auf einen Defekt des µC oder des Moduls

Danke an die Helfenden und Fragenden

Gruß Dira

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.