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: > Wie gesagt sind nur PC6, PC5, PC4 und PB2 tatsächlich auf 5V und der > Rest bei 1,4V. Zeig dochmal den Schaltplan. Peter
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.