Forum: Mikrocontroller und Digitale Elektronik SPI an ATMEGA16 in ASM


von Sven B. (svenba)


Lesenswert?

Hi!
Ich weiss, es gibt schon 1000 Thread mit diesem Thema.
Ich habe mir wahrscheinlich jeden schon zwei Mal durch gelesen und 
ändere schon seit drei Tagen an meinem Programm rum aber ICH KRIEG ES 
NICHT HIN!!

Ich bitte um Hilfe!!
Ich will ein EA DOGM132-5 Display an einem ATMega16 über SPI in ASM 
ansteuern.
1
SPI_INIT:
2
        push temp1
3
        ldi temp1, (0<<SPI2X)
4
        out spsr, temp1
5
6
        ldi temp1, 0xFF    ; Output = SCK, MOSI,... (ALLES!!!)
7
        out DDRB, temp1
8
9
    ldi temp1, (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)
10
    
11
                                
12
        out SPCR, temp1
13
        out SPDR,temp1            ; Dummy Daten, um SPIF zu setzen
14
15
        pop temp1
16
        ret
17
18
; ---------------------- per SPI senden ------------------
19
20
Kommando_per_SPI:            ; in disdata1 stehen die Daten
21
        push temp1
22
        push disdata1          ; DENKE DRAN: CS,A0 setzen/löschen
23
      
24
25
        cbi PORTD, CS
26
        cbi PORTD, A0
27
      ;  sbi PORTD, LCD_RESET
28
        ldi temp1, (1<<MSTR)
29
        out SPCR, TEMP1
30
31
        
32
        out SPDR, disdata1
33
34
warte_SPI:  ;  in temp1, SPSR
35
        sbis SPSR, SPIF      ; solange, bis Interrupt aus!!
36
        
37
        rjmp warte_SPI
38
;        rcall warte_1ms
39
        
40
41
        in temp1, spdr
42
        
43
      
44
45
        pop disdata1
46
        pop temp1
47
        
48
        ret
49
50
51
;===============================================================================
52
53
Daten_per_SPI:
54
        push disdata1
55
        push temp1
56
        
57
        cbi PORTD, CS
58
        sbi PORTD, A0
59
  ;      sbi PORTD, LCD_RESET
60
61
        ldi temp1, (1<<MSTR)
62
        out SPCR, TEMP1
63
        
64
        
65
        
66
        out SPDR, disdata1
67
68
warte_SPI2:  ;  in temp1, SPSR
69
        sbis SPSR, SPIF      ; solange, bis Interrupt aus!!
70
        rjmp warte_SPI2
71
72
        
73
        in temp1, spdr
74
      ;  cbi PORTD, A0
75
        
76
77
;        rcall warte_1ms        
78
        pop temp1
79
        pop disdata1
80
        
81
        ret

Könnt ihr mir sagen, was da falsch läuft ???
Hardware hab ich schon 8 Milliarden mal durch gepiept.
Habe schon versucht das Display beim programmieren des ATMega über ISP 
abzunehmen oder dran zu lassen, daran liegts auch nicht...
Wenn ich MOSI und SCK beim uC-Programmieren dran lasse, hab ich kurz 
zwei dreimal einen schwarzen Bildschirm...

HILFE!!!

von Stephan H. (stephan-)


Lesenswert?

tja jetzt wissen wir aber immer noch nicht, was nicht geht.
Sind Balken da , fehlen Zeichen, kommt gar nichts oder was ?
Kontrast wird angeschlossen sein ..oder ?
Ist es initialisiert ? Oder sind nur 1 oder 2 Balken da ?
Fragen über Fragen.

von holger (Gast)


Lesenswert?

>        ldi temp1, (1<<MSTR)
>        out SPCR, TEMP1

Was soll denn der Unsinn?
Damit hast du SPE gelöscht. SPI abgeschaltet.

von Sven B. (svenba)


Lesenswert?

Oh, ok, hast ja Recht...

Das Display bleibt aus(zeigt nichts an), bis auf das kurze 
"Komplett-Schwarz" während der uC-Programmierung, wenn ich die 
SPI-Leitungen dran lasse.
Kontrast läuft doch über Hardware, oder was meinst du? Die 8 Cs hab ich 
angeschlossen.
Anscheinend wird es noch nicht einmal initialisiert.

von Sven B. (svenba)


Lesenswert?

@ holger:

Kannst mir das mal bitte erklären?

Werds mal löschen, wahr irgendwann mal ne fixe Idee, um sicher zu gehen, 
dass der uC auch bei ungenutztem /SS auf Mstr bleibt... Unfug??

von holger (Gast)


Lesenswert?

>Werds mal löschen, wahr irgendwann mal ne fixe Idee, um sicher zu gehen,
>dass der uC auch bei ungenutztem /SS auf Mstr bleibt... Unfug??

Ja. Setz SS auf Ausgang dann bleibst du auch Master.

von Sven B. (svenba)


Lesenswert?

Sooooo, habs so gemacht und "es" ist zum Leben erwacht.... EENDLICH!!!
Hab zwar nicht ganz das Bild, welches ich wollte aber das sollte dann ja 
klappen!

Hab fast Pippi in den Augen!! ;-)

Jetzt hab ich die Platine hoch genommen und alles ist wieder tot... Was 
sagt mir das? Die Sch... Buchsenleisten haben nicht immer Kontakt und 
ich hab mit der Messspitze beim Messen den Druck hergestellt, den er 
brauchte... Zum kotzen!

...Lötkolben heizt grad auf, Ihr seid Spitze!!
Muss dann "nur" noch einen vernünftigen Transfer meiner Daten hin 
kriegen...

von Sven B. (svenba)


Lesenswert?

Hmmm... Umgelötet! Nach Neustart zeigt er wilde Pixel an und dann 
verblasst alles.... Sieht nach Kondensatorproblem aus, welche habt ihr 
da genommen? Hab 1uF Tantal genommen, sind die falsch??
Hat sich erledigt, einer war verpolt, der hat wohl die Spannung runter 
gezogen... Danke euch!!!

von Sven B. (svenba)


Lesenswert?

Habe jetzt das Problem, dass ich immer nur eine Spalte voll schreiben 
kann, auch wenn ich über 132 Werte zum Display schicke.
Diese 132 Werte werden aber richtig angezeigt...
Muss ich dem Display nach der Spalte sagen, dass er in die nächste 
springen muss??

von Stephan H. (stephan-)


Lesenswert?

bei Displays muß man sich für gewöhnlich um alles selber kümmern.
Also auch Zeilen und Spaltenumschaltung.

von Sven B. (svenba)


Lesenswert?

Naja, bei den parallelen, die ich bis jetzt eingesetzt hab, liefen die 
Daten einfach in der nächsten Zeile weiter.
Wie wäre denn ein Befehl, um ihn in die nächste Spalte springen zu 
lassen?
Frage mich immer noch, wie ich beim DOGM132-5 die Zeilenbreite /höhe usw 
einstelle, hab die Init aus dem Datenblatt übernommen... Jemand nen 
Tipp?

von Stephan H. (stephan-)


Lesenswert?

> Naja, bei den parallelen, die ich bis jetzt eingesetzt hab, liefen die
> Daten einfach in der nächsten Zeile weiter.

genau, nur das manchmal zB. bei 4 Zeiligen eine Zeile dazwischen frei 
bleibt, wenn man sich nicht darum kümmert.

Meine Vermutung:
nach der 131sten Spalte sollte die nächste Page anfangen.
Also Page umschalten. Datenblatte Seite 5.

Habe mit dem Ding noch nicht gearbeitet.

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.