- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: at90can128 pins auslesen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2008
    Beiträge
    14

    at90can128 pins auslesen

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    #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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    17.02.2005
    Ort
    Westerkappeln
    Alter
    40
    Beiträge
    88
    hallo,
    möchtest du analoges Signal messen oder ein digitales?

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

    Code:
    if(PINF & (1<<PF0)){ //hier wird abgefragt ob der PF0=1 ist
       //mach irgendwas
    }
    sonst:
    Code:
    if(!(PINF & (1<<PF0))){ //hier wird abgefragt ob der PF0=0 ist
       //mach irgendwas
    }
    und zu deiner blinkLED() Funktion...
    mit
    Code:
       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.
    "Wenn unsere berechnungen versagen, nennen wir es Zufall." Albert Einstein

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2008
    Beiträge
    14
    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?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    17.02.2005
    Ort
    Westerkappeln
    Alter
    40
    Beiträge
    88
    natürlich! es ist nichts anderes als (1<<PF0) nichts anderes.

    ein kleiner Tipp neben bei ...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
    "Wenn unsere berechnungen versagen, nennen wir es Zufall." Albert Einstein

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2008
    Beiträge
    14
    Ok, und wenn ich ohne die bitverschiebung auf den pin zugreife bekomm ich nur die pinnummer raus. ist das so richtig?

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    17.02.2005
    Ort
    Westerkappeln
    Alter
    40
    Beiträge
    88
    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!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2008
    Beiträge
    14
    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?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    17.02.2005
    Ort
    Westerkappeln
    Alter
    40
    Beiträge
    88
    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.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    18.11.2008
    Beiträge
    14
    aha solangsam versteht ich. danke. ich werd deine vorschläge mal testen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen