PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PIN Abfrage am Mikrocontroller ATMega32 mit Jumper



Jasmin13
17.04.2013, 15:08
Ich möchte folgendes auf dem Display anzeigen:

Wenn Jumper auf PB.. dann zeige .....

Wenn Jumper weg von PB.. dann zeige einen anderen Text auf dem Display. Auf dem besagten Port befindet sich ein 2-poliger Jumper, eine Leitung geht auf den Mikroprozzessor und die andere Leitung geht auf GND.

wie muss denn die Funktion dazu aussehen?

Mein Ansatz ist eine if else Abfrage, bin ich damit auf dem richtigen Weg?

Danke für eure Hilfe.

robocat
17.04.2013, 15:52
- Deinen PB.. als Eingang setzen (das ist normalerweise beim Start des Programms bereits der Fall)
- Den Pullup Widerstand (im µC integriert) aktivieren:

// pullup für PB3
PORTB=(1<<3);

Durch den Pullup Widerstand liegt der Pin nun etwa auf Betriebsspannung und ist damit logisch 1. Wird der Taster gedrückt (bzw dein Jumper gesetzt), wird der Pin auf GND gezogen und wird damit logisch 0.
Das kann man abfragen, zB mit:

while(1) // endlosschleife
{
// tasterabfrage
if(PINB&(1<<3)==0)
{
// zeige auf display dass jumper da
}
else
{
// zeige auf display dass jumper weg
}
}

Grüße von der Katze

oberallgeier
17.04.2013, 16:45
... Das kann man abfragen, zB mit: ...Bei meiner (Programmiersprachen-) Leseschwäche sieht das deutlich aufwändiger aus, aber ich komme damit besser zurecht.

Hier ein Beispiel für zwei Jumper auf PB6 und PB7. Wichtig im Code ist nur die Zeile nach "// Anwendung im Code". Wie gesagt, mehr Aufwand, ich lese das besser.


// Ports+Pins als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
// A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
DDRB = 0b00111111; // siehe aktuell oben
PORTB = 0b11000000; // und Port/Pull Ups (1) aktivieren
// ...
#define IsBitSet(ADDR,BIT) (((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1?
#define IsBitClr(ADDR,BIT) (!((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1?
// ...
// - - - - - - - - - - - - - - - -
#define JUMPER_PORT PINB //
#define JMP_6 6 //
#define JMP_7 7 //
// ...
// - - - - - - - - - - - - - - - -
#define JUMPER6_an IsBitClr (JUMPER_PORT, JMP_6) // Jumper 6 gesetzt ??
#define JUMPER6_aus IsBitSet (JUMPER_PORT, JMP_6) // Jumper 6 gelöst ??
// ...
// - - - - - - - - - - - - - - - -
// Anwendung im Code
if (JUMPER6_an) tu_das(); // Aktion wenn Jumper gesetzt ist

// ================================================== ============================ =
// Ein Beispiel bei einer sinngemäßen Tastenanwendung in einem meiner Codes
if ( Taste1_an )
{ //
SetBit ( PrtLED, L1r ); // Zünde rote LED, sobald Taste gedrückt
while ( Taste1_an ) {} // warten, bis Taste1 gelöst ist
ClrBit ( PrtLED, L1r ); //
wms ( 100); //
u0st1(); // RX-Tx-UART0(PD) zum Einstellen rUn
wms ( 10); // Wait
SrvTST_06 (); // Servo 1 mit Verzögerung testen r1n
} // Ende if ( Taste1_an ) ...

Jasmin13
27.04.2013, 07:24
Danke robocat, leider funktioniert es nicht, weil ich noch irgendwie einen internen Pull-Up aktivieren muss, aber ich weiss nicht genau wie das funktioniert und welchen ich aktivieren muss.

HeXPloreR
27.04.2013, 07:44
Hallo,

Du musst den betreffenden Eingang in Bascom zum Beispiel auf "PortB.1 = 1 " setzen. Da es ein Eingangspin ist, wird hier damit der Pullup aktiviert. Wenn es ein Ausgang ist - was man je vorher festlegen muss wie robocat schon fetsstellte - dann wird der Port die Betriebsspannung führen.

Im Programm wird dann nur noch geprüft ob der "Jumper" ( genausso wie ein Taster) gegen GND zieht und dementsprechend etwas ausgeführt. Bei Jumpern ist es ja so das man da nicht ständig zieht und steckt...also kann man das vor der Hauptschleife einmalig abfragen, es sei denn es findet ein wechsel statt dann muss (auch) im Hauptprogramm irgendwie bearbeitet werden.

Ich denke Dein Ansatz bzw auch der von robocat ist schon okay.

So habe ich letztens meine Alarmanlage modifiziert, dort stellt man jetzt über Pianoschalter ein wie viele Sensoren aktiviert werden sollen bzw wieviel LED in der Anzeige leuchten.