Forum: Mikrocontroller und Digitale Elektronik Mega324A reset Problem


von Marcel B. (marcel_b)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit einem Programm. Prinzipiell benötige ich eine 
SoftSPI für die Anbindung weiterer Peripherie. Allerdings führt diese zu 
einem Reset meiner Hardware! Ich habe das ganze mal auf wesentliche 
zusammengefasst und als Anhang hochgeladen!

Anbei die Auszüge der wichtigsten Funktionen:
1
int main()
2
{     
3
  // Erlaubt globale Interrupts
4
  SOFTSPI_Init();
5
6
  for(char i = 0; i<255; i++)
7
    SOFTSPI_WriteRead_Synchron(0x00, SOFTSPI_MODE_1);
8
9
  while(1);
10
  
11
}

Setze ich einen Breakpoint auf die while-Schleife, und einen auf das 
Softspi_Init, hält das Programm immer wieder an der Softspi-Stelle, das 
while wird nie erreicht...

Das ist die WriteRead-Methode:
1
unsigned char SOFTSPI_WriteRead_Synchron(unsigned char dataout, char spi_mode)
2
{
3
  SOFTSPI_Clock_Mode(spi_mode);
4
  _delay_us(1);
5
  
6
  uint8_t datain=0;
7
  //das Byte wird Bitweise nacheinander gesendet, MSB zuerst
8
  for (uint8_t a=8; a>0; a--)
9
  {                
10
    datain<<=1;                      //Schieben um das Richtige Bit zusetzen
11
12
    // Daten schreiben Versuch 1
13
    if( ( spi_mode & 0x01 ) == 0x00 )    // CPHA = 0 --> Daten rauschreiben vor 1ten Flanke!
14
    {
15
      if (dataout & 0x80)
16
        SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT;      //Set Output High
17
      else
18
        SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT;      //Set Output Low
19
    }
20
21
    _delay_us(1);
22
23
    // Erste Flanke!
24
    if( ( spi_mode & 0x02 ) != 0x00 )    // CPOL = 1
25
      SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT;        // CPHA = 1 --> Erste Flanke = Fallende Flanke
26
    else
27
      SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT;        // CPHA = 0 --> Erste Flanke = Steigende Flanke
28
      
29
    // Daten schreiben Versuch 2
30
    if( ( spi_mode & 0x01 ) != 0x00 )    // CPHA = 1
31
    {
32
      // Daten rauschreiben nach 1ten Flanke!
33
      if (dataout & 0x80)
34
        SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT;      //Set Output High
35
      else
36
        SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT;      //Set Output Low
37
    }
38
    
39
    _delay_us(1);
40
    
41
    // Daten lesen Versuch 1
42
    if( ( spi_mode & 0x01 ) == 0x00 )    // CPHA = 0
43
    {  
44
      // Daten lesen nach erster Flanke!
45
      if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT)      //Lesen des Pegels
46
        datain |= 1;
47
    }
48
      
49
    // Zweite Flanke!
50
    if( ( spi_mode & 0x02 ) != 0x00 )    // CPOL = 1
51
      SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT;        // CPHA = 1 --> Zweite Flanke = Steigende Flanke
52
    else
53
      SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT;        // CPHA = 0 --> Zweite Flanke = Fallende Flanke
54
55
56
    _delay_us(1);
57
58
    // Daten lesen Versuch 2
59
    if( ( spi_mode & 0x01 ) != 0x00 )    // CPHA = 1
60
    {  
61
      // Daten lesen nach erster Flanke!
62
      if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT)      //Lesen des Pegels
63
        datain |= 1;
64
    }
65
66
    dataout<<=1;                    //Schiebe um nächstes Bit zusenden
67
  }
68
69
  return datain;
70
}


Sitze da nun schon 2 Tage dran und weiß nichtmehr weiter... Kann mir da 
wer helfen?

von R2D2 (Gast)


Lesenswert?

Du hast die Zählvariable als char angelegt und deren Wertebereich geht 
von -127 bis +128 und bleibt damit immer <255.

Du musst unsigned char benutzen.

von Marcel B. (marcel_b)


Lesenswert?

Ah, danke für die Antwort. Daran lag es jedoch nicht. Bei mir tritt das 
Problem auf, wie ich nun herausfand, das der Watchdog beim Debugging 
gestartet wird und dieser den Reset durchführt. Der WD lässt sich erst 
durch das Unterbrechen der Spannungsversorgung des Chips deaktivieren, 
wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert 
den WDT nicht.

Kann damit prinzipiell leben, schön finde ich allerdings nicht. Habe 2 
AVR Dragons, beide zeigen das gleiche Verhalten. Arbeite mit AVR Studio 
5.1!

von spess53 (Gast)


Lesenswert?

Hi

>Der WD lässt sich erst
>durch das Unterbrechen der Spannungsversorgung des Chips deaktivieren,
>wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert
>den WDT nicht.

Zufällig WDTON-Fuse gesetzt?

MfG Spess

von Peter D. (peda)


Lesenswert?

Marcel Behlau schrieb:
> wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert
> den WDT nicht.

"WDE is overridden by WDRF in MCUSR. This means that WDE is always set 
when WDRF is set. To clear WDE, WDRF must be cleared first."

Der WD sollte immer erst nach Abschluß der Entwicklung implementiert 
werden. Sonst verursacht oder versteckt er Fehler.

von Marcel B. (marcel_b)


Lesenswert?

Hey,

habe jetzt im MCUSR Register das WDRF Bit gelöscht und dann den WD 
ausgeschaltet. Resets treten nun nichtmehr auf. Danke schonmal für die 
Hilfe! Eine Erklärung, warum das WDRF mal gesetzt ist und mal nicht, 
habe ich allerdings noch nicht gefunden =/

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.