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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.