1. Funktionsaufruf alles wunderbar 2. Funktionsaufruf => Absturz

OP #2217149
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
}
Angehängte Dateien:
OP #2220084
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
}

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