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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Leon W. (leonw_04)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß das ist auch nicht die veränderte

von Michael U. (amiga)


Bewertung
1 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.