µC hängt sich auf

Gast #1335067
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
Gast #1335117
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
Gast #1335140
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
#1335172
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.
Gast #1335228
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.