Forum: Mikrocontroller und Digitale Elektronik STK500, tiny13 und der PB4


von BastelOpa (Gast)


Lesenswert?

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

von Achim K. (aks)


Lesenswert?

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.

von BastelOpa (Gast)


Lesenswert?

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

von LostInMusic (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von BastelOpa (Gast)


Lesenswert?

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

von Achim K. (aks)


Lesenswert?

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

von Achim K. (aks)


Lesenswert?

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ß ...

von LostInMusic (Gast)


Lesenswert?

>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.

von BastelOpa (Gast)


Lesenswert?

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

von Sim (Gast)


Lesenswert?

Ändern Anschluss auf SCKT36001A!

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
Noch kein Account? Hier anmelden.