Probleme mit LCD-Display und SPI Übertragung

OP #5792225
Lesenswert?

Hallo,

ich habe ein Problem beim SPI kombiniert mit einem LCD-Display. Also ich 
benutze ein Atmega328p mit 4 Schieberegistern die ich über SPI mit Daten 
beschreibe und noch ein LCD-Display was ich im 4 bit Modus betreibe. 
Programmieren tue ich in C.
Also grob ist das Programm dazu da, um in die Schieberegister die 
Uhrzeit und in das LCD-Display Temperatur und Datum zu schreiben.
Allerdings schreibt der Atmega, sobald ich lcd_init() aufrufe, nichts 
mehr in die Schieberegister und auch nicht in das LCD-Display.
Die Schieberegister sind per SPI verbunden und das Display ist wie folgt 
verbunden:

RS       PORTD4
RW       PORTD1
E        PORTD0
DATA4    PORTC0
DATA4    PORTC1
DATA4    PORTC2
DATA4    PORTC3

Im Anhang ist die LCD Libary.

Mein Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "lcd.h"
4
#include "lcd.c"
5

6
volatile uint8_t a1 = 0;
7
volatile uint8_t a2 = 0;
8
volatile uint8_t b1 = 0;
9
volatile uint8_t b2 = 0;
10
volatile uint8_t c1 = 0;
11
volatile uint8_t c2 = 0;
12
volatile bool anzeigen = true;
13

14

15
uint8_t zahl[10] = {0b10111011, 0b00001010, 0b01110011, 0b01011011, 0b11001010, 0b11011001, 0b11111001, 0b00001011, 0b11111011, 0b11011011};
16

17
int main(void)
18
{
19
  lcd_init(LCD_DISP_ON);
20
  lcd_clrscr();
21
  lcd_puts("Hello, World");
22
  DDRB |= (1<<PORTB2) | (1<<PORTB3) | (1<<PORTB5);
23
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPI2X) | (1<<CPOL) | (1<<CPHA);
24
  SPSR = (1<<SPI2X);
25

26
  
27
  TCCR1B = (1<<WGM12) | (1<<CS12);
28
  OCR1A = 62499;
29
  TIMSK1 = (1<<OCIE1A);
30

31
  sei();
32
  while (1)
33
  {
34
  }
35
}
36

37
ISR(TIMER1_COMPA_vect)
38
{
39
  c2++;
40
  if (c2>9) {
41
    c2=0;
42
    c1++;
43
    if (c1>5) {
44
      c1=0;
45
      b2++;
46
      if (b2>9) {
47
        b2=0;
48
        b1++;
49
        if (b1>5) {
50
          b1=0;
51
          a2++;
52
          if (a2>9) {
53
            a2=0;
54
            a1++;
55
          }
56
          else if (a1>1 && a2>3) {
57
            a1=0;
58
            a2=0;
59
          }
60
        }
61
      }
62
    }
63
  }
64
  if (anzeigen)
65
  {
66
    SPDR = zahl[b1];
67
    while(!(SPSR & (1<<SPIF)));
68
    SPDR = zahl[b2];
69
    while(!(SPSR & (1<<SPIF)));
70
    SPDR = zahl[c1];
71
    while(!(SPSR & (1<<SPIF)));
72
    SPDR = zahl[c2];
73
    while(!(SPSR & (1<<SPIF)));
74
    PORTB |= (1<<PORTB2);
75
    PORTB &= ~(1<<PORTB2);
76
  }
77
}
Angehängte Dateien:
Persönliche Seite #5792239
Lesenswert?

Leon W. schrieb:
> Allerdings schreibt der Atmega, sobald ich lcd_init() aufrufe, nichts
> mehr in die Schieberegister und auch nicht in das LCD-Display.

Wird denn überhaupt irgendwelcher Code nach dem Aufruf dieser Funktion 
ausgeführt, oder hängt der µC möglicherweise in dieser Funktion?

Häng' mal 'ne Leuchtdiode an einen freien Pin und steuer die an 
verschieden Stellen in Deinem Programm an - vor dem Aufruf von 
lcd_init() einschalten, unmittelbar danach wieder ausschalten.

Ich nehme an, daß Du keinen Debugger hast, mit dem Du dem Programm 
zusehen könntest, das ist ja bei AVRs eher umständlich (da da der recht 
teure Atmel-ICE nötig ist).
Gast #5792242
Lesenswert?

Leon W. schrieb:
> Die Schieberegister sind per SPI verbunden und das Display ist wie folgt
> verbunden:
>
> RS       PORTD4
> RW       PORTD1
> E        PORTD0
> DATA4    PORTC0
> DATA4    PORTC1
> DATA4    PORTC2
> DATA4    PORTC3

Sicher?

Ich würde es mal mit Data7, Data6, Data5 und Data4 versuchen.

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