mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny2313 reagiert nicht auf Eingangssignal


Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Stephany schrieb:
> loop: SBIS  PORTD,0
>       RJMP  loop

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


Peter

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also: SBIS PIND,0

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok so ist das also, danke dir!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.