Hallo, Ich habe hier ein STK500 mit einem ATtiny13 und die ersten Versuche (LED zwischen Port und GND) erfolgreich abgeschlossen. Als nächstes habe ich zwei LEDs antiparallel mit einem gemeinsamen 150Ohm-Widerstand auf einem Steckbrett zusammengesteckt und mit den Ports PB0 und PB1 des Erweiterungsanschlusses verbunden. Nun habe ich folgendes Programm erstellt und erfolgreich in den tiny geschrieben: #define F_CPU 1200000 #include <avr/io.h> #include <util/delay.h> int main(void) { int dauer = 1000; while(1) { // LED A on DDRB = 0b00000001; PORTB = 0b00000000; _delay_ms(dauer); // LED B on DDRB = 0b00000010; PORTB = 0b00000000; _delay_ms(dauer); } } Als "Belohnung" bekomme ich einen Wechselblinker im Sekundentakt. Funktioniert prima. Wenn ich auf die gleiche Weise PB0 und PB2 oder auch PB0 und PB3 probiere, klappt das ebenfalls. Wenn ich nun aber PB0 und PB4 benutzen will, dann blinkt nur die LED an PB4, die andere LED bleibt dunkel. Meine Frage dazu: Ist dies nun ein spezielles Verhalten meines Boards und/oder MCs oder kann jemand dieses Verhalten bestätigen ? Natürlich interessiert mich, warum es zwischen diesen Ports nicht wechselblinkt? Vielen Dank und viele Grüsse Paul
BastelOpa schrieb: > DDRB = 0b00000001; > DDRB = 0b00000010; Damit schaltet man die PINs zwischen Ausgang und Eingang "hin und her". Normalerweise würde man die PINs einamlig zu Beginn (vor der while Schleife) als Ausgang konfigurieren
1 | DDRB = 0b00000011; |
und dann den Ausgang (in der while Schleife) schalten
1 | PORTB = 0b0000001; |
2 | ... |
3 | PORTB = 0b0000010; |
Ob das allerdings Dein Problem löst, weiß ich nicht.
Moin Achim, deine Bemerkung ist völlig korrekt, hat aber nichts mit meiner Frage (Warum verhält sich PB4 mit PB0 anders als bspw. PB2 mit PB0 ?) zu tun. Viele Grüsse Paul
Ich sehe keinen logischen Grund, warum sich PB4 abweichend verhalten sollte, und kann die Ursache deshalb nur in irgendeinem ernsthaften Hardwaredefekt vermuten: PB4 kaputt bei Deinem Controllerexemplar oder die PB4-Route auf Deinem STK500? Fehler in der Verdrahtung? Das würde ich alles mal akribisch durchprüfen.
Hi Mess mal nach, ob PB4 beim ATTiny13 überhaupt mit PORTB4 verbunden ist. Wenn nicht müsste PB4 mit XTAL2 von PortE verbunden sein. MfG Spess
Hi Spess, der tiny steckt im Sockel 3400D1. Ich habe mit dem Durchgangsprüfer kontrolliert, ob das dritte Beinchen (also PB4) mit dem Erweiterungsanschuss PB4 verbunden ist. Das ist der Fall. Hast du zufällig ein STK500 und einen tiny13 und könntest das Verhalten nachvollziehen ? Übrigens, ein einfacher Blinker mit PB4 und GND (beides über den Erweiterungsanschluss mit der LED plus Widerstand auf dem Steckbrett vebunden) funktioniert, also ist doch ein prinzipielles Kontaktproblem auszuschließen, oder ? Viele Grüsse Paul
BastelOpa schrieb: > Moin Achim, > deine Bemerkung ist völlig korrekt, hat aber nichts mit meiner Frage > (Warum verhält sich PB4 mit PB0 anders als bspw. PB2 mit PB0 ?) zu tun. > > Viele Grüsse > Paul Hallo Paul, ich habe Deine Frage so verstanden, dass Du PB0 und PB4 jeweils einzeln Blinken lassen kannst, nur nicht zusammen. Also kann Deine Hardware die beiden LEDs richtig ansteuern und ist somit wohl eher nicht defekt. Mein Gedanke war, dass dann Dein Code halt etwas "Merkwürdiges" macht. Daher wollte ich einfach darauf Hinweisen, was Dein Code macht und wie ich denke, dass man normalerweise LEDs blinken lässt. Vielleicht hast Du ja Lust, das Programm mit PB0/4 auch zu posten, nicht dass es nur ein Vertipper ist. Seine eigenen übersieht man ja leider immer viel eher, als die anderer :-). Ich selbst habe leider keinen ATTiny13 und kann es daher nicht selber testen. Gruß Achim
Einen Tipp hätte ich noch. "Manchmal blinkt der Reset" :-). Daher, ändere das Programm so, dass es zu Beginn 3x LED PB0 blinken lässt und dann erst mit dem eigentlichen Wechselblinken beginnt. Vielleicht sieht man ja dann, ob es unerwartet Resets gibt. Falls sich zeigen sollte, dass es sich um Resetprobleme handelt, dann müsstest Du die Reset/PB5 Beschaltung prüfen. Zumindest am PORTB Header liegend die PB4 und 5 beieinander. Wer weiß ...
>Als "Belohnung" bekomme ich einen Wechselblinker im Sekundentakt. Ja, aber unverdient. Der Grund, warum Dein Programm seinen beabsichtigten Zweck erfüllt, obwohl es das eigentlich gar nicht kann (*) ist ein durch die STK500-interne ISP-Treiberstufe bedingter Seiteneffekt: Bei aufgestecktem ISP-Kabel (hier zwischen den Plugs ISP6PIN und SPROG1) sind zwei der Programmierpins über je einen 1k-Widerstand mit VCC verbunden, und einer über einen 47k-Widerstand. Das geht aus dem Schaltplan des STK500 hervor. Über diese Widerstände fließen die Ströme, die Deine LEDs leuchten lassen. Zieh also mal das ISP-Kabel ab, damit Dein Programm das tun kann, was sein Code vorschreibt, nämlich keine LED an keinem Pin zum Leuchten bringen. (*) Das kann es nicht, weil in jeder der beiden Blinkphasen einer der Pins auf DDR=0 und PORT=0 gesetzt ist. Damit ist dieser Pin als Input konfiguriert (genauer: Input OHNE aktivierten internen Pullup-Widerstand), und in diesem Zustand kann dieser Pin weder Strom sourcen noch sinken. Wenn Du möchtest, dass Deine LEDs auch mit abgezogenem ISP-Kabel blinken, dann machs richtig:
1 | int main(void) |
2 | {
|
3 | int dauer = 1000; |
4 | DDRB = 0b00000011; /* oder 0b00010001 */ |
5 | while(1) |
6 | {
|
7 | // LED A on |
8 | PORTB = 0b00000001; |
9 | _delay_ms(dauer); |
10 | |
11 | // LED B on |
12 | PORTB = 0b00000010; /* oder 0b00010000 */ |
13 | _delay_ms(dauer); |
14 | } |
15 | } |
Hier sind die beiden LED-Pins immer Output, nur wechselseitig auf L/H-Pegel. Wenn Du dieses Programm entsprechend der auskommentierten Werte abänderst, funktioniert es anstandslos auch mit dem Pinpaar PB0 und PB4.
Moin zusammen, erstmal die gute Nachricht, nun funktionierts :-) Nachdem ich auf Anregung vom Achim nochmal alles abgebaut, neu aufgebaut, neu nachgeschaut, nachgelesen und - ganz wichtig - den programmierten tiny nach den Brennen raus aus dem STK und direkt auf das Steckbrett gesetzt, funktionierte nach der Teillösung nun auch das ursprüngliche Projekt ‚Lauflicht‘. Jetzt in der Rückschau und dank dem ausgezeichneten Beitrag von ‚LostInMusic‘ klärt sich alles auf. Begonnen hatte es ja damit, dass ich ein im Netz gefundenes Lauflicht einfach so nachbauen wollte. Aber es funktioniert eben nicht, besser gesagt, es lief zwar ein ‚Lichtpunkt‘ durch die LEDs, aber es leuchteten immer noch ein oder mehrere LEDs schwach mit. Im Text stand noch irgendwas von einem Tri-State bei den Eingängen, also lief ich bei der Suche nach dem Fehler vollends in die falsche Richtung … Hätte ich das ganze Projekt nicht mit dem STK probiert, bzw. wie ‚LostInMusic‘ geschrieben, gewusst, wie das STK intern verdrahtet ist, wäre ich beizeiten fertig gewesen. Viele Grüße und vielen Dank an alle, die sich beteiligt haben Paul
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.