Forum: Mikrocontroller und Digitale Elektronik ATTiny2313 reagiert nicht auf Eingangssignal


von Max S. (masterjekkt)


Lesenswert?

Mittag,

Ich habe ein sehr ungewöhnliches Problem mit einem ATTiny2313. Ich bin 
an einem Projekt dran das sich mit einer Zentralsteuerung für 
Modellschiffe befasst. Das Board ist fertig geätzt und bestückt. Nur 
eine der Funktionen meines uC's scheint nicht zu klappen, ich möchte 
einen Kran auf dem Modellschiff ansteuern, wobei der Kontroller auf ein 
periodisches Signal vom Empfänger reagieren soll (nur tut er genau dies 
nicht) um den Kran einzuschalten. Das Signal ist von 3V auf 5V per 
Optokoppler verstärkt, eine Periode beträgt 50ms, der "1" Zustand wenn 
ich den Kran per Fernsteuerung einschalte ist 1ms lang. Der Kontroller 
soll den pin auf genau 1ms abfragen und dann den Kran einschalten.

Der Empfänger ist an Pin2 angeschlossen, d.h. Bit0 von PortD (der 
Empfänger vom USART wird ja nicht benutzt).

Teil des Programmcodes:

Ports definieren:

LDI  temp, 0xF2
OUT  DDRD, temp

Abfragen des Pins (zum Test wird eine 6V Glühbirne anstelle vom Kran 
geschaltet. Eingeschaltet wird nur beim erkennen des "1" Zustandes, also 
kein 1ms Test):

loop: SBIS  PORTD,0
      RJMP  loop

SBI  PORTD,1

Das ganze habe ich im AVR Studio 4 simuliert und da klappts. Mit nem 
Oszillo und Logic analyzer hab ich nachgemessen, das Signal liegt 
korrekt an Pin 2 an. Dieser Pin ist ja nichts weiteres als ein normaler 
I/O Pin und wenn das Programm in der Simulation funzt kapier ich nicht 
wieso der Kontroller in der Praxis nicht auf ein normales 5V Signal 
reagiert???

von Peter D. (peda)


Lesenswert?

Max Stephany schrieb:
> loop: SBIS  PORTD,0
>       RJMP  loop

Wie wärs, den Input statt dem Output zu nehmen?


Peter

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Also: SBIS PIND,0

von Max S. (masterjekkt)


Lesenswert?

Irgendwie versteh ich das jetzt gar nicht mehr, obwohl ich das vorher im 
Hauptprogramm versucht hatte ging es nicht. Jetzt scheint sich das Blatt 
gewendet zu haben, danke sehr!

von Max S. (masterjekkt)


Lesenswert?

Habe jedoch noch eine Frage dazu. Das PortX Register ist doch 
Input/Output. Warum kann ich trotzdem nicht so einlesen? Oder hat das 
was damit zu tun dass nicht der ganze Port als Eingang benutzt wird?

von spess53 (Gast)


Lesenswert?

Hi

>Habe jedoch noch eine Frage dazu. Das PortX Register ist doch
>Input/Output. Warum kann ich trotzdem nicht so einlesen? Oder hat das
>was damit zu tun dass nicht der ganze Port als Eingang benutzt wird?

Das Port-Register hat zwei Funktionen:

Wenn ein Pin als Eingang konfiguriert schaltet das entsprechende Bit im 
Portregister den Pull-Up-Widerstand des Pins.

Als Ausgangspin konfiguriert wird der Pegel des Pins mit dem Bit 
festgelegt.

Du kannst aus dem Portregister nur den Wert lesen, den du selbst 
reingeschrieben hast.

MfG Spess

von Max S. (masterjekkt)


Lesenswert?

Ok so ist das also, danke dir!

von Michael U. (amiga)


Lesenswert?

Hallo,

Max Stephany schrieb:
> Habe jedoch noch eine Frage dazu. Das PortX Register ist doch
> Input/Output. Warum kann ich trotzdem nicht so einlesen? Oder hat das
> was damit zu tun dass nicht der ganze Port als Eingang benutzt wird?

Nein, hat nur mit dem zutun, was Atmel ins Datenblatt des AVR 
geschrieben hat.

Das Register an der Adresse von PortX schreibt den Zustand der Pins, 
wenn sie Ausgang sind oder den Zustand der PullUps, wenn das Bit Eingang 
ist.
Aus dem PortX-Register wird immer das gelesen, was drinsteht, also mal 
von Dir reingeschrieben wurde.

Das Register an der Adresse von PinX liest immer den Zustand der Pins, 
egal, ob die Eingang oder Ausgang sind.

Schreiben in PinX bewirkt entweder garnichts (mur-Lese-Register, ältere 
AVR) oder es toggelt den Zustand des Bits, wenn es Ausgang ist.

DDR bestimmt die Datenrichtzng, also Ausgang/Eingang.

Es sind also 3 Register, die zu einem Port gehören und die verschiedene 
Adressen haben.

PORTx, PINX und DDRx sind ja letztlich nur symbolische Namen für die 
I/O-Adressen.

Gruß aus Berlin
Michael

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.