www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega8: Ausgang an Port D verhindert Displayanzeige per TWI an Port C


Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

für meine Studienarbeit baue ich gerade eine kleine Hardware, deren 
Aufgabe es ist, eine Spiegelreflex und zwei Laser miteinander zu 
synchronisieren.

Basis ist ein Mega8 @10MHz.

Als Schnittstelle für den Benutzer gibt es mehrere Taster (hardwäremäßig 
entprellt mit Schmitt-Triggern). Ein Poti am ADC soll die Leistung der 
Laser regeln. Außerdem ein Display (Batron BTHQ 21605V-FSRE-I2C-COG), 
angeschloßen über TWI.

Einstellbar sollen die Pulsdauer der Laser, der Pulsabstand zwischen 
Laser 1 & 2 und die Anzahl an Wiederholungen der Sequenz sein. Außerdem 
gibt es einen Modus, in dem die Laser per PWM geregelt im Dauerbetrieb 
werden.

Der Timer0 Overflow Interrupt kümmert sich um eine regelmäßige Abfrage 
der Taster.

Timer2 soll im CTC Modus eine genaue Zeitbasis liefern. Der Compare 
Match Interrupt togglet dabei Pin T1 (PD5), der gleichzeitig als Clock 
für Timer1 verwendet wird. Die beiden Compare Match Interrupts von 
Timer1 kümmern sich dann um das Ein- und Ausschalten der Laser. Die 
Kamera wird davor und danach "manuell" geschaltet, da sie zu langsam 
ist.


Soweit die Theorie.......................

Das Menü zum Einstellen der Werte hat vorgestern funktioniert. Das 
Display hat alles brav angezeigt.

Gestern wollte ich mich an die Programmierung der Timer 1 & 2 machen. In 
meiner Initialisierungsphase habe ich daraufhin eingefügt:
int main(void){
...
DDRD = (1<<DDD5);
...
}

Außerdem noch die Einstellungen der Timer. Unter anderem:
ISR(TIMER2_COMP_vect){
  PORTD ^= (1<<PD5);
}

Plötzlich hat das Display nichts mehr angezeigt. (Das hängt an PC4/SDA 
und PC5/SCL).

Ich bin erstmal von einem Hardwarefehler ausgegangen (hab leider schon 
mehrere Spannungsregler gebrutzelt, beim Versuch, das Display zum Laufen 
zu bekommen...). Hab den halben Tag damit zugebracht, auf der Platine 
nach Lötbrücken, etc. zu suchen.

Erst dann kam mir die Idee, das Display mal aufs Breadboard zu stecken 
und das Testprog, das noch auf meinem Mega32 war, zu benutzten. 
Natürlich war mit dem Display und der Spannungsversorgung alles i.O.

Also Softwarefehler...

Nachdem ich die Zeile mit dem DDRD auskommentiert, kompiliert und 
geflasht hab ging das Display auch am Mega8 wieder einwandfrei.



Kann mir einer von euch erklären, wieso ein Eintrag im DDRD die 
Funktionalität vom TWI (Teil von Port C) beeinflusst?

Ich bin inzwischen mit meinem Latein am Ende. Nicht, dass ich Latein 
könnt ;)

Gruß,

  Uwe

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe schrieb:
> int main(void){
> ...
> DDRD = (1<<DDD5);
> ...
> }


da fehlt ein | oder bin ich jetzt falsch...

EDIT:
upps hatte nicht gesehen das das unterschiedliche Ports sind... dann kA 
was da schief läuft...

Pullup sind da? Oszi und nachgemessen?

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist während der Initialisierung. Außerdem sollen alle anderen Pins = 
0 sein.

Ob ich also DDRD (der defaultmäßig 0x00 ist) mit "= 5" oder "|= 5" 
beschreibe - es wird der gleiche Wert geschrieben. Nur spare ich mir das 
auslesen von DDRD.


Aber trotzdem Danke fürs drüberschaun.

  Uwe

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pullups sind da - sonst würde es ja auch nicht funktionieren, wenn ich 
DDRD nicht veränder.

Oszi wird schwierig. Keins in Reichweite....

  Uwe

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Timer2 soll im CTC Modus eine genaue Zeitbasis liefern. Der Compare
> Match Interrupt togglet dabei Pin T1 (PD5), der gleichzeitig als Clock
> für Timer1 verwendet wird. Die beiden Compare Match Interrupts von
> Timer1 kümmern sich dann um das Ein- und Ausschalten der Laser.

An Code ist ja noch weniger als ein Codefetzen da. Ich rate mal: Fehlt 
die ISR für beiden "Compare Match Interrupts von Timer1" und der Atmega8 
fällt beim Auftreten des Interrupts in den Reset?

Autor: Uwe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss gestehen, dass ich Timer2 (und damit Timer1) noch gar nicht in 
Betrieb genommen, sondern nur TOP für Timer2 und die Compare Register 
für Timer1 geschrieben habe. Insofern sollte es zu keinen Interrupts 
kommen, die auf Timer1 oder Timer2 basieren.

Die anderen ISR habe ich allerdings schon als Dummy-Funktionen 
implementiert:
inline void  noop(void){
  asm volatile ("nop");
}

ISR(TIMER0_OVF_vect){
  check_button();
}

ISR(TIMER1_COMPA_vect){
  noop();
}

ISR(TIMER1_COMPB_vect){
  noop();
}

ISR(TIMER2_COMP_vect){
  PORTD ^= (1<<PD5);
}

Angehängt mal die aktuelle Version...

  Uwe

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe im Moment nichts verdächtiges und werde das (abgespeckte) 
Projekt heute abend auf einer Hardware testen.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Stefan.

Aber: Lösung gefunden. Ich scheine gestern bei der Suche nach der 
kaputten Spannungsquelle zwischen PD5 und PD6 ne Brücke gelötet zu 
haben. An PD6 hängt n Schmitt-Trigger, der das immer auf Low zieht. 
Irgendwie hat ihn das dann gestört.

Brücke getrennt -> Display tut.

Das nächste Mal lerne ich Eagle und trete Lochrasterplatinen in die 
Tonne... :-)

Gruß,

  Uwe

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst (und wirst nach Murphy) dich auch bei selbstgeätzten Platinen 
verlöten :)

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das nächste Mal lerne ich Eagle und trete Lochrasterplatinen in die
>Tonne... :-)

Wenn Eagle alles ersetzen würde, würde ich auch alles mit Eagle machen. 
Aber du musst ja auch Maske drucken, belichten, ätzen, bohren. Da ist 
fädeln auf Lochraster oft doch viel besser.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Außer ich mach die Abstände zwischen den Bauteilen groß genug 
für einen Grobmotoriker ;)


Das schlimme ist: hardware-technisch war alles einwandfrei beim ersten 
Aufbau. Dann kamen die Änderungen, die durch anschließende 
Planungsänderungen nötig wurden. Und die Geschichte nahm ihren Lauf...

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.