Probleme Controller für die WordClock zu programmieren

Gast #1813416
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
Angehängte Dateien:
#1813484
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...
Gast #1813719
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
#1813857
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.
#1813862
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
Gast #1813924
@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!
#1813929
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.
Gast #1814095
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?
#1814099
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.
Gast #1814311
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.