www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik S65 Display - bei PWM bricht Kommunikation zusammen


Autor: S65_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich betreibe ein Siemens S65 Display mit der glcd-lib per SPI.

Das Display hängt an den entsprechenden Leitungen meines Mega644P:
- LCD_DAT   an MOSI
- LCD_CLK   an SCK
- LCD_CS    an SS
- LCD_RESET an PB0
- LCD_RS    an PB2

Funktioniert auch alles wunderbar mit der Ansteuerung. Nur jetzt wollte 
ich eine PWM in Betrieb nehmen und plötzlich bricht das Display 
zusammen.

Mein Codeschnipsel
  glcdDisplayInit();
        printString("String");

  DDRB |= (1<<PB3);
  DDRD |= (1<<PD7);
...

  // Timer 0 A für PWM
  //TCCR0A |= (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
  //TCCR0B |= (1<<CS01) | (1<<CS00);
  //TIMSK0 |= (1<<OCIE0A);
  //OCR0A  =  252;

  // Timer 2 A für PWM
  TCCR2A |= (1<<COM2A1) | (1<<WGM21) | (1<<WGM20);
  TCCR2B |= (1<<CS21) | (1<<CS20);
  TIMSK2 |= (1<<OCIE2A);
  OCR2A  = 200;

Wie ihr seht, hab ich es schon mit Timer 1 und 2 versucht, hab einfach 
ne LED am Vorwiderstand dran. Die PWM funzt auch (sieht man an der LED).

Ich habe auch schon versucht das Display in Ruhe initialisieren zu 
lassen (2 sek Pause bis sei()). Hilft nix.

Symptom am LCD: Bild "blendet" aus (~0.5 s), dann leuchten alle Pixel, 
dann kommt das Bild wieder und es blendet wieder aus usw.

Stört der Timer die SPI-Kommunikation? Bin ratlos...

Autor: S65_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und außerdem funktioniert meine ISR bei TIMER1_COMPB nicht mehr, das war 
mein Zeitgeber...

Was ist an der PWM-Initialisierung falsch ??

Autor: asdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob's mit Deinem Problem zusammenhängt kann ich aus Codeschnipseln ohne 
Kontext leider nicht erkennen und alle Effekte erklärt es auf keinen 
Fall:

Es gibt vom S65-Display mindestens 3 verschiedene Typen (LPH88,LS020 und 
L2F50) und mein L2F50 nimmt es einem übel, wenn man das Chipselekt zu 
lange aktiviert (führt zu flimmernden Streifen oder Bildausfall, je nach 
Dauer). Das trat bei mir durch Interrupts (liefen aber teilweise relativ 
lange) während des Bildaufbaus auf. Ich konnte es nur durch Einbau von 
Interruptsperren (natürlich mit Pausen) in die Bibliothek beseitigen.

Die Frage nach dem Fehler bei der PWM-Initialisierung ließe sich 
einfacher beantworten, wenn man wüsste was Du einzustellen 
beabsichtigst.

Autor: S65_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll später mehrere HighPower-LED's dimmen. Aber das ist in dem Kontext 
ja auch egal. Zurzeit hängt halt nur ne LED als Feedback dran, aber die 
PWM stört mein ganzes Programm.
Wie gesagt, selbst mein Zeitgeber-Interrupt, der alle 100ms aufgerufen 
werden sollte, läuft nicht mehr.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

S65_User schrieb:
>   // Timer 2 A für PWM

>   TIMSK2 |= (1<<OCIE2A);

hab jetzt zwar keine Unterlagen hier greifbar, aber Du gibst doch hier 
einen Interrupt frei?

Wenn ja, wozu und wo ist die ISR dazu?

AVR-Typ habe ich irgendwie nicht gelesen...

Gruß aus Berlin
Michael

Autor: S65_User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh nein, du hast recht... Das würde erklären, warum mein Timing 
zusammenbricht. Die PWM läuft mit ner hohen Frequenz.

Wenn ich ne PWM haben will, wie "starte" ich die dann? Läuft das 
automatisch los, nachdem ich die erforderlichen Register geschrieben 
habe?


Und wo wir gerade bei diesem Effekt sind: Was passiert bei der 
Programmausführung, wenn ich einen Interrupt freischalte, aber keine ISR 
dazu implementiert habe?


Schonmal danke an Michael, ich hab wieder den Wald vor lauter Bäumen 
nicht gesehen.

S65_User

Autor: Emperor_L0ser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
1. für eine PWM benötigst du keine ISR. D.h. du beschreibst deine 
Counter-Register wie gewohnt. Mit dem Einstellen des Prescalers fängt 
der Timer an zu laufen. Wenn du keine ISR schreibst, darfst die ISR 
natürlich auch nicht aktiviert werden (z.B. TIMSK2 |= (1<<OCIE2A); 
weglassen).

2. AFAIK startet der AVR sich neu, wenn du nen ISR-Vektor anspringst, wo 
sich keine ISR befindet. Dabei ist aber zu beachten, dass es sich nicht 
um einen echten Reset handelt, bei dem alle Register zurückgesetzt sind, 
sondern lediglich der Programmcounter bei 0x00 anfängt.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.