Mega324A reset Problem

OP #3192550
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?
Angehängte Dateien:
OP #3194528
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!
Gast #3194549
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren