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 | }
|