Forum: Mikrocontroller und Digitale Elektronik 1. Funktionsaufruf alles wunderbar 2. Funktionsaufruf => Absturz


von Ralf G. (sense)


Angehängte Dateien:

Lesenswert?

Ich versuche ein Menü für meinen ATmega8 mit DOGM163 zu bauen. Display 
läuft auch wunderbar. Nur wenn ich meine Funktion zum Display 
aktualisieren ein zweites Mal aufrufe, hängt sich der ATmega8 auf. Das 
DOGM163 wird via Hardware SPI des ATmega gesteuert. Der ATmega läuft mit 
16MHz und hat an PB0 und PB1 eine LED zum debuggen.
Eventuell könnte jemand bitte mal über meinen Code schauen.
Hier die zwei vermutlichen Übeltäter und im Anhang ist das gesamte 
Projekt.
1
void print_menu()
2
{
3
  uint8_t menu_pos2 = menu_pos;
4
  for(uint8_t n = 0; n < 3; n++)
5
  {
6
    print_menu_entry(n,menu_pos2);
7
    menu_pos2++;
8
    if(menu_pos2 >= MENU_SIZE)
9
    {
10
      menu_pos2 = 0;
11
    }
12
  }
13
}
14
15
void print_menu_entry(uint8_t line, uint8_t entry)
16
{
17
  display_pos(line,0);
18
  switch(entry)
19
  {
20
    case 0:
21
      display_puts("Eintrag 1");
22
    break;
23
    case 1:
24
      display_puts("Eintrag 2");
25
    break;
26
    case 2:
27
      display_puts("Eintrag 3");
28
    break;
29
    case 3:
30
      display_puts("Eintrag 4");
31
    break;
32
    case 4:
33
      display_puts("Eintrag 5");
34
    break;
35
  }
36
}

von Εrnst B. (ernst)


Lesenswert?

Ohne den Rest-Code gesehen zu haben: Ram/Stack-Problem?

pgmspace.h und dessen PSTR-Makro helfen.

von Ralf G. (sense)


Lesenswert?

Ich habe nun alle strings mit PSTR übergeben. Das löst das Problem 
allerdings auch nicht. Nach etwas herumprobieren und auskommentieren, 
habe ich herausgefunden, dass der eigentlich Knackpunkt wohl die 
spi_send_byte() Funktion ist. Warum funktioniert die ein paar Mal, weil 
das Display wird ja initialisiert und danach plötzlich nicht mehr?
1
#include "../header/spi.h"
2
void spi_init()
3
{
4
  CSB_DDR |= (1<<CSB_PIN);
5
  CSB_PORT |= (1<<CSB_PIN);
6
  /* Set MOSI and SCK output, all others input */
7
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
8
  /* Enable SPI, Master, set clock rate fck/16 */
9
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
10
  SPSR = (1<<SPI2X);
11
}
12
13
void spi_send_byte(uint8_t data)
14
{
15
  CSB_PORT &= ~(1<<CSB_PIN);
16
  /* Start transmission */
17
  SPDR = data;
18
  /* Wait for transmission complete */
19
  while(!(SPSR & (1<<SPIF)));
20
  CSB_PORT |= (1<<CSB_PIN);
21
  _delay_us(45);
22
  if (data == 0x1 || data == 0x2 || data == 0x3)
23
  {
24
    _delay_us(45);
25
  }
26
}

von Ralf G. (sense)


Lesenswert?

Problem hat sich erledigt. Ich hatte den Fehler gemacht und einen 
anderen Pin als SlaveSelect genutzt. Der ATmega will aber das sein 
SS-Pin im Mastermodus ein Ausgang ist. Also ganz dummer Fehler 
meinerseits :/.

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.