PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : at90can128 pins auslesen



hugo1234
21.11.2008, 12:58
Hallo,

ich bin dabei die PINS 0 und 1 des Ports F auszulesen. An diesen Pins kann entweder 0 oder 4,99 Volt anliegen. Leider ohne jeglichen erfolg bislang.
Nachfolgend der Code den ich verwendet habe:



#include <inttypes.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "uart/uart.h"

#define F_CPU 16000000
/* 9600 baud */
#define UART_BAUD_RATE 9600

void blinkLED()
{
DDRB = (1 << DDB7);
_delay_ms(10);
DDRB &= ~( 1 << DDB7 );
_delay_ms(10);
}

int main(void)
{
uint8_t bPortF0, bPortF1;

// Pin0 und Pin1 des PortF auf Eingang
DDRF = ( (0 << DDF0) | (0 << DDF1) );
//DDRF = 0x00;

//PORTF |= (1<<PF0) | (1<<PF1); /* internen Pull-Up an PC7 aktivieren */

uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );

sei();

while(1)
{
/*
if (PINF == 0x03)
{
uart_puts("Aus");
blinkLED();
}
*/

bPortF0 = PINF;
bPortF1 = PF1;

//sscanf(msg, "PortF: ", bPortF0);
uart_putc(bPortF0);
blinkLED();
//uart_putc(bPortF1);
//uart_putc((unsigned char) bPortF1);
//blinkLED();
//_delay_ms(5000);
// 1sek Verzoegerung
_delay_ms(800000);
}
return 0;
}


Wenn ich PF0 oder PF1 ausgebe, bekomm ich nur die Pin Nummer raus.
Wenn ich PINF ausgebe bekomme ich jedes mal andere Werte.

Wie kann ich nun diese zwei Pins auslesen und bestimmen, an welchem Spannung anliegt?

Gruß Hugo1234

Viktor
21.11.2008, 14:21
hallo,
möchtest du analoges Signal messen oder ein digitales?

also wenn du nur bestimmte Portpins auslesen möchtest, dann geht das so:


if(PINF & (1<<PF0)){ //hier wird abgefragt ob der PF0=1 ist
//mach irgendwas
}

sonst:

if(!(PINF & (1<<PF0))){ //hier wird abgefragt ob der PF0=0 ist
//mach irgendwas
}

und zu deiner blinkLED() Funktion...
mit

DDRB = (1 << DDB7);
_delay_ms(10);
DDRB &= ~( 1 << DDB7 );
_delay_ms(10);
änderst du nur die "Richtung" des Signals, d.h. du schaltest die Pins als Ausgang und nach 10ms wider als Eingang.

Du müsstest am besten den entsprechenden Pin mit DDRB|=(1<<PB7); in der main zuvor initialisieren und dann kannst du mit PORTB|=(1<<PB7); den Pin auf 1 bzw. mit PORTB&=~(1<<PB7); wieder auf 0 setzen.

hugo1234
21.11.2008, 14:28
Hi,

also ich hab an den Pins folgende kombinationen anliegen:
0V und 0V
0V und 5V
5V und 0V
5V und 5V
die sind abhängig von einem Schalter.

Eigentlich will ich nur wissen was an welchem Pin anliegt und dies mit dem geringsten Aufwand. Ich hab auch noch selbst gesucht und folgendes Makro gefunden: _BV( PF0 )
Kann ich damit was anfangen oder nicht?

Viktor
21.11.2008, 14:32
natürlich! es ist nichts anderes als (1<<PF0) nichts anderes.

ein kleiner Tipp neben bei :cheesy: ...man muss ja andere nicht unnötig verwirren.
Wenns nur um einen Binären zustand des Pins geht, dann spricht man von einem 1 Signal bzw. 0 Signal, oder auch high bzw. low Pegel

hugo1234
21.11.2008, 14:39
Ok, und wenn ich ohne die bitverschiebung auf den pin zugreife bekomm ich nur die pinnummer raus. ist das so richtig?

Viktor
21.11.2008, 14:49
du muss schon sagen was du damit meinst.

ACHTUNG: bei den Beispielen oben, habe ich einen Fehler gemacht.
Ich hatte if(PINF & (PF0)) anstatt if(PINF & (1<<PF0)) geschrieben!

hugo1234
21.11.2008, 14:51
Ich hab das Problem, dass ich nicht den Wert ( also low oder high ) auslesen kann. Ich bekomm immer nur die pinnummer also bei Pin 0 eine 0, bei Pin 1 eine 1 und bei Pin 5 eine 5.

Verstehst was ich mein?

Viktor
21.11.2008, 15:20
mit bPortF0 = PINF; wird der komplette Port gelesen, im ideal Fall, wenn alle Pins als Eingang geschaltet sind, bekommst du die Werte wie 1 bei angesteuerten Pin PF0, 2 bei PF1, 4 bei PF2 ...usw. wenn du die Pins einzeln Ansteuerst!

mit bPortF1 = PF1; bekommst du immer den Wert 1, da PF1 ein Makro ist und nichts anderes als 1 bedeutet.

hugo1234
21.11.2008, 15:24
aha solangsam versteht ich. danke. ich werd deine vorschläge mal testen.