Forum: Mikrocontroller und Digitale Elektronik Lichtschranke mit ATtiny13 (AVR)


von Christian G. (stivy)


Angehängte Dateien:

Lesenswert?

Hi Leute,
Ich habe bei folgendem Projekt ein Problem:

Zeil:
Ich möchte eine Lichtschranke mit Hilfe eines Mikroprozessorts (speziell 
dem ATtiny13) bauen, um damit später nach Erweiterung einzelne 
Kreuzungen meiner Eisenbahn zu steuern.

Aufbau:
Die Schaltung liegt im Anhang mit einem Foto meines Bau-Versuchs bei.

Problem:
Anfangs funktionierte mein ATtiny13 noch, als ich ihn nach einigen 
Versuchen in meiner Schaltung wieder heraus nahm (Erstes Hochladen des 
Programms hat also geklappt) und neu programmieren wollte, funktionierte 
das nicht mehr. Erst habe ich einfach einen neuen genommen, aber bei dem 
trat das Problem auch auf. Beim Hochladen des Bootloader zeigt das 
Programm noch "ok", beim Hochladen der HEX-Datei zeigt er jedoch direkt 
einen Fehler und anschließend läuft der ATtiny13 nicht mehr.
Meine erste Vermutung war, dass ich irgendwas falsch gepolt habe, 
allerdings finde ich nichts derartiges und das würde mich bei der 
Spannung auch wundern, wenn der dadurch kaputt geht. (Der Eingang ist 
mit Sicherheit richtig gepolt, denn ich habe die Platine synkron zur 
Programmierplatine angeschlossen.)

Weitere Auffälligkeiten:
Der ATtiny hat mit meinem Programm erst dann die LED ausgeschaltet, als 
ich den Eingang mit GND kurzgeschlossen habe.
Sowohl bei ca 0,45V als auch bei ca. 0,05V über dem Vorwiderstand des 
IR-Transistors leuchtete die LED.

Randinformationen:
Programm zum Hochladen des Codes: "LPmikros" aus dem Lernpaket 
"Mikrokontroller" von Franzis
IR-Diode (Lila): 
http://www.conrad.de/ce/de/product/153692/IR-EMITTER-SIDE-IRL81A
IR-Transistor (Weiß): 
http://www.conrad.de/ce/de/product/153470/IR-RECEIVER-LPT80AQ68000-A7852
Eingangsspannung: 5,02V Gleichstrom

Code:
1
  .include "tn13def.inc"
2
  .def  A = r16
3
  .def  B = r17
4
  .equ  TXD = 1
5
  .equ  RXD = 2
6
  rjmp  Anfang
7
8
;Anfang des Programms
9
Anfang:
10
  sbi    ddrb, TXD  ;PB1 als Ausgang
11
  rcall  AdcInit
12
  ldi    B, 10    ;ca. 0,2V
13
14
;Hauptschleife
15
Schleife:
16
  ldi    A, 2    ;Kanal2 (PB4) als Eingang
17
  rcall  RdADC    ;Lesen der Spannung an Kanal [A] in A
18
  cp    A, B    ;Vergleichen von A und B
19
  in    A, SREG
20
  sbrc  A, 0    ;Wenn B>A
21
  sbi    portb, 1  ;Ausgang einschalten
22
  in    A, SREG
23
  sbrs  A, 0    ;Wenn !(B>A)
24
  cbi    portb, 1  ;Ausgang ausschalten
25
  rjmp  Schleife
26
27
;Setzt die Uhr auf /8 und schaltet sie ein
28
AdcInit:
29
  ldi    A, 3
30
  out    ADCSRA, A
31
  sbi    ADCSRA, ADEN
32
  ret
33
34
;Liest die Spannung ein
35
RdADC:
36
  out    ADMUX, A
37
  sbi    ADMUX, ADLAR
38
  sbi    ADCSRA, ADSC
39
ADrdy: ;Schleife1
40
  sbic  ADCSRA, ADSC
41
  rjmp  ADrdy
42
  sbi    ADCSRA, ADSC
43
ADrdyb: ;Schleife2
44
  sbic  ADCSRA, ADSC
45
  rjmp  ADrdyb
46
  in    A, ADCH
47
  ret

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hmm der Schaltplan sieht anders aus als die aufgebaute Schaltung.

Auffallend ist im Schaltplan als erstes der fehlende Widerstand für die 
rote LED. Und die komische Einbaulage der roten LED: Anode an PB1 und 
Kathode mit Vcc verbunden, wie soll die jemals leuchten?

Andersrum und mit Vorwiderstand würde es Sinn machen als active low 
LED (leuchtet, wenn PB1 LOW ist). PB1 ---###---|<---- Vcc

Oder wenn die LED mit Vorwiderstand gegen GND active high geschaltet 
ist: PB1 ---###--->|---- GND Das passt zu den Kommentaren in deinem 
Programm.

Wie groß ist der Kollektorwiderstand am Fototransitor? Von den Ipce 
Werten im Datenblatt her (>0,25 mA, 3.2mA) wäre ein Widerstand zwischen 
20K und 2K zu überlegen.

1/ Was macht deine Schaltung, wenn der FT komplett abgedunkelt ist? 
Welche Spannung misst du zwischen PB4 und GND? Das sollte fast die volle 
Vcc Pracht sein, weil der FT sperrt und nur ein geringer Dunkelstrom 
fließt.

2/ Was macht deine Schaltung, wenn der FT nicht abgedunkelt ist und 
Umgebungslicht auf den FT fällt? Welche Spannung misst du zwischen PB4 
und GND? Das wird etwas sein, aber nicht so viel wie im nächsten Fall

3/ Was macht deine Schaltung, wenn die IR-Diode (Lila) auf den FT 
leuchtet? Welche Spannung misst du zwischen PB4 und GND? Das sollte fast 
nix sein, der FT sollte bei Beleuchtung optimal leitend sein.

4/ Was macht deine Schaltung, wenn die IR-Diode (Lila) leuchtet, aber 
der Lichtweg auf den FT unterbrochen ist? Welche Spannung misst du 
zwischen PB4 und GND? Das sollte in Richtung von Fall 2/ gehen.

Deine Schwelle B im Programm muss einen Wert zwischen Fall 2/ bzw. 4/ 
und 3/ darstellen. Wenn der Messwert A sehr hohe Werte annimmt, ist Fall 
1/ eingetreten.

Im Programm selbst würde ich noch einen ADCH Wert einlesen:

;Liest die Spannung ein
RdADC:
  out    ADMUX, A
  sbi    ADMUX, ADLAR
  sbi    ADCSRA, ADSC
ADrdy: ;Schleife1
  sbic  ADCSRA, ADSC
  rjmp  ADrdy
  in    A, ADCH ; <<<<<<< Readout der 1. Wandlung
  sbi    ADCSRA, ADSC
ADrdyb: ;Schleife2
  sbic  ADCSRA, ADSC
  rjmp  ADrdyb
  in    A, ADCH ; <<<<<<< Readout der 2. Wandlung
  ret

von Christian G. (stivy)


Lesenswert?

Erstmal vielen Danke für die Antwort. :D

Das mit dem Vorwiderstand für die LED hab' ich leider vergessen 
einzuzeichnen. Den habe ich eingebaut, nachdem mir eine LED 
durchgebrannt ist.

Ob ich active Low oder active High habe ist mir vorerst egal, denn das 
kann ich ja in 2 Zeilen in meinem Code ändern.

Mit Kollektorwiderstand war Kollektorstrom gemeint, oder? Ausprobieren 
möchte ich das nicht so gerne, denn mir geht schließlich bisher bei 
jedem Versuch ein Mikroprozessor kaputt.
Die Widerstände haben allerdings alle einen Wert von 1 Kilo-Ohm.

1/ Ausprobieren wie gesagt nicht gerne und komplett abgedunkelt habe ich 
leider nicht. Aber grundsätzlich ... Wenn die IR-Diode auf den 
IR-Transistor scheint, dann hat der Vorwiderstand des IR-Transistors wie 
oben genannt ca. 0,5V und wenn nicht beschienen weniger als 0,1V. Da der 
ATtiny mit Vcc -> PB4 dazu parallel liegt müsste demnach dort die 
gleiche Spannung und über PB4 -> GND 5,02V minus die jeweilige Spannung 
anliegen, oder irre ich mich da?

2/ s. 1/

3/ s. 1/

4/ Ja, die Fälle 4 und 2 sind gleich. Da bin ich mir sicher, da es mir 
ein Mal passiert ist, dass die IR-Diode leicht krumm stand und ich das 
Andere ausprobiert habe.

Da ich ja 0,2V eingestellt habe, liegt dieser somit zwischen 0,1V und 
0,5V.

Den Code zum Einlesen (RdADC) sowie AdcInit habe ich aus einem Beispiel 
aus dem Buch entnommen, deshalb ist der auch nicht weiter kommentiert. 
Sollte also eig. so funktionieren.

Wenn ich weiß, wieso meine ATtinis immer nicht mehr beschrieben werden 
können, kann ich auch weiter probieren. Das Problem ist halt eben, dass 
ich nicht weiß, wieso das immer passiert. Ich habe nicht iwo eine zu 
hohe Spannung oder einen zu hohen Strom anliegen oder so, oder???

von MarioT (Gast)


Lesenswert?

Wenn das Programm hochgeladen wird, darf der Reset aber nicht auf Masse.

von Christian G. (stivy)


Lesenswert?

Das hatte ich auch nicht.

Aber trotzdem danke.

von MarioT (Gast)


Lesenswert?

Also wenn Du Dein Programm drauf spielst zeigt er Fehler?
Hast Du mal probiert, den Bootloader (mit Reset an Masse) neu 
draufzuspielen?

von Christian G. (stivy)


Lesenswert?

Ja, habe ich.
Bei dem Ersten Prozessor will auch das nicht mehr, beim 2. geht es noch 
(laut Meldung -> "ok").
Der Erste kann aber auch einige andere Fehler aufweisen, da ich ihn 
nicht immer ganz richtig angeschlossen habe.

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.