Kaiser-F
04.02.2005, 12:00
Hallo,
Ich möchte gern meinen AVR dazu benutzen eine Regelung zu machen.
Dazu muss ich mehrere Potis einlesen in nur einen µC.
Ich hab mir das so vorgestellt:
Vcc
|
C1: 100nF
|
+---(R2 220)---->µC
|
|
Poti 10K
|
-
GND
Dazu muss der Pin am µC als Ausgang auf HING gesetzt werden.
Dadurch dass an C1 nun an beiden Seiten +5V anliegen, wird dieser entladen.
Schaltet man nun den Pin des µC als Eingang, so wird C1 über das Poti geladen.
Nach einer bestmmten Zeit unterschreitet die Spannung am Pin des µC die "schwellspannung von ca. 2.2V und der µC hat ein LOW auf seinem Eingang.
Diese Methode habe ich aus einer Anleitung herausgelesen und hoffentlich richtig interpretiert.
Leider weiss ich nochnicht wie ich einen Pin des µC als Eingang und gleichzeitig als Ausgang benutzen kann.
in der anleitung ging es mit dem Befehl "__mmio" (Memory mapped I/O)
Das will der Compiler aber nicht, sagt immer error.
hier mal mein Code (Verwendet wurde pin 0 von Port A):
#include <io.h>
typedef unsigned short WORD;
typedef unsigned char BYTE;
int main (void)
{
volatile WORD x;
register WORD y;
// Portpin auf Ausgang setzen.
__mmio (DDRA) = __mmio (DDRA) | (1 << 0);
// Portpin auf HIGH setzen
__mmio (PORTA) = __mmio (PORTA) | (1 << 0);
// Kondensator entladen, indem der Ausgang auf HIGH (Vcc) gesetzt wird.
for (x=0; x<50;) x++ /* Zaehlen */;
y = 0;
// Portpin auf Eingang schalten.
__mmio (DDRA) = __mmio (DDRA) & ~(1 << 0);
/* Zaehlschleife.
Wir zaehlen y so lange hoch bis der Kondensator unter die
Schwellwertspannung geladen ist. */
while (__mmio (PINA) & (1 << 0) && y < 65535) y++;
// Zählerwert zurückgeben
return y;
}
Kann von euch jemand evtl den Fehler finden?
Oder mir eine einfachere Programmvariante nennen?
Ich hab schon das ganze Forum durchstöbert und konnte leider nichts treffendes finden.
Ich möchte gern meinen AVR dazu benutzen eine Regelung zu machen.
Dazu muss ich mehrere Potis einlesen in nur einen µC.
Ich hab mir das so vorgestellt:
Vcc
|
C1: 100nF
|
+---(R2 220)---->µC
|
|
Poti 10K
|
-
GND
Dazu muss der Pin am µC als Ausgang auf HING gesetzt werden.
Dadurch dass an C1 nun an beiden Seiten +5V anliegen, wird dieser entladen.
Schaltet man nun den Pin des µC als Eingang, so wird C1 über das Poti geladen.
Nach einer bestmmten Zeit unterschreitet die Spannung am Pin des µC die "schwellspannung von ca. 2.2V und der µC hat ein LOW auf seinem Eingang.
Diese Methode habe ich aus einer Anleitung herausgelesen und hoffentlich richtig interpretiert.
Leider weiss ich nochnicht wie ich einen Pin des µC als Eingang und gleichzeitig als Ausgang benutzen kann.
in der anleitung ging es mit dem Befehl "__mmio" (Memory mapped I/O)
Das will der Compiler aber nicht, sagt immer error.
hier mal mein Code (Verwendet wurde pin 0 von Port A):
#include <io.h>
typedef unsigned short WORD;
typedef unsigned char BYTE;
int main (void)
{
volatile WORD x;
register WORD y;
// Portpin auf Ausgang setzen.
__mmio (DDRA) = __mmio (DDRA) | (1 << 0);
// Portpin auf HIGH setzen
__mmio (PORTA) = __mmio (PORTA) | (1 << 0);
// Kondensator entladen, indem der Ausgang auf HIGH (Vcc) gesetzt wird.
for (x=0; x<50;) x++ /* Zaehlen */;
y = 0;
// Portpin auf Eingang schalten.
__mmio (DDRA) = __mmio (DDRA) & ~(1 << 0);
/* Zaehlschleife.
Wir zaehlen y so lange hoch bis der Kondensator unter die
Schwellwertspannung geladen ist. */
while (__mmio (PINA) & (1 << 0) && y < 65535) y++;
// Zählerwert zurückgeben
return y;
}
Kann von euch jemand evtl den Fehler finden?
Oder mir eine einfachere Programmvariante nennen?
Ich hab schon das ganze Forum durchstöbert und konnte leider nichts treffendes finden.