Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD-Display und SPI Übertragung


von Leon W. (leonw_04)


Angehängte Dateien:

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
}

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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).

von Arduinoquäler (Gast)


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.

von Leon W. (leonw_04)


Lesenswert?

Also die Led geht nicht an, wahrscheinlich hängt er sich das irgendwo 
auf.
Ich benutze ein Usbasp halt ohne JTAG nur mit ISP

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, laut lcd.h erwartet er ja das Display auch an anderen Pins...
Da solltest Du wohl die Beschreibung auch lesen.

Gruß aus Berlin
Michael

von Leon W. (leonw_04)


Lesenswert?

Ich weiß das ist auch nicht die veränderte

von Michael U. (amiga)


Lesenswert?

Hallo,

Leon W. schrieb:
> Ich weiß das ist auch nicht die veränderte

und warum postet Du etwas, das Du ganicht so nutzt? Ich bin da dann 
raus...

Gruß aus Berlin
Michael

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.