www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme Controller für die WordClock zu programmieren


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
ich habe mich heute mal hingesetzt und wollte anfangen das Programm für
meine Uhr zu schreiben.
Als erstes wollte ich das Schieberegister (IC6) probehalber mit einsen
und nullen füllen, aber alle Ausgänge blieben auf low.
Ich habe das gleiche Programm noch auf einem Arduino probiert und dort
hat es problemlos funktioniert.
(hier der Programmtext:
int main(){
  uint8_t arr[8]={0b00001000, 0b00000000, 0b00001000, 0b00000000,
0b00001000, 0b00000000, 0b00001000, 0b00000000};
  DDRB|=((1<<PIN2)|(1<<PIN3)|(01<<PIN5));  //PIN3 Eingang, PIN5 CLK,
PIN2 output enable
  for (int i=0;i<8;i++){
    PORTB&=~(1<<PIN3);    //PIN3 auf 0
    PORTB|=arr[i];      //PIN3 entsprechend arr[i]
    PORTB|=(1<<PIN5);    //schieben
    PORTB&=~(1<<PIN5);    //  "
  }
  PORTB|=(1<<PIN2);      //output enable
}

)

bei der Fehlersuche habe wollte ich alle PINs des µC als Ausgang und auf
high setzen, aber nur PC6, PC5, PC4 und PB2 sind tatsächlich auf 5V. Der
Rest ist bei 1,4V. Daher funktioniert wahrscheinlich auch das Ansteuern
der Schieberegister nicht.
Ich habe noch nicht alle Teile auf die Platine gelötet, aber eigentlich
sind alle notwendigen drauf. Ich habe sicherheitshalber mal ein Bild
angehängt.
Das Problem tritt nur auf, wenn ich den Controller auf der Platine von 
der Word Clock laufen lassen. Ich habe ihn mal auf ein Duemilanove 
gesteckt, wo er sich wie vorgesehen verhielt.
Mir ist klar, dass es einen fertigen Code gibt, aber ich würde das
Programm gerne selbst schreiben.
Kann mir jemand sagen, woran es liegen könnte?
Über Antworten wäre ich sehr dankbar.
Mit freundlichen Grüßen

Autor: Hannes H. (mui)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bom schrieb:
> int main(){
>   uint8_t arr[8]={0b00001000, 0b00000000, 0b00001000, 0b00000000,
> 0b00001000, 0b00000000, 0b00001000, 0b00000000};
>   DDRB|=((1<<PIN2)|(1<<PIN3)|(01<<PIN5));  //PIN3 Eingang, PIN5 CLK,
??? probier mal DDRB |= (1<<PB1)|(1<<PB5);
soweit ich weiss, kann man das DDR nicht mit PIN setzen, außerdem ist 
pin 3 nicht wie im kommentar auf eingang, sondern auf ausgang gesetzt. 
01<<PIN5 sieht auch irgendwie komisch aus. Was macht PIN2 bzw. PB2?
> PIN2 output enable
>   for (int i=0;i<8;i++){
>     PORTB&=~(1<<PIN3);    //PIN3 auf 0
PORTB &= ~(1<<PB3);
>     PORTB|=arr[i];      //PIN3 entsprechend arr[i]
>     PORTB|=(1<<PIN5);    //schieben
PORTB |= (1<<PB5);
ich denke auch hier sollte ein delay hin...
>     PORTB&=~(1<<PIN5);    //  "
PORTB &=~(1<<PB5);
>   }
>   PORTB|=(1<<PIN2);      //output enable
> }
>
> )
guck dir im tutorial erstmal an, wie portpins gesetzt werden. so wird 
das nix. ist für den anfang auch ein echt großes projekt...

Autor: bom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit Eingang meinte ich Eingang vom schieberegister nicht vom µC. Ist 
etwas missverständlich.
Ein delay braucht man meiner Meinung nach nicht, weil das Programm ja 
funktioniert, wenn ich es auf einem aduino duemilanove mit 16 MHz laufen 
lasse. Den Controller auf der Word Clock Platine lasse ich nur mit 8 MHz 
laufen, also müsste das das Schieberegister erst recht erkennen.
Das ist nicht mein erstes Projekt und mit portpins setzten hatte ich 
bisher noch nie Probleme. Also daran kann es nun wirklich nicht liegen.
Ich habe es sicherheitshalber mal so gemacht, wie du vorgeschlagen hast, 
aber die Ausgänge des Schieberegisters waren immernoch alle auf low.
Kannst du dir vielleicht denken warum die Pins auf 1,4 Volt sind, wenn 
ich sie auf high setze? der Code dazu:
int main(){
  DDRD=0xff;
  PORTD=0xff;
  DDRB=0xff;
  PORTB=0xff;
  DDRC=0xff;
  PORTC=0xff;
}
Wie gesagt sind nur PC6, PC5, PC4 und PB2 tatsächlich auf 5V und der 
Rest bei 1,4V.
grüße

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

JTAG-Fuse!

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG Fuse ist sicherlich ein Thema.
Aber das erklärt immer noch nicht die Pegel an den anderen Ausgängen.

Hast du kontrolliert, ob der Brennvorgang auch wirklich erfolgreich war?

Ansonsten gibt es noch irgendein Hardware Problem.
Sieht so aus, als ob dein µC nicht wegläuft.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib mal Deine SPI-Routine so, wie es üblich ist, also Ausgabe eines 
Bytes und nicht 8 Byte.

Man muß ja nicht absichtlich SRAM und Flash verschwenden.
Und obendrein ist das auch übersichtlicher, als dieses Array-Rumgemähre.

Und lies mal:
Antwort schreiben
Wichtige Regeln - erst lesen, dann posten!


Peter

Autor: bom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter: sorry für den Sourcecode im Text. Den Code kann man sicherlich 
effizienter gestalten, aber ich habe dieses Thema nicht aufgemacht um 
meine Code zu verbessern, sondern um Hilfe zu bekommen, warum der 
Controller sich unerwartet verhält.

ich benutze eine atmega168. Da dieser über kein JTAG verfügt, sollten 
die Fuses doch eigentlich kein Problem sein, oder?

@kbuchegg: Ich benutze einen USB-Prog mit AVR Studio und bekomme 
folgende Rückmeldung:
Entering programming mode.. OK!
Erasing device.. OK!
Programming FLASH ..      OK!
Reading FLASH ..      OK!
FLASH contents is equal to file.. OK
Leaving programming mode.. OK!
Das Brennen scheint also auch zu funktionieren.
Meinst du mit weglaufen des Controllers, dass er nicht gegen 
Versorgungsspannung geht?
Kann das an einem Kaputten Baustein, oder an einem Kurzschluss auf der 
Platine liegen?

Danke für eure Hilfe!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bom schrieb:

> Meinst du mit weglaufen des Controllers, dass er nicht gegen
> Versorgungsspannung geht?

Gebranntes Kind scheut das Feuer.
In einem anderen Thread haben wir gestern Fehler gesucht und hinten nach 
hat sich rausgestellt, dass der Threadersteller den Reset-Widerstand 
falsch eingebaut hat und der Prozessor nie aus dem Reset herausgekommen 
ist.

Wenn deine Ports mit dem Minimalprogramm nicht auf Ausgang und 1 gehen, 
dann läuft entweder der Prozessor nicht oder er ist defekt. Da du ihn 
programmieren kannst, tippe ich auf ersteres.

> Kann das an einem Kaputten Baustein, oder an einem Kurzschluss auf der
> Platine liegen?

Kurzschluss könnte auch noch sein.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bom schrieb:
> Wie gesagt sind nur PC6, PC5, PC4 und PB2 tatsächlich auf 5V und der
> Rest bei 1,4V.

Zeig dochmal den Schaltplan.


Peter

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bom schrieb:
> DDRD=0xff;
>   PORTD=0xff;
>   DDRB=0xff;
>   PORTB=0xff;
>   DDRC=0xff;
>   PORTC=0xff;

damit würde ich extrem vorsichtig sein
wenn du pech hast, hast du damit schon in paar IOs geschrottet.

die RTC hat schließlich auch einen Ausgang.
Wenn die gegeneinander treiben ist das nicht toll.

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

Bewertung
0 lesenswert
nicht lesenswert
hier ist der Schaltplan.
Da diese Platine schon mehrfach in Verwendung ist([[Word Clock Variante 
1]]), würde ich nicht auf einen Fehler im Aufbau tippen. Ich mach mich 
mal ran und suche nach Kurzschlüssen.

Autor: bom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurzschlüsse habe ich keine gefunden.

Vlad Tepesch schrieb:
> damit würde ich extrem vorsichtig sein
> wenn du pech hast, hast du damit schon in paar IOs geschrottet.

das stimmt natürlich...dann muss ich mir wahrscheinlich einfach mal nen 
neuen kaufen und dann nochmal versuchen. Oder gibt es eine Möglichkeit 
herauszufinden, ob IOs kaputt sind?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bom schrieb:
> as stimmt natürlich...dann muss ich mir wahrscheinlich einfach mal nen
> neuen kaufen und dann nochmal versuchen.

naja, die AVRs verkraften eine ganze Menge, ich würde mir eher Gedanken 
um die RTC machen.

> Oder gibt es eine Möglichkeit
> herauszufinden, ob IOs kaputt sind?

na klar.
Auf ein Steckbrett mit Minimalbeschaltung
und einmal alle IOs durchschalten
Eingänge ähnlich, nur dass halt ein funktionierender Ausgang ne LED 
anschaltet, wenn er funktioniert.
die ADCs könnte man ähnlich testen.
alle Eingänge den gleichen Widerstand messen lassen und das Ergebnis auf 
10 LEDs ausgeben.

Autor: bom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke, dass der Controller hinüber ist. Hab grad die IOs getestet 
und einige PINs scheinen nicht mehr zu funktionieren.
Ich werde mir demnächst einen neuen Controller besorgen und es dann 
nochmal testen.
Auf jeden Fall vielen Dank für eure schnelle Hilfe! Ist wirklich ein 
super Forum.
Wenn es mit dem neuen Controller immer noch nicht klappt, dann macht 
euch auf weitere Fragen gefasst :)
Grüße

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.