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
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...
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
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.
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
@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!
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.
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.
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.
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?
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.
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
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.