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???
Max Stephany schrieb: > loop: SBIS PORTD,0 > RJMP loop Wie wärs, den Input statt dem Output zu nehmen? Peter
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!
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.