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


von Uwe (Gast)


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:
1
int main(void){
2
...
3
DDRD = (1<<DDD5);
4
...
5
}

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

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

von ... .. (docean) Benutzerseite


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?

von Uwe (Gast)


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

von Uwe (Gast)


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

von Stefan B. (stefan) Benutzerseite


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?

von Uwe (Gast)


Angehängte Dateien:

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:
1
inline void  noop(void){
2
  asm volatile ("nop");
3
}
4
5
ISR(TIMER0_OVF_vect){
6
  check_button();
7
}
8
9
ISR(TIMER1_COMPA_vect){
10
  noop();
11
}
12
13
ISR(TIMER1_COMPB_vect){
14
  noop();
15
}
16
17
ISR(TIMER2_COMP_vect){
18
  PORTD ^= (1<<PD5);
19
}

Angehängt mal die aktuelle Version...

  Uwe

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Uwe (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von noips (Gast)


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.

von Uwe (Gast)


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

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.